您的位置:首页 > 运维架构 > Nginx

nginx依靠超时时间实现上游负载web服务器重启时不影响访问

2015-07-21 10:24 645 查看
nginx依靠超时时间实现上游负载web服务器重启时不影响访问

本文未配置主从机集群,主从多台集群。

nginx.conf(或者外联配置文件)中,位于http{}之内,样例如下:



upstream test  {
least_conn; #最小连接数,跳转到激活连接数最少的服务器上,也可以使用默认轮询方案,或者ip_hash等固定指向的连接方案,cookie粘性方案。届时按使用场景配置。
#ip_hash;
server 192.168.108.163 ; #ip或域名还可以加二级目录名(即项目的目录名称)
server 192.168.108.164:80;
}

server {
listen          80;
server_name    www.test.com; #也可ip,后边还可以加二级目录名(即项目的目录名称)
index           index.jsp index.html index.htm; #这一项也可以放在location中。同理,proxy_set_header的项也可以放在location外边
location / {
  proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
 
  proxy_pass http://test/; #后边还可以加二级目录名(即项目的目录名称)
  proxy_connect_timeout       3;
  proxy_read_timeout          3;
  #proxy_send_timeout          10;
 
  #proxy_cookie_path /testSession/ /; #若cookie出现问题,可用此配置,二级项目的cookie解决方法。
  #proxy_cookie_path /testSession /; #若cookie出现问题,可用此配置,二级项目的cookie解决方法。
  proxy_set_header   Host   $host;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m; #大小自己定,单位k或m都可以
 }
}


----------------------------------------------分割线----------------------------------------------

配制方法为:调试负载中单台机的max_fails,fail_timeout,设置proxy_next_upstream error timeout http_500 http_502 http_504;(别忘了分号),调试proxy_read_timeout和proxy_connect_timeout时间,默认60,根据自己项目可能出现的等待时长设置小一点,例如10,20之类。

为了更新程序时,某些连接跳转会导致程序计算出问题(同一集群下的新旧程序分别参与同一个用户访问的操作,可能导致结果错误),可配置成ip_hash。

注意,若更改nginx配置文件,用 nginx -s reload 命令。

其原理为:利用proxy_read_timeout(response响应超时时间,注意并非response内容全部返回超时时间,那是proxy_send_timeout)和proxy_connect_timeout(nginx与上有服务器通讯握手的超时时间),找到适合自己服务器的超时时长。当某重启的服务器响应超时时,依靠proxy_next_upstream(统计失败的种类)和上游服务器的健康检查(max_fails为0则不检查直接跳转其他服务器),访问集群同组的下一台服务器。超时时间需要考虑最长响应时间的业务,服务器日常平均响应时长,可能的峰值时长,尽量让用户访问无感觉。

参数含义请细读后文。

----------------------------------------------分割线----------------------------------------------

其中upstream中的server指令后面的参数部分

语法:server name [parameters]

parameters包含:

weight = NUMBER - 默认为1。设置服务器权重。

max_fails = NUMBER - 默认为1,在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,将其设置为0可以关闭检查,检查哪种错误,则在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。

fail_timeout = TIME - 默认为10秒,在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起 之前),fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和 proxy_read_timeout来控制。(如设置10秒,max_fails设置1,表示10秒内有超过1次失败则该机暂时不可用。此后,再过10秒后才能再次开始失败检查。)

down - 标记服务器处于离线状态,通常和ip_hash一起使用。

backup - (0.6.7或更高)只用于本服务器,如果所有的非备份服务器都宕机或繁忙时访问该机。

关于max_fails 参数的理解:根据上面的解释,max_fails默认为1,fail_timeout默认为10秒,也就是说,默认情况下后端服务器在10秒钟之内可以容许有一次的失 败,如果超过1次则视为该服务器有问题,将该服务器标记为不可用。等待10秒后再 将请求发给该服务器,以此类推进行后端服务器的健康检查。但如果我将max_fails设置为0, 则代表不对后端服务器进行健康检查,这样一来fail_timeout参数也就没什么意义了。那若后端服务器真的出现 问题怎么办呢?上文也说了,可以借助proxy_connect_timeout和proxy_read_timeout进行控制。

----------------------------------------------分割线----------------------------------------------

其中server下location中的相关配置

proxy_next_upstream

语法: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]

确定在何种情况下请求将转发到下一个服务器(当前集群组内的下一台)。转发请求只发生在没有数据传递到客户端的过程中。同时,当前配置类型也会影响max_fails,只有其配置的失败类型才会进入max_fails计数器。

proxy_connect_timeout 默认60(s)

后端服务器连接的超时时间_发起握手等候响应超时时间(web服务器启动后,nginx发起握手,服务器回复,注意,此并非软件响应的时间)

proxy_read_timeout 默认60(s)

连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间。即response的响应时间,并非response全部返回的时间)

proxy_send_timeout 默认60(s)

后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据的超时时间

proxy_pass

语法 proxy_pass http://192.168……(或者域名,或者upstream的名字,后边可以加二级目录名,即项目的目录名)
这个指令设置被代理服务器的地址和被映射的URI

更多详细配置请参考nginx官网。

参考文档(参数用途测试)http://blog.sina.com.cn/s/blog_6b92dc3b0100n5al.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: