首页 > 系统相关 >Nginx日常维护及常见问题处理

Nginx日常维护及常见问题处理

时间:2023-08-13 16:34:52浏览次数:44  
标签:常见问题 nginx 0.0 header 端口 Nginx 日常 conf 80

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;

标签:常见问题,nginx,0.0,header,端口,Nginx,日常,conf,80
From: https://blog.51cto.com/u_13482808/7067828

相关文章

  • Nginx配置不记录静态文件、过期时间
    用户访问web网站,通常日志文件会记录很多web站点上的一些静态文件信息,如果长期不处理,日志文件会越来越大,占用的系统资源也越大,此时就需要我们配置不记录静态文件和过期时间,减少日志文件记录过多不必要的内容信息和系统资源占用。1配置1.1编写conf文件[root@host~]#vim/usr/local/......
  • 服务器常见问题答疑
    前篇#为什么要写这篇文章呢 现在属于网络时代,服务器的使用越来越广泛,网站搭建、软件开发、游戏开发和区块链等都是需要在服务器里操作搭建的,花时间写这篇文章是希望能有更多的人对服务器有更好的认识 一、##检查哪些尝试入侵服务器的ip命令ubuntu查看尝试登录服务器的ip,一般用......
  • nginx中location的写法有哪些?优先级是什么呢?rewrite如何使用?
    主要内容:一、location匹配的规则和优先级(重点,面试会问,工作用得到)二、nginx常用的问题(要求掌握)三、rewrite:重定向功能(有掌握,有理解),重定向的标识位,标识位的四种类型是重点在工作中配置nginx,主要配置locationlocation匹配:用正则表达式URI:统一资源标识符,是一种字符串标识,用于标识......
  • 常见问题
    vscode自动将CRLF格式转为LF格式​​警告:DeleteCReslint原因:换行符为CRLF格式的,应该改为LF格式(这个文件之前是被苹果电脑编辑过)解决方法:安装插件EditorConfigforVSCode在根目录新建文件.editorconfig写入以下代码root=true[*]charset=utf-8indent_......
  • 若依不分离 部署阿里云 nginx代理配置
    server{listen80;server_name域名;include/etc/nginx/default.d/*.conf;location/{proxy_passhttp://127.0.0.1:18089; #内网端口proxy_set_headerHost$http_host;......
  • 使用nginx进行负载均衡
    目录1、nginx负载均衡介绍2、nginx负载均衡策略我使用了三台VPS服务器,同一网段的,用来搭建网站,推荐你们也可以使用3A服务器1、nginx负载均衡介绍nginx应用场景之一就是负载均衡。在访问量较多的时候,可以通过负载均衡,将多个请求分摊到多台服务器上,相当于把一台服务器需要承担的负......
  • Nginx中的rewrite指令(break,last,redirect,permanent)
    rewite在server块下,会优先执行rewrite部分,然后才会去匹配location块server中的rewritebreak和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空location中的rewirte:不写last和break-那么流程就是依次执行这些rewrite1.rewritebreak-url重写后,直......
  • nginx源码分析之http解码实现
    分析nginx是如何解析并且存储http请求的。对非法甚至恶意请求的识别能力和处理方式。可以发现nginx采用状态机来解析http协议,有一定容错能力,但并不全面相关配置 跟解码有关的配置 merge_slashes 语法merge_slasheson|off默认值on上下文httpserver说明支持解析请求行时,合并相......
  • Apache Nginx中记录自定义Header
    从Apache切到Nginx需要保持日志格式统一,以便兼容之前的数据统计脚本现在Apache的日志格式为:LogFormat"%h%t%m%U%q%>s%{HEAD}i%D"说明:%h:客户端IP地址%t:时间(标准英语格式)%m:请求的方法(GET,POST)%U:请求的URL路径,不包含查询字符串%q:查询字符串%>s:请求的最终状态%{HEAD}i:请......
  • nginx优化加强战斗力及遇到的坑解决
    先说遇到个坑,第一个是负载问题,这个问题与架构有关,由于我设计架构多了两层,结果导致会话负载只转向一个。解决这样的问题思路有两个:一是改变负载策略,二是更改架构设计。由于采用动静分离部署,而nginx又设计了静态,结果客户端去读nginx静态,访问量上来,页面加载很慢。解决:二者......