Upstream模块是Nginx负载均衡的主要模块,它提供了一个简单方法来实现在轮询和客户端IP之间的后端服务器负载均衡,并可以对后端服务器进行健康检查。
代码6-5
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
语法:ip_hash
默认值:none
使用环境:upstream
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某个IP的用户在后端Web服务器A上登录后,再访问该站点的其他URL,能保证其访问的还是后端Web服务器A。如果不采用ip_hash指令,假设来自某个IP的用户在后端Web服务器A上登录后,再访问该站点的其他URL,有可能被定向到后端Web服务器B,C,…上,由于用户登录后SESSION信息是记录在服务器A上的,B,C,…上没有,这时就会提示用户未登录。
使用ip_hash指令无法保证后端服务器的负载均衡,可能有些后端服务器接收到的请求多,有些后端服务器接收到的请求少,而且设置后端服务器权重等方法将不起作用。所以,如果后端的动态应用服务器能够做到SESSION共享,还是建议采用后端服务器的SESSION共享方式来代替Nginx的ip_hash方式。
如果后端服务器有时要从Nginx负载均衡(已使用ip_hash)中摘除一段时间,你必须将其标记为“down”,而不是直接从配置文件中删掉或注释掉该后端服务器的信息。代码示例如6-6:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
这样,当原来为4台后端服务器时,摘除backend3.example.com(标记为“down”)后,Nginx仍然会按4台服务器进行哈希。如果直接注释掉“server backend3.example.com”这行,Nginx就会按照3台服务器进行重新哈希,原来被哈希到backend1.example.com的客户端IP有可能被哈希到backend2.example.com服务器上,原有的SESSION就会失效。
语法:server name [parameters]
默认值:none
使用环境:upstream
该指令用于指定后端服务器的名称和参数。服务器的名称可以是一个域名、一个IP地址、端口号或UNIX Socket。
在后端服务器名称之后,可以跟以下参数:
weight = NUMBER———设置服务器的权重,权重数值越高,被分配到的客户端请求数越多。如果没有设置权重,则为默认权重1。
max_fails = NUMBER———在参数fail_timeout指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接及发生服务器错误(404错误除外),则标记为失败。如果没有设置,则为默认值1。设为数值0将关闭这项检查。
fail_timeout = TIME———在经历参数max_fails设置的失败次数后,暂停的时间。
down———标记服务器为永久离线状态,用于ip_hash指令。
backup———仅仅在非backup服务器全部宕机或繁忙的时候才启用。
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
语法:upstream name { ... }
默认值:none
使用环境:http该指令用于设置一组可以在proxy_pass和fastcgi_pass指令中使用的代理服务器,默认的负载均衡方式为轮询。示例如下:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
0.5.18版本开始,可以支持用log_format指令设置日志格式,日志格式中可以使用变量,例如:
log_format timing '$remote_addr - $remote_user [$time_local] $request '
'upstream_response_time $upstream_response_time '
'msec $msec request_time $request_time';
log_format up_head '$remote_addr - $remote_user [$time_local] $request '
'upstream_http_content_type $upstream_http_content_type';
upstream模块拥有以下变量:
$upstream_addr
处理请求的upstream服务器地址。
$upstream_status
Upstream服务器的应答状态。
$upstream_response_time
Upstream服务器响应时间(毫秒),多个响应以逗号和冒号分割。
$upstream_http_$HEADER
任意的HTTP协议头信息,例如:
$upstream_http_host