1. 日常维护
1.1 检查配置文件问题
/app/nginx/sbin/nginx -t
1.2 进程检查
ps -ef|grep nginx
1.3 端口检查
netstat -anput|grep 端口
1.4 查看错误日志
cat /app/nginx/logs/*.log |grep “ERROR”
2. 常见问题处理
2.1 配置语法错误
故障现象:test failed
故障原因:配置语法错误
解决方法:
执行nginx -t命令检查语法,确认语法检查通过,如果语法检查报错,请根据报错提示修正,直到语法检查通过。启动nginx服务,检查监听端口存在。
2.2 目录权限不足
故障现象:failed (13: Permission denied)
故障原因:目录权限不足
解决方法:
检查nginx目录宿主和权限,如果是要求以nginx用户启动服务,要确保目录的用户和组都是nginx。
su - nginx
$ /nginx/nginx/sbin/nginx -c /nginx/nginx/conf/nginx.conf
nginx: [alert] could not open error log file: open() "/nginx/nginx/logs/error.log" failed (13: Permission denied)
2019/12/29 10:54:51 [warn] 7938#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /nginx/nginx/conf/nginx.conf:3
2019/12/29 10:54:51 [emerg] 7938#0: open() "/nginx/nginx/logs/access.log" failed (13: Permission denied)
2.3 端口权限不足
故障现象:bind() to 0.0.0.0:80 failed (13: Permission denied)
故障原因:端口权限不足
如果监听端口是1024以下的特权端口,如80和443,还需要配置sudo,确保nginx普通用户能够启动特权端口。
$ /nginx/nginx/sbin/nginx -t
nginx: the configuration file /nginx/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
nginx: configuration file /nginx/nginx/conf/nginx.conf test failed
解决方法:
以root身份添加nginx用户sudo权限,【在倒数第二行 ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment) 行上面增加以下内容】
visudo
Allow nginx user start nginx service
Cmnd_Alias NGXCMD=/nginx/nginx/sbin/nginx
nginx ALL=NGXCMD
修改后以nginx用户sudo方式执行,正常
$ sudo /nginx/nginx/sbin/nginx -t
[sudo] password for nginx:
nginx: the configuration file /nginx/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /nginx/nginx/conf/nginx.conf test is successful
2.4 服务启动失败
故障现象:Address already in use
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
故障原因:网络端口被占用
解决方法:使用netstat -antp|grep nginx |grep LISTEN 检查端口是否被占用,如有则把对应的停止或把进程kill掉,然后再启动nginx服务
2.5 无法访问网页
故障现象:浏览器访问网页无法打开
故障原因:防火墙未开放nginx端口
解决方法:
通常情况下,操作系统防火墙应该是关闭的,如果无开启了iptables服务,请关闭,执行命令:
service iptables stop
如果确实配置了防火墙测试,请检查nginx端口或服务是否在防火墙允许列表里查或添加相关允许nginx端口外部访问策略
防火墙示例:【假设当前nginx监听端口是80】
查看当前防火墙策略
# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:8080
当前配置的防火墙策略显示端口80被禁止,所以访问nginx的80端口的流量都被丢弃。
删除被禁用80端口策略
iptables -D OUTPUT 2
添加允许访问nginx端口80策略
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
保存防火墙策略
service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
再次查看防火墙策略,显示端口80访问开放;
iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:8080
使用浏览器测试nginx web网站访问正常。
2.6 404 bad request
一般原因:请求的Header过大
解决方法:修改nginx.conf相关设置
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
2.7 413 Request Entity Too Large
一般原因:一般出现在上传文件
解决方法:修改 nginx.conf相关设置,
client_max_body_size 10m;
修改php.ini如下(必须和nginx.conf配置一致)
post_max_size=10M
upload_max_filesize=2M
修改后重新加载nginx.conf或重启nginx服务。
2.8 499 Client Closed Request
一般原因:客户端在为等到服务器相应返回前就关闭了客户端连接。一般出现在客户端设置超时后,主动关闭socket.
解决方法:根据实际Nginx后端服务器的处理时间修改客户端超时时间。
修改后重新加载nginx.conf或重启nginx服务。
2.9 500 Internal Server Error
原因较多,主要有3类:
(1)语法错误(如php语法错误),
解决方法:查看nginx_err_log 和php_err_log,修正语法。
(2)访问量过大,系统资源限制,不能打开过多文件
解决方法:
1.修改nginx配置文件,
worker_rlimit_nofile 65535;
修改后重新加载nginx.conf或重启nginx服务。
2.修改系统/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
修改系统limits值后需要关闭当前所有nginx服务,退出当前nginx用户,重新登录后系统limit值才能生效,有时候可能需要重启操作系统。
(3)磁盘空间不足。(access log开启可能导致磁盘满溢关闭)
解决方法:查看磁盘空间,扩容磁盘或清理旧的日志文件。
2.10 503 Serveice Unavailable
一般原因:后端服务无法处理,业务中断。
解决方法:从后端日志获取错误原因,解决后端服务器问题。
2.11 504 Gateway Timeout
一般原因1:后端服务器在超时时间内,未响应Nginx代理请求
解决方法:根据后端服务器实际处理情况,调正后端请求超时时间。
proxy_read_timeout 90;
proxy_send_timeout 90;
一般原因2:可能网站页面缓存大,而fastcgi默认进程响应缓存区8k
解决方法:配置nginx.conf相关设置
fastcgi_buffers 8 128k
send_timeout 60;
2.12 端口绑定失败
问题现象 nginx error日志中出现下面报错:
2019/08/03 10:31:32 [emerg] 2952#2956: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
问题说明 nginx使用了80端口小于1024,使用80端口需要nginx运行在root或administrator用户下面
解决方法 使用其他大于1024的端口运行nginx或者使用root/administrator用户运行nginx
2.13 too many open files
问题现象 nginx error日志中出现下面报错:
服务器提示“too many open files”
问题说明 nginx进程打开的文件数超出了限制
解决方法 :
1.nginx连接数增加
# vim /usr/local/nginx/conf/nginx.conf
-----
worker_process 1; //与cpu核心数量一致
events {
worker_connections 200000; //每个worker的最大并发连接数
use epoll;
}
//epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
# /usr/local/nginx/sbin/nginx -s reload
2.linux内存参数优化
# ulimit -a
# ulimit -Hn 10000 //设置硬限制(临时规则)
# ulimit -Sn 10000 //设置软限制(临时规则)
# vim /etc/security/limits.conf //在最后一行后追加
* soft nofile 100000
* hard nofile 100000
//用户 /组 硬限制/软限制 需要限制的项目 限制的值
3.配置修改后测试
ab -n 10000 -c 5000 http://192.168.1.15
2.14 访问400/414
问题现象 URI过长或request header过大导致400或414报错
问题说明 当http 的URI太长或者request header过大时会报414 Request URI too large或400 bad request错误
解决方法 修改两个参数
参数一:
#client_header_buffer_size:客户端请求头缓冲区大小,
client_header_buffer_size 128k;#如果请求头总长度大于小于128k,则使用此缓冲区
参数二:
large_client_header_buffers:请求头总长度大于128k时使用large_client_header_buffers设置的缓存区
large_client_header_buffers 4 128k;
large_client_header_buffers 指令参数4为个数,128k为大小,默认是8k。申请4个128k。
2.15 访问502
问题现象 Nginx 502 Bad Gateway 错误
问题说明 浏览器访问nginx出现502报错码
日志中出现下面的报错
13:33:47 [error] 15421#0: *16 upstream sent too big header while reading response header from upstream
解决方法 nginx.conf中修改下面配置:
1. fastcgi缓冲区设置过小
http{}中添加下面配置
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
2. 代理缓存区设置过小
location{}中添加下面配置
_buffer_size 64k;
_buffers 32 32k;
_busy_buffers_size 128k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2.16 connect() failed、Connection refused、 Connection reset by peer
问题现象 nginx部分连接无法提供正常服务
问题说明 在error错误日志中报警信息包含connect() failed、Connection refused、 Connection reset by peer等,则说明有可能nginx出现的连接数超负载等情况。
解决方法
(1)查看系统的网络连接数情况确认是否有较大的链接数
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
解析:
CLOSED //无连接是活动的或正在进行
LISTEN //服务器在等待进入呼叫
SYN_RECV //一个连接请求已经到达,等待确认
SYN_SENT //应用已经开始,打开一个连接
ESTABLISHED //正常数据传输状态/当前并发连接数
FIN_WAIT1 //应用说它已经完成
FIN_WAIT2 //另一边已同意释放
ITMED_WAIT //等待所有分组死掉
CLOSING //两边同时尝试关闭
TIME_WAIT //另一边已初始化一个释放
LAST_ACK //等待所有分组死掉
(2)查看系统的句柄配置情况,ulimit -n ,确认是否过小(小于请求数)
(3)查看配置文件(nginx.conf) worker_rlimit_nofile、worker_connections配置项,是否过小(小于请求数)
(4)修改参数后重新启动Nginx服务
停止nginx ./nginx -s stop
启动nginx ./nginx
2.17 NGINX各个worker process之间的连接数分布不均
问题现象 通过netstat -nap |grep nginx |awk print ‘$(IF-1)’ |sort| unig -c |sort -n
可见大量worker process只处理了少量链接
问题说明 Kernel工作机制所控制
解决方法 启用SO_REUSEPORT功能
listen 80 reuseport;