Nginx负载均衡与高可用的实现
at 7年前 ca Nginx pv 1669 by touch
当生产环境里有很大的流量产生时,通常需要用负载均衡技术来做优化,并确保容错配置。Nginx不光可以实现Web Server,还可以作为HTTP负载均衡来分发流量给后端的应用程序服务器,以此来提高性能。Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。
Nginx常用负载均衡算法:
轮询(默认算法)——每个请求会依次分配给后端不同的应用程序服务器,不理会后端服务器的实际压力
加权轮询——权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况
IP HASH——当同IP进行重复访问时会被指定到上次访问到的服务器,可以解决动态网站SESSION共享问题
upstream模块常用参数说明:
server 192.168.0.100:80 | 负载均衡后端RealServer的IP或者域名,端口不写的话默认为80。高并发场景用域名,再通过DNS进行负载均衡 |
weight=5 | 权重,默认为1,权重越大接收的请求越多 |
max_fails=2 | 最大尝试的失败次数,默认为1,0表示禁止失败尝试 |
fail_timeout=10s | 失败超时时间,默认是10秒,通常3s左右比较合适 |
backup | 热备配置,前段RealServer出现问题后会自动上线backup服务器 |
down | 标志服务器不可用,这个参数通常配合IP_HASH使用 |
Nginx负载均衡设置:
默认的负载均衡配置
http { #upstream模块包含在http模块下 upstream linuxidc{ #定义upstream名字,下面会引用 server 192.168.1.100; #指定后端服务器地址 server 192.168.1.110; #指定后端服务器地址 server 192.168.1.120; #指定后端服务器地址 } server { listen 80; server name www.linuxidc.com; location / { proxy_pass http://linuxidc; #引用upstream } } }
在上面的例子中,当用户访问www.linuxidc.com站点时,Nginx会负载平衡分配给后端的三个服务器。
加权负载均衡
http { upstream linuxidc{ server 192.168.1.100 weight=3; #指定后端服务器地址,权重为3 server 192.168.1.110; } server { listen 80; server name www.linuxidc.com; location / { proxy_pass http://linuxidc; } } }
在上面配置中,每3个请求分配给192.168.1.100,然后第4个请求会分配给192.168.1.110,如此循环下去。
IP HASH负载均衡
upstream linuxidc { ip_hash; #采用IP HASH算法 server 192.168.1.100; server 192.168.1.110; server 192.168.1.120; }
如果需要将客户与后端一台服务器“绑定”起来,可以使用ip-hash负载平衡机制。这样可以确保来自相同客户机的请求总是指向相同的服务器除非该服务器不可用。
Nginx高可用的实现,利用backup标签,可以实现高可用,当主服务挂掉后,backup服务器会自动接管服务,当主服务恢复后,backup也会自动放弃服务
http { upstream linuxidc{ server 192.168.1.100 server 192.168.1.110 backup; } server { listen 80; server name www.linuxidc.com; location / { proxy_pass http://linuxidc; } } }
Nginx的upstream模块相当于是建立一个函数库一样,把后端的服务器地址放在了一个池子里,而proxy模块则是从这个池子里调用了这些服务器。
http_proxy_module模块常用参数:
proxy_set_header:让后端服务器能获取到前端用户真实IP,而不只是代理服务器的IP
proxy_set_header Host $host;
#当后端服务器配置多个web站点时,该选项可以让服务器识别出具体要访问的是哪个站点,而不会将第一个站点作为默认站点传递给用户
proxy_set_header X-Forwarded-For $remote_addr;
#如果后端服务器需要获取用户的真实IP,需要该选项
client_body_buffer_size:客户端请求主体缓冲区大小
proxy_connect_timeout:代理服务器和后端真实服务器握手连接超时时间
proxy_send_timeout:后端服务器回传数据给Nginx的时间,需要在设置的时间范围内发送完所有数据,否则Nginx将断开连接
proxy_read_timeout:代理服务器和后端服务器连接成功后,等待后端服务器响应时间
前端Nginx反向代理,如何获取客户端真实IP?
#转发动态页面给Tomcat处理
location ~ \.(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://tomcat_server; }
更多Nginx负载均衡配置相关教程见以下内容:
Nginx负载均衡配置说明 http://www.linuxidc.com/Linux/2016-03/129424.htm
Linux下Nginx+Tomcat负载均衡和动静分离配置要点 http://www.linuxidc.com/Linux/2016-01/127255.htm
Docker+Nginx+Tomcat7配置简单的负载均衡 http://www.linuxidc.com/Linux/2015-12/125907.htm
Nginx负载均衡(主备)+Keepalived https://www.codefarme.com/?id=23
使用Nginx作为负载均衡器 http://www.linuxidc.com/Linux/2015-12/125789.htm
CentOS环境下Nginx实现3台虚拟机负载均衡 http://www.linuxidc.com/Linux/2015-12/125875.htm
Nginx反向代理负载均衡群集实战 http://www.linuxidc.com/Linux/2015-08/122111.htm
Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/130350.htm
版权声明
本文仅代表作者观点,不代表码农殇立场。
本文系作者授权码农殇发表,未经许可,不得转载。