当生产环境里有很大的流量产生时,通常需要用负载均衡技术来做优化,并确保容错配置。Nginx不光可以实现Web Server,还可以作为HTTP负载均衡来分发流量给后端的应用程序服务器,以此来提高性能。Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。
轮询(默认算法)——每个请求会依次分配给后端不同的应用程序服务器,不理会后端服务器的实际压力
加权轮询——权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况
IP HASH——当同IP进行重复访问时会被指定到上次访问到的服务器,可以解决动态网站SESSION共享问题
参数 | 说明 |
---|---|
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使用 |
http { #upstream模块包含在http模块下
upstream web3{ #定义upstream名字,下面会引用
server 192.168.1.100; #指定后端服务器地址
server 192.168.1.110; #指定后端服务器地址
server 192.168.1.120; #指定后端服务器地址
}
server {
listen 80;
server name www.web3.xin;
location / {
proxy_pass http://web3; #引用upstream
}
}
}
在上面的例子中,当用户访问www.web3.xin站点时,Nginx会负载平衡分配给后端的三个服务器。
http {
upstream web3{
server 192.168.1.100 weight=3; #指定后端服务器地址,权重为3
server 192.168.1.110;
}
server {
listen 80;
server name www.web3.xin;
location / {
proxy_pass http://web3;
}
}
}
在上面配置中,每3个请求分配给192.168.1.100,然后第4个请求会分配给192.168.1.110,如此循环下去。
如果需要将客户与后端一台服务器“绑定”起来,可以使用ip-hash负载平衡机制。这样可以确保来自相同客户机的请求总是指向相同的服务器除非该服务器不可用。
Nginx高可用的实现,利用backup标签,可以实现高可用,当主服务挂掉后,backup服务器会自动接管服务,当主服务恢复后,backup也会自动放弃服务
http {
upstream web3{
server 192.168.1.100
server 192.168.1.110 backup;
}
server {
listen 80;
server name www.web3.xin;
location / {
proxy_pass http://web3;
}
}
}
Nginx的upstream模块相当于是建立一个函数库一样,把后端的服务器地址放在了一个池子里,而proxy模块则是从这个池子里调用了这些服务器。
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:代理服务器和后端服务器连接成功后,等待后端服务器响应时间