一般在应用部署中都不会直接把Web Server(如:Tomcat、Jetty等)暴露给用户,我们会在Web Server前面再加一个反向代理。这篇文章介绍的就是怎样设置Nginx来做反向代理。
Nginx安装
以Ubuntu 14.04为例(其它系统请自行查找安装方法)。官方安装文档在:http://nginx.org/en/download.html
1 | curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add - |
Nginx反向代理常用设置
在location
段中设置反向代理,必需的设置项是:proxy_pass
,它指定将请示转发到的地址。
- proxy_pass URL:设置被代理服务的地址或被映射的URI
- proxy_http_version 1.1:设置HTTP协议
- proxy_set_header field value:设置预定义或增加字段到请求header中传到被代理的Server上。常用设置有:
- X-Real-IP $remote_addr:代理远端IP
- X-Forwarded-Proto $scheme:代理远端scheme,一般就是使用的协议,如:http、https、ftp
- Connection “Keep-Alive”:启用HTTP的Keep-Alive特性,保持HTTP连接。在服务频繁连接使用时可以减少TIME_WAIT状态的发生,有效的提供性能。
- proxy_next_upstream value:指定切换请求到下一个被代理Server的机制。默认:error timeout
- error:发生错误
- timeout:超时发生
- invalid_header:header头无效
- http_500
- http_502
- http_503
- http_504
- http_403
- http_404
- off:禁止传到请求到下一个Server
(keepalive 这个词可能是指连接池或者tcp层面的参数,要看上下文。在http里是keep-alive,注意中间有个连字符。)
Nginx负载均衡
在配置文件http
段内定义upstream
指令:
1 | upstream crawlerApi { |
**server
**标识指令定义用于做负载均衡的Server列表。server
标识可以定义附加参数,每个参数之间使用空格分隔。crawler-ali
和端口改成你自己的。
- weight=number:设置当前Server的优先级权重,值越大越高。默认为1
- max_fails=number:设置最大重试次数,默认为1
- fail_timeout=time:设置重试间隔时间,默认10秒
- backup:设置当前Server为备份Server,当其它Server不可以时启用
- down:标记当前Server不可用
- max_conns=number:设置被代理Server最大活动连接数,默认不限制
在需要配置负载均衡的location
里定义代理使用:
1 | proxy_pass http://crawlerApi; |
Nginx做负载的键康检查(心跳检测)机制
Nginx提供了health_check
语句来提供负载(upstream
)时的键康检查机制(注意:此语句需要设置在location
上下文中)。
支持的参数有:
- interval=time:设置两次健康检查之间的间隔值,默认为5秒
- fails=number:设置将服务器视为不健康的连续检查次数,默认为1次
- passes=number:设置一个服务器被视为健康的连续检查次数,默认为1次
- uri=uri:定义健康检查的请求URI,默认为”/“
- match=name:指定匹配配置块的名字,用记测试响应是否通过健康检测。默认为测试返回状态码为2xx和3xx
一个简单的设置如下,将使用默认值:
1 | location / { |
对就应用,我们可以专门定义一个API用于健康检查:/api/health_check
,并只返回HTTP状态码为200。并设置两次检查之间的间隔值为1秒。这样,health_check
语句的配置如下:
1 | health_check uri="/api/health_check" interval; |
对后端某个节点的优雅下线
Nginx将请求代理给一个后端节点,这个请求耗时较长,在请求未处理完时后端恰好要做发布。这时在Nginx中先将此节点标记为不可用(在upstream
中设置server
的down
属性)。此时,只要请求连接还保持,Nginx并不会中断当前连接,但之后新的连接将不再使用这个节点。
这样在用Nginx的负载时,后端若需要做发布。只需要将对就节点标记为不可用并留出一定的时间让忆有请求都响应完毕即可。
更严格一些,还应检测到后端节点的网络连接都已释放(那些EST、TIME_WAIT等连接都结束后)。