这是 Nginx 学习总结的第六篇,上一篇介绍到了 Nginx 学习总结(5) —— 反向代理,本文主要演示结合 proxy
和 upstream
模块的使用来实现 Nginx 的负载均衡。html
Nginx 官网中对 upstream
模块的介绍:ngx_http_upstream_module
模块用于定义可由 proxy_pass
,fastcgi_pass
,uwsgi_pass
,scgi_pass
和 memcached_pass
指令引用的服务器组。mysql
Context:http
在 VMware 上准备 3 台服务器(centos_7_x64),分别安装了 Nginx(1.12.0),它们可以互相 ping
通,3台服务器 IP 分别为:nginx
在 Web 服务器的根目录下的 index.html 文件内容分别为:git
<h1>Welcome to 192.168.4.221 !</h1>
<h1>Welcome to 192.168.4.222 !</h1>
在 Nginx 下配置反向代理,主要是 proxy
和 upstream
模块的配置。咱们将反向代理服务器 C 的配置修改为以下:github
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; } server { listen 80; server_name localhost; charset utf-8; location / { proxy_pass http://jochen; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
配置好以后,重启反向代理服务器 C ,浏览器访问 http://192.168.4.223
:算法
浏览器刷新页面:sql
咱们能够发现,访问的内容的确是 Web 服务器 A 或 B 提供的内容,代表咱们的反向代理是配置成功了。并且,响应内容是由 Web 服务器 A、B 依次轮流提供的。segmentfault
负载均衡是反向代理技术的一种运用。客户端访问服务器,服务器会把请求分发给其它多个不一样的服务器(即反向代理),从而减轻了单个服务器处理海量请求的压力,不会出现崩溃,即如图:后端
在上面的配置中,咱们没有设置 upstream
的分配方式,默认状况下,这将采用轮询的方式,即每一个请求按时间逐一分配到不一样的后端服务器。若是后端服务器 down 掉,能自动剔除。而实现负载均衡的核心在于如何将请求合理地分配给不一样的后端服务器。centos
在现实生活中,不一样服务器的 CPU 、内存、硬盘、网络带宽的性能都是不一样的,于是它们各自的处理能力各不同。须要采用某种负载均衡调度算法,来将请求合理地分配给不一样的后端服务器,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
在 Nginx 中,upstream
的分配方式有 5 种,分别是:
每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器 down 掉,能自动剔除。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; }
指定轮询概率,weight 和访问比率成正比,用于后端服务器性能不均的状况。如:
upstream jochen { server 192.168.4.221:80 weight=10; server 192.168.4.222:80 weight=20; }
每一个请求按访问 ip 的 hash 结果分配,这样每一个访客固定访问一个后端服务器,能够解决 session 的问题。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; ip_hash; }
按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个是第三方模块,须要额外安装。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; fair; }
按访问 url 的 hash 结果来分配请求,使每一个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。这个是第三方模块,须要额外安装。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; hash $request_uri; hash_method crc32; }
在 upstream
模块中,能够经过 server
指令定义服务器的地址和其余参数。地址能够指定为域名,或 IP 地址(端口可选,默认为80),或 "unix" 为前缀的套接字路径。
Context: upstream
经常使用的参数有:
down
将服务器标记为永久不可用weight
设置服务器的权重,默认状况下为 1backup
将服务器标记为备份服务器。当主服务器不可用时,它将被传递请求max_fails
容许请求失败的次数,默认为 1fail_timeout
在经历了 max_fails
次失败后,暂停服务的时间。max_fails
能够和 fail_timeout
一块儿使用upstream jochen { server backend1.example.com weight=5; server 192.168.4.222:80 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; server backup1.example.com backup; }
Nginx 自身是没有针对负载均衡后端节点健康检查的模块,nginx_upstream_check_module
是专门用于负载均衡健康检查的第三方模块,由淘宝的姚伟斌大神开发,经过它能够用来检测后端 server
的健康状态。nginx_upstream_check_module
模块会持续检查 server
的状态,若是某个 server
不可用,则请求就不会被转发到该 server
上。项目地址:https://github.com/yaoweibin/... 。
下面的是一个带负载均衡健康检查的 nginx.conf 配置:
upstream jochen { server 192.168.4.221:80 weight=5 max_fails=2 fail_timeout=30s; server 192.168.4.222:80 weight=1 max_fails=2 fail_timeout=30s; check interval=5000 rise=2 fall=3 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } server { listen 80; server_name localhost; charset utf-8; location / { proxy_pass http://jochen; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /nginx-status { stub_status; access_log off; allow 192.168.4.220; deny all; } location /check-status { check_status; access_log off; allow 192.168.4.220; deny all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
重启 Nginx 配置生效以后,能够看到 error.log 日志以下信息,说明 nginx_upstream_check_module
模块已正常运行:
2018/03/29 15:12:48 [error] 46931#46931: enable check peer: 192.168.4.221:80 2018/03/29 15:12:50 [error] 46931#46931: enable check peer: 192.168.4.222:80
同时,访问 http://192.168.4.223/check-status
,能够看到以下页面:
上面配置的意思是,对 jochen 这个服务器组中的全部 server,每5秒检测一次,请求 2 次正常则标记 server 状态为up,若是检测 3 次都失败,则标记 server 的状态为 down,超时时间为1秒。
nginx_upstream_check_module
模块的指令详情见 https://github.com/yaoweibin/...,经常使用指令说明以下:
check
为上游服务器添加运行情况检查,经常使用参数以下:
interval
向后端发送的健康检查包的间隔fall
若是连续失败次数达到 fall_count
,服务器就被认为是 downrise
若是连续成功次数达到 rise_count
,服务器就被认为是 uptimeout
后端健康请求的超时时间type
健康检查包的类型,包括 tcp、http、ajp、ssl_hello、mysql、fastcgicheck_http_send
配置 HTTP 监控检查包发送的请求内容,为了减小传输数据量,推荐采用 HEAD 方法。check_http_expect_alive
指定 HTTP 回复的成功状态,默认认为 2XX 和 3XX 的状态是健康的。参考文章: