Nginx反向代理间歇性返回404问题排查求助
间歇性Nginx反向代理404故障排查求助
环境详情
- EC2实例(m5.xlarge):
- 系统:amzn-linux 2,CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
- Docker Compose版本:v2.13.0
- Docker版本:20.10.17,build 100c701
- 仅部署Docker及Docker Compose相关环境,无其他运行服务
- EC2实例位于AWS ALB目标组内,为组内唯一实例
- 通过
docker-compose up -d启动服务,使用最新版Nginx镜像
问题现象
启动初期运行正常,无错误。但运行1-3天后,开始间歇性返回404错误:
- 失败请求随机,可能是index.html、.js、.css或图片等静态资源
- 每次刷新页面通常有2-3个请求返回404,失败请求不固定,其余请求返回200
- 日志呈现近乎“隔一个请求就404”的规律,问题持续且无法自行恢复
临时解决方法
执行docker-compose down再docker-compose up重启服务,问题立即解决,但1-3天后会再次复发。
日志示例(docker-compose logs)
nginx | 10.0.51.10 - - [10/Sep/2023:01:58:55 +0000] "GET /dataportal/favicon.ico HTTP/1.1" 200 1706 "https://xxxxxxx.xxxxxxxx.com/dataportal/dashboards" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" nginx | 10.0.51.10 - - [10/Sep/2023:01:58:55 +0000] "GET /dataportal/static/css/main.3fb3fe79.css HTTP/1.1" 200 86129 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" nginx | 10.0.51.10 - - [10/Sep/2023:01:58:55 +0000] "GET /dataportal/static/js/main.5c5d85b7.js HTTP/1.1" 404 967 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" nginx | 10.0.51.10 - - [10/Sep/2023:01:58:56 +0000] "GET /api/dataportal/dashboards HTTP/1.1" 200 2043 "https://xxxxxxx.xxxxxxxx.com/dataportal/dashboards" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" nginx | 10.0.52.62 - - [10/Sep/2023:01:58:57 +0000] "GET /dataportal/static/css/main.51fa6b06.css HTTP/1.1" 200 1706 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AkamaiImageServer VelocitudeMP/1.0;IM/1.0" nginx | 10.0.51.10 - - [10/Sep/2023:01:58:57 +0000] "GET /dataportal/static/js/main.d4bbd5f8.js HTTP/1.1" 404 967 "-" "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AkamaiImageServer VelocitudeMP/1.0;IM/1.0"
日志中仅存在200和404状态记录,无其他错误信息。
配置文件
~/nginx.conf
events { worker_connections 4096; ## Default: 1024 } http { server { listen 80; location = /health { access_log off; add_header 'Content-Type' 'application/json'; return 200 '{"status":"UP"}'; } location / { proxy_pass https://XXXXXXXXXXXX.us-east-1.elb.amazonaws.com; proxy_set_header Host $host; } } }
~/docker-compose.yml
version: "3" services: nginx: container_name: nginx image: nginx:latest ports: - "80:80" #- "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf
已尝试排查步骤
- 确认Docker Compose服务正常运行,日志仅包含200和404状态
- 验证无其他人员访问或修改服务器/容器
- 多次重启Docker Compose,每次均可临时解决问题,但1-3天后复发
- 故障发生时检查
top(CPU/内存)和df(磁盘空间),资源使用率极低,磁盘占用30%,EC2实例及Cloudwatch监控无异常 - 确认后端ALB资源状态正常,问题锁定在反向代理服务
排查建议
配置Nginx长连接复用
默认Nginx未配置keepalive参数,长时间运行可能导致连接复用异常。修改nginx.conf的http块:upstream backend { server XXXXXXXXXXXX.us-east-1.elb.amazonaws.com; keepalive 64; }然后将
location /中的proxy_pass改为proxy_pass https://backend;,同时添加:proxy_http_version 1.1; proxy_set_header Connection "";确保长连接正常复用。
禁用Nginx缓存与缓冲
若Nginx默认开启缓存,可能出现资源不匹配或过期问题。在location /块中添加:proxy_cache off; proxy_no_cache 1; proxy_buffering off;测试是否还会出现404。
指定稳定版Nginx镜像
当前使用nginx:latest可能存在未知bug,切换到具体稳定版本(如nginx:1.25.3),避免自动更新到有问题的版本。监控容器网络状态
故障发生时,在EC2实例执行docker stats查看Nginx容器的网络收发情况,用netstat -an | grep ESTABLISHED检查与后端ALB的连接数,确认是否存在异常连接堆积。开启Nginx调试日志
修改nginx.conf的http块添加:error_log /var/log/nginx/error.log debug;重启服务后等待故障出现,查看调试日志中是否有连接失败、DNS解析异常等细节。
内容的提问来源于stack exchange,提问作者pcb
相关产品推荐
相关产品推荐

