Nginx报An error occurred
报错
1 | An error occurred. |
起因
早上同事突然说是某某接口突然挂掉了,巴拉巴拉,然后亲自尝试了一下接口又是正常的,但人家又给出了对应的报错页面,还是得排查一下。
排查
- bing搜索“An error occurred”相关,大部分都是没有啥用的,说是配置文件或者是重启啥的,不符合我的情况。我这配置文件正常,Nginx代理的其他接口也是正常的。
- 排查昨天添加的其他接口,将其注释——无效
- 找到一个说是接口限制,理论上不现实
- 尝试问Chat-GPT,给出以下一大堆建议
Chat-GPT
如果Nginx出现了”An error occurred”错误,这可能是由于多种原因引起的。为了解决此问题,你可以采取以下步骤进行排查和修复:
- 检查错误日志:错误日志通常位于Nginx配置文件中指定的
error_log
路径下。打开该日志文件,查找与”An error occurred”相关的错误消息或异常信息。这将提供有关发生错误的详细上下文和提示。 - 检查配置文件:确保Nginx的配置文件(通常是
nginx.conf
)没有语法错误或配置错误。使用Nginx的配置检查工具(例如nginx -t
)验证配置文件的正确性,并修复任何报告的问题。 - 查看服务状态:检查Nginx服务是否正在运行,并且没有出现任何异常。可以使用命令
systemctl status nginx
(适用于Systemd)或service nginx status
(适用于SysV)来查看Nginx服务的状态。 - 重新启动Nginx服务:如果Nginx服务正在运行,但出现了错误,请尝试重新启动服务以清除任何临时问题。使用命令
systemctl restart nginx
(适用于Systemd)或service nginx restart
(适用于SysV)来重启Nginx服务。 - 检查端口占用:确保Nginx所侦听的端口没有被其他进程占用。使用命令
netstat -tlnp
(Linux)或lsof -i :端口号
来查找特定端口上的进程,如果发现冲突,可以修改Nginx配置文件中的端口号。 - 检查防火墙设置:确保防火墙允许对Nginx所监听的端口进行流量传输。根据你的操作系统和防火墙软件,配置相应的规则或例外,以允许端口访问。
- 检查资源限制:确保服务器上的资源限制(如文件描述符限制、内存限制等)不会导致Nginx出现错误。可以通过适当调整操作系统的参数或Nginx的配置参数来解决此类问题。
如果上述步骤无法解决问题,建议参考Nginx的官方文档、论坛或社区资源,以获取更具体的帮助和支持。
解决
- 其中错误日志这个很关键,试着去找日志
/etc/nginx/logs/error.log
再目录下发现access.log
日志有点过大52g,都把硬盘占满了,问题应该就是这个了。
1 | # 停止Nignx 并删除日志 |
再次尝试调用接口,接口调用正常,成功解决问题
查看了下 error.log
发现谜底早已经给出来了。
1 | 2023/07/15 10:17:19 [alert] 17785#0: *152476480 write() to "/etc/nginx/logs/access.log" was incomplete: 8 of 117 while logging request, client: 10.25.47.10, server: localhost, request: "GET / HTTP/1.1", host: "10.192.15.54:8088" |
简单的说是在记录请求时,尝试将日志写入/etc/nginx/logs/access.log
文件时发生了一个不完整的写操作,可能是磁盘空间不足、文件权限问题、日志文件被其他进程锁定、存储介质错误、Nginx配置错误
迁移
既然系统盘没啥空间,那就迁移到其他盘里面去
1 、Nginx改配置文件,使其日志文件放到其他盘中
1 | vi /etc/nginx/nginx.conf |
2、创建目录软连接,实现文件放到其他盘中的效果
1 | nginx -s quit |
结论
- 日志要定期删除
- 排查保存步骤可以参考Chat-GPT提供的7步走来排查