Nginx高性能Web服务器:Nginx HTTP负载均衡和反向代理的配置与优化(第六章)

Nginx (3.3万) 2020-08-31 14:47:11

6.4、Nginx负载均衡的HTTP Upstream 模块

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;
  }
}

6.4.1 ip_hash指令

语法: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:

代码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就会失效。

6.4.2 server指令

语法: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;
}

6.4.3 upstream指令

语法: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;
}

6.4.4 upstream相关变量从Nginx

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
THE END

Leave a Reply