Nginx中与proxy模块结合使用的模块中,最常用的当属upstream模块。upstream模块可定义一个新的上下文,它包含了一组upstream服务器,这些服务器可能被赋予了不同的权重、不同的类型甚至可以基于维护等原因被标记为down。
upstream模块常用的指令有:
ip_hash:基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至同一个upstream服务器,实现会话保持;
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;
least_conn:最少连接调度算法;
server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
weight:权重;
max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
fail_timeout:等待请求的目标服务器发送响应的时长;
backup:用于fallback的目的,所有服务均故障时才启动此服务器;
down:手动标记其不再处理任何请求;
upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } server { location / { proxy_pass http://backend; } }
测试环境
nginx:192.168.2.168
httpd1:192.168.2.169
httpd2:192.168.2.170
nginx配置http中定义:
upstream webservice { server 192.168.2.169 weight=1 max_fails=2 fail_timeout=5s; server 192.168.2.170 weight=1 max_fails=2 fail_timeout=5s; server 127.0.0.1:8080 backup; }
server中定义
location ~* ^/bbs/ { proxy_pass http://webservice; proxy_set_header X-Real-IP $remote_addr; }
另外定义back server:
server { listen 8080; server_name 127.0.0.1; root /web/errorpages; index index.html; }
负载负载均衡:
upstream模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种。
注意:ip_hash被使用时,back server不能使用,wegiht失效
测试中,停掉httpd1,nginx自动检查server健康状况,只负载到httd2,再次停掉httd2,会负载到back server;
使用ip_hash算法:
upstream webservice { ip_hash; server 192.168.2.169 weight=1 max_fails=2 fail_timeout=5s; server 192.168.2.170 weight=1 max_fails=2 fail_timeout=5s; }
测试时只会负载到httpd2
此外,upstream模块也能为非http类的应用实现负载均衡,如下面的示例定义了nginx为memcached服务实现负载均衡之目的。
upstream memcachesrvs { server 172.16.100.6:11211; server 172.16.100.7:11211; } server { location / { set $memcached_key "$uri?$args"; memcached_pass memcachesrvs; error_page 404 = @fallback; } location @fallback { proxy_pass http://127.0.0.1:8080; } }