Nginx 反向代理和负载均衡
负载均衡是为了解决单服务器对于高并发应用访问性能瓶颈的问题的.Nginx 可以做网络第七层(应用层)的负载均衡.
1. 相关概念
1.1 正向代理&反向代理
正向代理(Proxy): 正向代理是为了解决内网服务器不能访问Internet 上服务器的问题的. 正向代理过程是指, 内网服务器访问公网服务器的工程: 先访问代理服务器, 然后代理服务器去访问公网服务器, 并将响应结果返回给内网服务器.
反向代理(Reverse Proxy): 反向代理和正向代理正好相反, 反向代理是为了解决Internet 上服务器不能访问内网服务器的问题的. 反向代理过程是指公网服务器访问内网服务器的过程: 公网服务器先访问代理服务器, 然后代理服务器去访问内网, 并将响应结果返回给公网服务器.
1.2 负载均衡
负载均衡(Load Blance): 负载均衡是为了解决单一服务器节点对于高并发应用访问性能缓慢的问题的. 其实笔者认为负载均衡是反向代理的一种情况.负载均衡过程: 用户访问负载服务器, 服务器按照一定规则将用户请求转发给后端的某台服务器处理, 并将服务器处理结果(服务器响应)返回给用户. 和反向代理不同的是, 反向代理是一对一的代理, 负载均衡是一对多的代理.
2. Nginx 反向代理配置
nginx 配置反向代理很简单, 在location 中添加proxy_pass 即可.
location /jenkins {
proxy_pass http://localhost:8180/jenkins;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
}
3. 负载均衡配置
nginx 负载均衡是通过upstream 模块儿完成的, 配置需要需要两步:
- 配置负载服务器集群
- 配置映射路径
3.1 http 节点中配置负载集群
upstream jenkins{
server 192.168.145.100:8180 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.145.100:8280 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.145.100:8380 weight=2 max_fails=3 fail_timeout=30s down;
}
常用参数说明:
- server: 指定服务器的ip 和端口号
- weight: 设置服务器权重, 权重越高, 被分配的请求次数越多
- max_fails & fail_timeout: 当连接失败了max_fails 次数之后, 认为此服务器有问题, 暂停向此服务器分发请求 fail_timeout
- down: 标识此服务器已宕机, 不再向此服务器分发请求
3.2 server 节点中配置映射规则
location /jenkins {
proxy_pass http://jenkins;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
}
常用指令说明:
- proxy_set_header: 设置请求转发时头信息, 通常需要设置 X-Real-IP 和 Host, 保证后台引用服务器拿到真实的访问IP(在有代理时, 如果不设置, 则后端服务器拿到的是代理服务器ip)
4. upstream 相关日志变量
在upstream 模块可以自定义日志格式和日志输出文件, 并且upstream 提供了几个相关的变量:
4.1 server 节点中配置
log_format up_jenkins'$remote_addr - $remote_user [$time_local] "$request"'
'$upstream_addr $upstream_response_time $request_time $upstream_http_content_type';
4.2 location 节点中使用:
location /jenkins {
proxy_pass http://jenkins;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
access_log /var/logs/nginx/upstream.log up_jenkins;
}
变量说明:
- $upstream_addr: 分发给集群中处理请求的服务器的地址信息(ip:port)
- $upstream_status: 服务器的应答状态
- $upstream_response_time: 服务器响应时间(毫秒),多个响应以逗号冒号隔开
- $upstreamhttp$HEADER: 任意的HTTP协议头信息, 如: $upstream_http_host, $upstream_http_content_type
4.3 日志输出
192.168.145.1 - - [14/Jun/2017:16:36:53 +0800] "GET /jenkins HTTP/1.1"192.168.145.100:8180 0.023 0.023 text/html;charset=UTF-8
192.168.145.1 - - [14/Jun/2017:16:36:59 +0800] "GET /jenkins HTTP/1.1"192.168.145.100:8280 0.015 0.015 text/html;charset=UTF-8
4.4 注意
- location 中指定日志之后, 日志就不会再输出到全局配置的日志文件中了