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;
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginx