Nginx模块开发 从url变量中key的值 来确定upstream服务器

源文件(从Miller的文件修改而来)

 

 

/*

 * Hash a variable to choose an upstream server.

 *

 * Copyright (C) Evan Miller

 *

 * This module can be distributed under the same terms as Nginx itself.

 */

 

 

#include <ngx_config.h>

#include <ngx_core.h>

#include <ngx_http.h>

 

ngx_int_t ngx_http_hi_upstream_module_init(ngx_conf_t *cf);

 

#define ngx_bitvector_index(index) index / (8 * sizeof(uintptr_t))

#define ngx_bitvector_bit(index) (uintptr_t) 1 << index % (8 * sizeof(uintptr_t))

 

typedef struct {

    struct sockaddr                *sockaddr;

    socklen_t                       socklen;

    ngx_str_t                       name;

} ngx_http_upstream_hash_peer_t;

 

typedef struct {

    ngx_uint_t                        number;

    ngx_http_upstream_hash_peer_t     peer[0];

} ngx_http_upstream_hash_peers_t;

 

typedef struct {

    ngx_http_upstream_hash_peers_t   *peers;

    ngx_uint_t                        hash;

    ngx_str_t                         current_key;

    ngx_str_t                         original_key;

    ngx_uint_t                        try_i;

    uintptr_t                         tried[1];

} ngx_http_upstream_hash_peer_data_t;

 

 

static ngx_int_t ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,

    ngx_http_upstream_srv_conf_t *us);

static ngx_int_t ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc,

    void *data);

static void ngx_http_upstream_free_hash_peer(ngx_peer_connection_t *pc,

    void *data, ngx_uint_t state);

static char *ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd,

    void *conf);

static ngx_int_t ngx_http_upstream_init_hash(ngx_conf_t *cf,

    ngx_http_upstream_srv_conf_t *us);

static ngx_uint_t ngx_http_upstream_hash_crc32(u_char *keydata, size_t keylen);

 

// 获得URL参数

static ngx_int_t  ngx_http_key_index;

static ngx_str_t  ngx_http_key_value = ngx_string("key");

ngx_http_variable_value_t      *key_vv;

 

static ngx_int_t

ngx_http_hi_upstream_module_variable_not_found(ngx_http_request_t *r,

        ngx_http_variable_value_t *v, uintptr_t data)

{

    v->not_found = 1;

    return NGX_OK;

}

 

static ngx_int_t

ngx_http_hi_upstream_module_add_variable(ngx_conf_t *cf, ngx_str_t *name) {

    ngx_http_variable_t         *v;

 

    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);

    if (v == NULL) {

        return NGX_ERROR;

    }

 

    v->get_handler = ngx_http_hi_upstream_module_variable_not_found;

 

    return ngx_http_get_variable_index(cf, name);

}

 

// 指令声明,既确定了他们在哪里生效又确定了一旦流程遇到指令将要调用什么函数。

// load-balancer的指令需要置NGX_HTTP_UPS_CONF标志位,

// 以便让Nginx知道这个指令只会在upstream块中有效。

// 同时它需要提供一个指向注册函数的指针。下面列出的是upstream_hash模块的指令声明

// 第一步

static ngx_command_t  ngx_http_upstream_hash_commands[] = {

    { ngx_string("hash"),

      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,

      ngx_http_upstream_hash,

      0,

      0,

      NULL },

 

      ngx_null_command

};

 

 

static ngx_http_module_t  ngx_http_hi_upstream_module_ctx = {

    NULL,                                  /* preconfiguration */

    ngx_http_hi_upstream_module_init,               /* postconfiguration 从配置文件中读取key定义 */

 

    NULL,                                  /* create main configuration */

    NULL,                                  /* init main configuration */

 

    NULL,                                  /* create server configuration */

    NULL,                                  /* merge server configuration */

 

    NULL,                                  /* create location configuration */

    NULL                                   /* merge location configuration */

};

 

//////////////////////

//     定义模块              //

//////////////////////

ngx_module_t  ngx_http_hi_upstream_module = {

    NGX_MODULE_V1,

    &ngx_http_hi_upstream_module_ctx,    /* module context */

    ngx_http_upstream_hash_commands,       /* module directives */

    NGX_HTTP_MODULE,                       /* module type */

    NULL,                                  /* init master */

    NULL,                                  /* init module */

    NULL,                                  /* init process */

    NULL,                                  /* init thread */

    NULL,                                  /* exit thread */

    NULL,                                  /* exit process */

    NULL,                                  /* exit master */

    NGX_MODULE_V1_PADDING

};

 

// upstream 初始化函数的目的是,解析主机名,为socket分配空间,分配(另一个)回调函数。

// 下面是upstream_hash:

// 第三步

static ngx_int_t

ngx_http_upstream_init_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)

{

    ngx_uint_t                       i, j, n;

    ngx_http_upstream_server_t      *server;

    ngx_http_upstream_hash_peers_t  *peers;

 

    us->peer.init = ngx_http_upstream_init_hash_peer; // 回调函数 去第四步

 

    if (!us->servers) {

 

        return NGX_ERROR;

    }

 

    server = us->servers->elts;

 

    for (n = 0, i = 0; i < us->servers->nelts; i++) {

        n += server[i].naddrs;

    }

 

    peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_hash_peers_t)

            + sizeof(ngx_http_upstream_hash_peer_t) * n);

 

    if (peers == NULL) {

        return NGX_ERROR;

    }

 

    peers->number = n;

 

    /* 同一个主机名可能对应多个IP地址 */

    for (n = 0, i = 0; i < us->servers->nelts; i++) {

        for (j = 0; j < server[i].naddrs; j++, n++) {

            peers->peer[n].sockaddr = server[i].addrs[j].sockaddr;

            peers->peer[n].socklen = server[i].addrs[j].socklen;

            peers->peer[n].name = server[i].addrs[j].name;

        }

    }

 

    us->peer.data = peers;

 

    return NGX_OK;

}

 

// 对端初始化函数每个请求调用一次。它会构造一个数据结构,模块会用这个数据结构来选择合适的后端服务器;

// 这个数据结构保存着和后端交互的重试次数,通过它可以很容易的跟踪链接失败次数或者是计算好的哈希值。

// 这个结构体习惯性地被命名为ngx_http_upstream_<module name>_peer_data_t。

// 另外,对端初始化函数还会构建两个回调函数:

// * get: load-balancing 函数

// * free: 对端释放函数 (通常只是在连接完成后更新一些统计信息)

// 似乎还不止这些,它同时还初始化了一个叫做tries的变量。只要tries是正数,Nginx将继续重试当前的load-banlancer。

// 当tries变为0时,Nginx将放弃重试。一切都取决于get 和 free 如何设置合适的tries。

// 下面是upstream_hash中对端初始化函数的例子:

 

static ngx_int_t

ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,

    ngx_http_upstream_srv_conf_t *us)

{

 

    ////////////////////////////////////////////

    //        读取URL里面具体的key变量的值

    ////////////////////////////////////////////

    key_vv = ngx_http_get_indexed_variable(r,

     ngx_http_key_index);

 

ngx_http_upstream_hash_peer_data_t     *uhpd;

 

    ngx_str_t val;

 

    // 获得hash变量对应的本次请求的值

    if (ngx_http_script_run(r, &val, us->lengths, 0, us->values) == NULL) {

        return NGX_ERROR;

    }

 

    uhpd = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_hash_peer_data_t)

            + sizeof(uintptr_t) *

                ((ngx_http_upstream_hash_peers_t *)us->peer.data)->number /

                    (8 * sizeof(uintptr_t)));

    if (uhpd == NULL) {

        return NGX_ERROR;

    }

 

    r->upstream->peer.data = uhpd;

 

    uhpd->peers = us->peer.data;

 

    r->upstream->peer.get = ngx_http_upstream_get_hash_peer; // 回调函数 去第五步

    r->upstream->peer.free = ngx_http_upstream_free_hash_peer; // 回调函数 去第六步

    r->upstream->peer.tries = us->retries + 1;

 

    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,

                   "upstream_hash: hashing \"%V\"", &val);

 

    uhpd->hash = ngx_http_upstream_hash_crc32(val.data, val.len); // 准备hash的数值

 

    return NGX_OK;

}

 

 

static ngx_int_t

ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)

{

    ngx_http_upstream_hash_peer_data_t  *uhpd = data;

    ngx_http_upstream_hash_peer_t       *peer;

    ngx_uint_t                           peer_index;

 

    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,

                   "upstream_hash: get upstream request hash peer try %ui", pc->tries);

 

    pc->cached = 0;

    pc->connection = NULL;

 

//    peer_index = uhpd->hash % uhpd->peers->number;

    peer_index = atoi((char *) key_vv->data) % uhpd->peers->number;

 

    peer = &uhpd->peers->peer[peer_index];

 

    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,

                   "upstream_hash: chose peer %ui w/ hash %ui", peer_index, uhpd->hash);

 

    pc->sockaddr = peer->sockaddr;

    pc->socklen = peer->socklen;

    pc->name = &peer->name;

 

    return NGX_OK;

}

 

/* 不进行重试 */

static void

ngx_http_upstream_free_hash_peer(ngx_peer_connection_t *pc, void *data,

    ngx_uint_t state)

{

pc->tries = 0;

}

 

/* bit-shift, bit-mask, and non-zero requirement are for libmemcache compatibility */

static ngx_uint_t

ngx_http_upstream_hash_crc32(u_char *keydata, size_t keylen)

{

    ngx_uint_t crc32 = (ngx_crc32_short(keydata, keylen) >> 16) & 0x7fff;

    return crc32 ? crc32 : 1;

}

 

// 回调函数ngx_http_upstream_hash就是所谓的注册函数。

// 之所以这样叫(我起得名字)是因为它注册了把upstream初始化函数和周边的upstream配置注册到了一块。

// 另外,注册函数还定义了特定upstream块中的server指令的一些选项(如weight=, fail_timeout=),

// 下面是upstream_hash模块的注册函数:

// 第二步

static char *

ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

    ngx_http_upstream_srv_conf_t  *uscf;

    ngx_http_script_compile_t      sc;

    ngx_str_t                     *value;

    ngx_array_t                   *vars_lengths, *vars_values;

 

    value = cf->args->elts; // 获得nginx.conf中的hash配置的值

 

    ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));

 

    vars_lengths = NULL;

    vars_values = NULL;

 

    sc.cf = cf;

    sc.source = &value[1];

    sc.lengths = &vars_lengths;

    sc.values = &vars_values;

    sc.complete_lengths = 1;

    sc.complete_values = 1;

 

    if (ngx_http_script_compile(&sc) != NGX_OK) {

        return NGX_CONF_ERROR;

    }

 

    uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);

 

    uscf->peer.init_upstream = ngx_http_upstream_init_hash; // 回调函数 去第三步

 

    uscf->flags = NGX_HTTP_UPSTREAM_CREATE;

 

    uscf->values = vars_values->elts;

    uscf->lengths = vars_lengths->elts;

 

    if ((ngx_http_key_index = ngx_http_hi_upstream_module_add_variable(

                cf, &ngx_http_key_value)) == NGX_ERROR)

    {

        return NGX_CONF_ERROR;

    }

 

    return NGX_CONF_OK;

}

 

//////////////////////

// 从配置文件中读取key定义

//////////////////////

ngx_int_t

ngx_http_hi_upstream_module_init(ngx_conf_t *cf)

{

    printf("called:ngx_http_hi_upstream_module_init\n");

 

    // 读key参数

    if ((ngx_http_key_index = ngx_http_hi_upstream_module_add_variable(

                cf, &ngx_http_key_value)) == NGX_ERROR)

    {

        return NGX_ERROR;

    }

 

    return NGX_OK;

 

}

 

 

 

config文件

 

 

 

ngx_addon_name=ngx_http_hi_upstream_module

HTTP_MODULES="$HTTP_MODULES ngx_http_hi_upstream_module"

NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hi_upstream_module.c"


 

 

Nginx配置文件

 

worker_processes  1;

daemon off; 

master_process  off;

error_log  /tmp/error.log debug;

pid /tmp/nginx_demo.pid;

events {

    worker_connections  1024;

}

http {

    #include       /etc/nginx/mime.types;

    sendfile        on;

    keepalive_timeout  65;

    tcp_nodelay        on;

 

upstream backend {

    server 127.0.0.1:8889;

    server 127.0.0.1:8890;

    hash   $request_uri;

}

 

server {

        listen   8100;

        server_name  localhost;

        access_log  /tmp/access.log;

        error_log  /tmp/error.log debug;

        location /hello {

            set $key $arg_key;

            #echo "abcd";

   proxy_pass      http://backend;

        }

    }

}

 

Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解 一、前言 二、环境准备 三、安装与配置Nginx 四、Nginx之反向代理 五、Nginx之负载均衡 六、Nginx之页面缓存 七、Nginx之URL重写 八、Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一、前言 在前面的几篇博文中我们主要讲解了Ng 阅读详情

相关推荐

Nginx配置文件解析

Nginx配置文件属性权威指南(v1.27+) 本文档系统整理了Nginx核心配置指令,采用模块化分类方式,涵盖HTTP/TCP代理、缓存、SSL等核心功能。

White Chuan 364

Nginx变量使用方法详解

在 Nginx 配置中,变量只能存放一种类型的值,那就是字符串。1 自定义变量1.1 配置 $foo=helloserver { listen 8080; server_name localhost; location /test { set $foo hello; echo "foo: $foo"; } ...

huangyimo的专栏 3068

CentOS 7 下 Nginx map 模块启用与高可用实践

Nginx 的 map 指令是一种在配置解析期构建变量映射关系的高效机制,其底层基于哈希查表实现 O(1) 时间复杂度,相比 if + set 具备执行时机早、作用域全局、线程安全等核心优势。该模块常用于灰度路由、地域分流、请求头清洗、设备识别等生产场景,但因 CentOS 7 官方 RPM 默认禁用 --with-http_map_module,导致常见 unknown directive 报错。本文聚焦于动态模块加载方案,覆盖源码匹配编译、load_module 加载验证、SELinux 权限适配等关键

weixin_30564901的博客 358

Nginx Lua 开发 - Redis 操作

一、Nginx 支持3种方法访问 Redis 1)HttpRedis : 提供指令少,功能单一 2)HttpRedis2Module : 比 HttpRedis 操作更灵活,功能更强大 3)Lua-resty-redis 库 : Openresty 提供的操作 Redis 的接口库,需要通过 --with-luajit 编译安装 二、HttpRedis2Module 适合简单访问 Redi...

潘广宇的博客 1602

惊爆揭秘!异步启动永磁同步电机,调速核心技术大起底

传统的同步启动方式需要额外的同步设备,成本高且维护复杂。异步启动PMSM则巧妙地利用了鼠笼感应电机的启动原理,无需额外同步设备即可实现安全可靠的启动。其核心思想是将定子电流分解为两个正交的分量:磁链分量(id)和转矩分量(iq),分别控制这两个分量,从而实现对电机转矩的精确控制。随着电机设计技术的不断进步和控制算法的不断优化,异步启动PMSM的性能将得到进一步提升,应用范围也将更加广泛。异步启动PMSM的调速技术是其核心技术之一,直接影响着电机的性能和应用范围。

wen8789的博客 983

从GAN生成失败案例出发:为什么你的AI画不准位置?CoordConv保姆级解决方案

本文深入探讨了GAN生成图像时位置偏移问题的根源,并提供了CoordConv的保姆级解决方案。通过分析传统CNN在空间坐标建模上的缺陷,详细介绍了CoordConv的原理、实现步骤及在StyleGAN2等模型中的实战应用,显著提升了医学图像生成等任务的定位精度。

pp12345的博客 204

nginx源码学习 非http服务器的负载均衡实现

负载均衡  说明:这里只分析源码,具体每种模式工作原理网上有很详细的解释。这里没有分析http容器的负载均衡,只分析了upstream的负载均衡,二者有些许不同。 nginx支持四种复杂均衡模式,与实现文件对应如下: round robin模式:即循环模式,对应文件ngx_stream_upstream_round_robin.c/.h least conn模式:即最少连接模式,对应文件n

blwinner的专栏 1755

Wonderware Intouch 2014R2 SP1 安装教程

下载Wonderware System Platform 2014R2 SP1 and Intouch 2014R2 SP1的安装压缩包,如下 软件的下载连接地址如下: https://pan.baidu.com/s/1a2GnI_nfT3vK1l49B94FIQ, 提取码:6ec6 或者直接微信扫描下面的二维码 管理员运行下面的setup.exe可执行程序, 进入安装,选择Product Based Selection, 自定义选择需要安装的程序,如下: 普通的Into

工控先生 3万+

Nginx源码分析之 upstream指令

Nginx 源码分析 upstream指令 想要的解决问题: 1:upstream存储结构 2:动态 upstream 流程(proxy_pass跟随变量或者域名) 最简单的配置文件 http { upstrem abc { server 1.1.1.1; server 2.2.2.2; } upstrem efg { ...

Network, Linux Kernel 3020

随机森林文本分类

随机森林原理及代码实现 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录随机森林原理及代码实现前言一、集成算法是什么?二、随机森林是什么三、 数据预处理3.1 先来看一下我们的文本数据3.2 预处理3.3 统计评论情感值积极与消极的占比二、使用步骤参数介绍(4个)属性1.引入库2.参数调参方法总结 前言 提示:这里可以添加本文要记录的大概内容: 例如

m0_46579176的博客 5808

【AI智能体】Dify集成 Echarts实现数据报表展示实战详解

Dify集成 Echarts 实现智能数据报表集成与展示实战详解

congge 5962

Nginx一些内置变量

内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_cookie, 等等。下面是nginx支持的一些内置变量: $arg_name 请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name $args 请...

bjgaocp的博客 1001

基于FPGA的多通道音频信号采样系统设计

FPGA是随着数字集成电路的发展而逐步演变而来的。从早期的电子管、晶体管、小规模集成电路,到超大规模集成电路(VLSIC),数字集成电路的集成度和性能不断提升。FPGA的出现为系统设计师提供了灵活的设计平台,使其能够在不依赖半导体厂商的情况下快速设计专用集成电路(ASIC)。FPGA具有设计周期短、成本低、开发工具先进等优点,广泛应用于原型设计和产品生产中。VHDL是一种用于描述数字系统的硬件描述语言,其语言形式类似于计算机高级语言,但包含了许多硬件特征语句。

qq_62634009的博客 709

nginx

nginx命令 ./nginx -s reload nginx -v nginx -V 包括查看安装的模块 nginx -s stop 立即停止nginx nginx -s quit 等待到请求被处理完成后停止nginx nginx 启动nginx

9万+

【智能车Code review】——小S与中S道路判断

基本思想: 找到中线的左拐点和右拐点,并且计算出两点之间的空间距离。通过限制空间距离,分为中S和小S。 注意这种情况:当20行以下的中线斜率比较陡,此时可以通过人为限制设定,将第0行的中线设置为拐点。 if (flag_centre_right_point == 0 && flag_centre_left_point == 1 && parameterB >= 0.5 && centre_left_point[0] >= 33) { .

hanhan的博客 6104

【WRFDA第一期】WRF数据同化概述及资源整理

【WRFDA第一期】WRF数据同化概述及资源整理

WW、forever的博客 1660

全网最强Nginx教程 | 万字长文爆肝Nginx(四)

Nginx负载均衡技术文章摘要 本文介绍了Nginx实现负载均衡的原理和方法。负载均衡通过将用户请求分发到多台服务器,解决单机性能瓶颈和单点故障问题。主要负载均衡方式包括:用户手动选择、DNS轮询和四/七层负载均衡。其中Nginx的七层负载均衡基于应用层实现,通过upstream模块定义服务器组,使用proxy_pass指令转发请求。文章详细说明了Nginx负载均衡的配置方法,并介绍了server指令中的状态参数(down、backup等)来控制服务器的可用性。相比DNS轮询,Nginx负载均衡具有更高的可

qq_45832461的博客 1185

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

nginx做代理服务器的几种简单配置

首先要知道nginx的代理相对于lvs不同是七层的代理,报文在流经PREROUTING时发现对方的目标IP是自己会将数据发往应用层,nginx的proxy模块会将数据解析然后以自己的ip地址为源地址发送给被代理的服务器。所以返回的响应数据也要流经nginx代理服务器。 配置nginx服务能够进行代理很简单 编辑配置文件 nginx]# cat conf.d...

weixin_44288087的博客 7853

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

nginx的proxy模块、proxycache缓存、upstream定义集群

一、基于nginx将客户端请求反向代理至后端服务器:1、proxy_pass指令只能用于location上下文: proxy_pass 后面的路径不带URI时,将会把location的URI传递给后端主机,如location /img/ { proxy_pass http://172.18.224.101; }客户端请求的URL被这个locatio...

weixin_34290352的博客 111

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

nginx-负载均衡的配置

weightip_hashleast_connhash是的。url_hashfair这种通常是第三方模块(比如 nginx_upstream_fair),在普通 Nginx 里是没有的,要自己编译模块才有。

qq_31532983的博客 890

nginx rewrite与proxy_pass详解

最近接触到了nginx的 proxy_pass 与 rewrite,在这里记录一下,学习学习。 说明 rewrite syntax: rewrite regex replacement [flag] Default: — Context: server, location, if 如果正则表达式(regex)匹配到了请求的URI(request URI),这个URI会被后面的replac...

zzhongcy的专栏 2万+

Nginx 进阶:反向代理与七层负载均衡实战:Location 匹配、upstream 多种调度策略详解

本篇围绕 Nginx 反向代理与七层负载均衡展开完整实操。包含 SSL/TLS 配置、基础认证、PHP 站点部署;详解反向代理原理、Location 无符号 / 正则 / 精确三种匹配模式,提供多组访问测试案例;讲解代理本地与远端服务配置;重点拆解七层负载均衡 upstream 六大调度方式:轮询、权重、ip_hash、通用 hash、最少连接、最少时间,并附带实验验证,适合动手实操学习。

cyw_lesson的博客 211

Nginx详解(持续更新)

nginx详解,看这一篇即可

Ferao的博客 1338

nginx upstream配置_负载均衡与反向代理(Nginx/OpenResty)

我们使用Nginx时,大多数场景下使用的都是七层的HTTP负载均衡(ngx_http_upstream_module)。在1.9.0版本以后,Nginx也开始支持TCP(ngx_stream_upstream_module)四层负载均衡。四层/七层负载均衡的区别四层负载均衡,就是基于IP+端口的负载均衡(TCP/UDP)。七层负载均衡,就是基于URL等应用层协议(HTTP)的负载均衡。熟悉网络分层...

weixin_39864101的博客 768
上一篇: Nginx模块开发 从url变量中读取内容并显示
下一篇: Nginx模块开发 研究1
大得传奇
博客等级 码龄18年 15粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值