Nginx报An error occurred

jaredd-craig-JIbfAlOIFw4-unsplash

报错

1
2
3
4
5
6
7
An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should checkthe error log for details.

Faithfully yours, nginx.

An error occurred

起因

早上同事突然说是某某接口突然挂掉了,巴拉巴拉,然后亲自尝试了一下接口又是正常的,但人家又给出了对应的报错页面,还是得排查一下。

排查

  1. bing搜索“An error occurred”相关,大部分都是没有啥用的,说是配置文件或者是重启啥的,不符合我的情况。我这配置文件正常,Nginx代理的其他接口也是正常的。
  2. 排查昨天添加的其他接口,将其注释——无效
  3. 找到一个说是接口限制,理论上不现实
  4. 尝试问Chat-GPT,给出以下一大堆建议

Chat-GPT

如果Nginx出现了”An error occurred”错误,这可能是由于多种原因引起的。为了解决此问题,你可以采取以下步骤进行排查和修复:

  1. 检查错误日志:错误日志通常位于Nginx配置文件中指定的error_log路径下。打开该日志文件,查找与”An error occurred”相关的错误消息或异常信息。这将提供有关发生错误的详细上下文和提示。
  2. 检查配置文件:确保Nginx的配置文件(通常是nginx.conf)没有语法错误或配置错误。使用Nginx的配置检查工具(例如nginx -t)验证配置文件的正确性,并修复任何报告的问题。
  3. 查看服务状态:检查Nginx服务是否正在运行,并且没有出现任何异常。可以使用命令systemctl status nginx(适用于Systemd)或service nginx status(适用于SysV)来查看Nginx服务的状态。
  4. 重新启动Nginx服务:如果Nginx服务正在运行,但出现了错误,请尝试重新启动服务以清除任何临时问题。使用命令systemctl restart nginx(适用于Systemd)或service nginx restart(适用于SysV)来重启Nginx服务。
  5. 检查端口占用:确保Nginx所侦听的端口没有被其他进程占用。使用命令netstat -tlnp(Linux)或lsof -i :端口号来查找特定端口上的进程,如果发现冲突,可以修改Nginx配置文件中的端口号。
  6. 检查防火墙设置:确保防火墙允许对Nginx所监听的端口进行流量传输。根据你的操作系统和防火墙软件,配置相应的规则或例外,以允许端口访问。
  7. 检查资源限制:确保服务器上的资源限制(如文件描述符限制、内存限制等)不会导致Nginx出现错误。可以通过适当调整操作系统的参数或Nginx的配置参数来解决此类问题。

如果上述步骤无法解决问题,建议参考Nginx的官方文档、论坛或社区资源,以获取更具体的帮助和支持。

解决

  • 其中错误日志这个很关键,试着去找日志 /etc/nginx/logs/error.log 再目录下发现access.log日志有点过大52g,都把硬盘占满了,问题应该就是这个了。
1
2
3
4
# 停止Nignx 并删除日志
nginx -s quit & rm access.log
# 启动nginx
nginx

再次尝试调用接口,接口调用正常,成功解决问题

查看了下 error.log 发现谜底早已经给出来了。

1
2
3
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"
2023/07/15 10:18:19 [alert] 17785#0: *152477287 write() to "/etc/nginx/logs/access.log" failed (28: No space left on device) while logging request, client: 10.25.47.10, server: localhost, request: "GET / HTTP/1.1", host: "10.192.15.54:8088"
2023/07/15 10:19:19 [alert] 17785#0: *152477352 write() to "/etc/nginx/logs/access.log" failed (28: No space left on device) while logging request, client: 10.25.47.10, server: localhost, request: "GET / HTTP/1.1", host: "10.192.15.54:8088"

error.log

简单的说是在记录请求时,尝试将日志写入/etc/nginx/logs/access.log文件时发生了一个不完整的写操作,可能是磁盘空间不足、文件权限问题、日志文件被其他进程锁定、存储介质错误、Nginx配置错误

迁移

既然系统盘没啥空间,那就迁移到其他盘里面去

1 、Nginx改配置文件,使其日志文件放到其他盘中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/nginx/nginx.conf
http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /data/tencentCloud/data/logs/nginx/access.log;
error_log /data/tencentCloud/data/logs/nginx/error.log;
}
chmod 0777 /data/tencentCloud/data/logs/nginx/
nginx -s reload

2、创建目录软连接,实现文件放到其他盘中的效果

1
2
3
4
5
6
nginx -s quit
mv /etc/nginx/logs /etc/nginx/logsOld
ln -s /etc/nginx/logs /data/tencentCloud/data/logs/nginx
ln -s [源文件或源目录] [目标文件或者目标目录]
#删除软链接与删除普通文件夹一样, 通过 rm -rf 命令实现.
rm -rf /etc/nginx/logs

结论

  • 日志要定期删除
  • 排查保存步骤可以参考Chat-GPT提供的7步走来排查

参考