在使用java web container的时候,我们都在前面挡一层nginx,方便使用各种nginx的功能,设置成代理。 访问特别多的时候发现,服务器上存在大量的TIME_WAIT状态的连接。 经分析,可能是nginx早期版本的upstream还是使用的1.0的短连接代理,java container老是以1.0的方式主动断开进入TIME_WAIT状态,浪费了大量的连接。
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘
修改配置添加keepalive字段到upstream,nginx 与后端的服务器连接默认是使用的http 1.0,这个大家应该都了解,如果设置为HTTP1.1 复用链接的话就会大大降低了tcp开销,节省系统资源
upstream nginx_test {
server 192.168.128.128:8080 weight=5;
server 192.168.128.132:8080 weight=5;
keepalive 20;
# 设置持久连接时间。
}
同时修改配置添加http1.1声明和header中connection重写。
server {
location / {
proxy_http_version 1.1; #开启对http1.1支持
proxy_set_header Connection ""; # 设置Connection为空串,以禁止传递头部到后端,http1.0中默认值Connection: close
proxy_pass http://nginx_test;
}
}
修改后TIME_WAIT大量减少十倍以上
其他优化配置
worker_processes 8;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
开启的工作进程最好与你的硬件CPU个数一致,一味的加大processes,会使得系统的切换开销增大得不偿失
proxy_connect_timeout 180;
proxy_read_timeout 180;
proxy_send_timeout 180; //将nginx与后端的tomcat连接超时,上行超时,下行超时的时间都设置的尽量大,范围大并发的情况下出现502 504.
压缩打开
gzip on;
events
{
use epoll; #nginx事件处理模型,使用于Linux内核2.6版本及以后的系统
worker_connections 204800; #ginx 单个进程的最大并发连接数
}
下面是关于系统连接数的优化
linux 默认值 open files 和 max user processes 为 1024
#ulimit –u
1024
问题描述: 说明 server 只允许同时打开 1024 个文件,处理 1024 个用户进程
使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux 默认只有1024 ,当作负载较大的服务器时,很容易遇到error: too many open files 。因此,需要将其改大。
解决方法:
使用 ulimit –n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535 ,-S 指soft ,-H 指hard)
有如下三种修改方式:
1. 在/etc/rc.local 中增加一行 ulimit -SHn 65535
2. 在/etc/profile 中增加一行 ulimit -SHn 65535
3. 在/etc/security/limits.conf 最后增加:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
具体使用哪种,在 CentOS 中使用第1 种方式无效果,使用第3 种方式有效果,而在Debian 中使用第2 种有效果
# ulimit -n
65535