nginx 是一个轻量级,高可用的web服务器,经常做正向代理及反向代理,web应用负载均衡,web静态资源分离。下面记录下最近公司在项目中用nginx做负载均衡解决服务器压力及宕机处理配置。
下面是线上nginx配置文件详情
#user nobody;
worker_processes 4;
pid logs/nginx.pid;
events {
worker_connections 8000;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream site{
ip_hash;
server 152.16.214.161:9002;
server 152.16.214.162:9003;
server 152.16.214.163:9004;
}
server {
listen 80;
server_name localhost;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://site;
}
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
主要有以下参数要处理
1.worker_processs 4;这里根据服务器的cpu核数来决定
2.worker_connections 8000;
并发总数是worker_processes和worker_connection的乘积,并发总数需要小于系统总最大句柄数服务器
3.keepalive_timeout 65;
这里是http请求保持连接的时间,如果上传文件较大耗时较长那么这个参数时间设置过短将会上传未成功自动断开连接,如果时间过长连接数过多,超过
第一和第二参数配置的值将会宕机
4.upstream 实现负载轮询功能,这里悬着ip_hash的轮训分配方式,选择这个方式的目的是为来解决session共享的问题。
upstream site{
ip_hash;
server 152.16.214.161:9002; 服务器一
server 152.16.214.162:9003; 服务器二
server 152.16.214.163:9004;服务器三
}
其中三台服务器内网ip处于同一个网段的,处理比较快。
5.proxy_set_header Host $host:$server_port
这里重定向了请求头的IP和端口,如果监听是非80端口必须加上$server_port
6.proxy_set_header X-real-ip $remote_addr
web服务器如果需要获取可以客户端ip时正常情况下未作代理可直接通过request.getHeader("remote_addr")方法来获取的,但是通过nginx代理后就会获取的是nginx服务器的ip,
所以需要重新给请求头的remote_addr重新赋予一个新的值web服务器可通过request.getHeader("X-Real-IP")获取真实客户端ip。
7.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
这里是将$proxy_add_x_forwarded_for添加到X-Forwarded-For里去,是增加不是覆盖。负载均衡中若使用两台nginx并在不同的ip服务器上,并且都使用了这段配置,那你会发现在 web服务器端通过request.getHeader("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip这两个值($proxy_add_x_forwarded_for变量包含客户端请求头中的"X- Forwarded-For",与$remote_addr两部分,他们之间用逗号分开,第5条配置和第6条配置都能获取真实ip但是具体区别没亲自实验过)