1. nginx upstream 负载均衡
upstream 模块负债负载均衡模块,如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。具体配置过程如下:
在http节点下,添加upstream节点。
1 2 3 4
| upstream levonfly { server 10.0.6.108:7080; server 10.0.0.85:8980; }
|
将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即”http://levonfly“.
1 2 3 4 5
| location / { root html; index index.html index.htm; proxy_pass http://levonfly; }
|
现在负载均衡初步完成了。upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。
2. upstream 负载均衡的模式
nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
2.1 轮询(默认)
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。
1 2 3 4 5
| upstream backend { server 192.168.1.101:8888; server 192.168.1.102:8888; server 192.168.1.103:8888; }
|
2.2 weight
轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
1 2 3 4 5
| upstream backend { server 192.168.1.101 weight=1; server 192.168.1.102 weight=2; server 192.168.1.103 weight=3; }
|
2.3 ip_hash
每个请求按照访问ip(即nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
1 2 3 4 5 6
| upstream backend { ip_hash; server 192.168.1.101:7777; server 192.168.1.102:8888; server 192.168.1.103:9999; }
|
2.4 fair(第三方)
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。
1 2 3 4 5 6
| upstream backend { server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; fair; }
|
2.5 url_hash(第三方)
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
1 2 3 4 5 6 7
| upstream backend { server 192.168.1.101; server 192.168.1.102; server 192.168.1.103; hash $request_uri; hash_method crc32; }
|
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
3. upstream 其他参数
upstream中server指令语法如下:server address [parameters]
, 关键字server必选, address也必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
down 表示单前的server暂时不参与负载.
weight 默认为1. weight越大,负载的权重就越大。
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout : max_fails次失败后,暂停的时间。
backup: 表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
1 2 3 4 5 6 7
| upstream bakend{ ip_hash; server 10.0.0.11:9090 down; server 10.0.0.11:8080 weight=2; server 10.0.0.11:6060; server 10.0.0.11:7070 backup; }
|
3.1 注意:
max_fails和fail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。
4. 实战配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| upstream levonfly { server 127.0.0.1:13050; }
upstream testing-levonfly { server 172.25.61.25:13050; }
server { server_name levonfly.com; listen 443 ssl http2 ; access_log /var/log/nginx/cistern_access_log; error_log /var/log/nginx/cistern_error_log notice; ssl_certificate /etc/nginx/certs/STAR.levonfly.com.crt; ssl_certificate_key /etc/nginx/certs/STAR.levonfly.com.key; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Scheme $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_intercept_errors on;
location / { proxy_pass http://levonfly; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_buffering off; proxy_cache off; } }
server { server_name test.levonfly.com; listen 443 ssl http2 ; access_log /var/log/nginx/cistern_access_log; error_log /var/log/nginx/cistern_error_log notice; ssl_certificate /etc/nginx/certs/STAR.levonfly.com.crt; ssl_certificate_key /etc/nginx/certs/STAR.levonfly.com.key; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Scheme $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_intercept_errors on;
location / { proxy_pass http://testing-levonfly; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_buffering off; proxy_cache off; } }
|
4.1 遇到的问题:
如果不生效, 注意下 upstream 的缩进会造成问题
5. 参考资料