线上Nginx错误汇总
2017-08-04
Linux  / 已有93人围观

    这两天服务器访问量激增,导致 nginx 出现几个错误,通过修改服务器和 Nginx 配置初步解决了,记录如下。


一、错误:768 worker_connections are not enough


    出现这个错误的原因是服务器访问量过大,并发数超过了Nginx设置的最大并发数 768。我的线上服务器是 Ubuntu 系统,Nginx 是通过 apt-get 安装,Nginx 默认配置是这样的:

# sudo vim /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
        worker_connections 768;
        # multi_accept on;
}

    理论上修改worker_connecions 即可,这个值越大,并发数也就越大;但是同时你还要根据实际情况而定,以免服务器CPU撑爆。我是调整为了4096,同时将 worker_processes 改为 4,修改后的配置如下:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
        worker_connections 4096;
        # multi_accept on;
}

    PS:如果 nginx 中 worker_connections 值设置是1024,worker_processes 值设置是 4,按反向代理模式下最大连接数的理论计算公式:

    最大连接数 = worker_processes * worker_connections / 4


二、错误:accept4() failed (24: Too many open files)


    1. 检查&修改 Nginx worker_rlimit_nofile 配置,值越大越好

worker_rlimit_nofile 65535;
events {
        worker_connections 4096;
        # multi_accept on;
}

    2. 检查系统内核的配置

ulimit -n  # 检查当前设置

    如果上述命令发现值过小,可以通过下面的命令修改:

# sudo vim /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535


三、查看 Nginx 当前连接数


    1. 开启 Nginx status 模块,增加 status location,然后通过URL访问查看 Nginx 连接数:

# sudo vim /etc/nginx/nginx.conf
# 在 server 中加上下面的配置

location /status {
    stub_status on;
    access_log /var/log/nginx/status.log;
    auth_basic "NginxStatus";
}

# sudo nginx -t  # 检查 Nginx 配置
# sudo service nginx restart  # 重启 Nginx

    之后在浏览器中输入 http://127.0.0.1/status 查看状态,如下:

Active connections: 1222 
server accepts handled requests
 106255 106255 111994 
Reading: 0 Writing: 1 Waiting: 1221

    结果说明:

Active connections  # 当前 Nginx 正处理的活动连接数
server accepts handledrequests  # 总共处理了106255个连接,成功创建106255次握手,总共处理了111994个请求
Reading  # nginx 读取到客户端的 Header 信息数
Writing  # nginx 返回给客户端的 Header 信息数
Waiting  # 开启 keep-alive 的情况下,这个值等于active-(reading+writing),意思就是Nginx已经处理完正在等候下一次请求指令的驻留连接


    2. 通过命令行查看

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    结果如下:

FIN_WAIT2 40
SYN_RECV 6
CLOSE_WAIT 2
TIME_WAIT 3957
ESTABLISHED 1163
LAST_ACK 93
FIN_WAIT1 27

    说明如下:

CLOSED  # 无连接是活动的或正在进行
LISTEN  # 服务器在等待进入呼叫
SYN_RECV  # 一个连接请求已经到达,等待确认
SYN_SENT  # 应用已经开始,打开一个连接
ESTABLISHED  # 正常数据传输状态/当前并发连接数
FIN_WAIT1  # 应用说它已经完成
FIN_WAIT2  # 另一边已同意释放
ITMED_WAIT  # 等待所有分组死掉
CLOSING  # 两边同时尝试关闭
TIME_WAIT  # 另一边已初始化一个释放
LAST_ACK  # 等待所有分组死掉


Over!

本文地址:http://xianglong.me/article/online-nginx-error-summary/

特别声明:本站文章,如非注明,皆为降龙原创。转载需注明本文链接并保证链接可用。