生产服务器Nginx代理返回404本地运行正常故障排查
服务部署故障排查记录
现有部署配置
docker-compose.yml 配置
... frontend: container_name: docker-frontend build: ./frontend restart: unless-stopped command: serve -s dist/vu4y-frontend -l 4200 networks: - docker-network nginx: image: nginx:stable-alpine container_name: docker-nginx ports: - "80:80" volumes: - ./data/nginx/app.conf:/etc/nginx/conf.d/nginx.conf depends_on: - frontend - backend networks: - docker-network ...
Nginx 配置(app.conf)
server { listen 80; server_name mysite.com; location / { proxy_pass http://frontend:4200; } }
故障现象
- 配置此前运行正常,经过若干更新操作后服务异常,所有配置回滚后故障仍存在
- 已尝试操作:重启服务器、删除并重建Nginx容器与镜像,均未解决问题
- 本地运行所有服务完全正常,但访问生产服务器时返回404错误
- 初步怀疑为Nginx缓存或同类问题导致,查看Nginx运行日志未发现明确报错
Nginx 运行日志
.... docker-nginx | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration docker-nginx | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ alienmova-docker-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh docker-nginx | 10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled docker-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh docker-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh docker-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: using the "epoll" event method docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: nginx/1.22.0 docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: built by gcc 11.2.1 20220219 (Alpine 11.2.1_git20220219) docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: OS: Linux 5.4.0-122-generic docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: start worker processes docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: start worker process 23 docker-nginx | 2022/07/14 19:53:51 [notice] 1#1: start worker process 24 .... docker-nginx | 159.223.63.89 - - [14/Jul/2022:20:03:05 +0000] "GET /cms/wp-includes/wlwmanifest.xml HTTP/1.1" 404 1653 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "-" docker-nginx | 159.223.63.89 - - [14/Jul/2022:20:03:05 +0000] "GET /sito/wp-includes/wlwmanifest.xml HTTP/1.1" 404 1653 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "-" docker-nginx | 159.223.63.89 - - [14/Jul/2022:20:03:06 +0000] "" 400 0 "-" "-" "-"
排查思路与解决方案
按优先级从高到低排查:
- 优先验证前端容器服务可用性
进入Nginx容器执行curl http://frontend:4200,如果命令返回404,问题出在前端服务而非Nginx:- 重点核对前端启动命令的路径:当前命令是
serve -s dist/vu4y-frontend -l 4200,进入前端容器执行ls -l dist/确认构建产物的实际路径,多数这类问题是前端更新后构建输出路径变化,dist目录直接就是产物根目录,多拼了一层vu4y-frontend导致serve找不到index.html返回404。注意哪怕配置回滚,如果前端镜像没有彻底清理重新构建,旧的错误构建层会残留。
- 重点核对前端启动命令的路径:当前命令是
- 检查Nginx配置加载冲突
进入Nginx容器执行nginx -T打印所有加载的配置:- Nginx官方镜像会自动加载
/etc/nginx/conf.d/下所有.conf后缀的文件,如果目录下残留了自带的default.conf或者其他历史配置文件,当请求的Host头不匹配你配置的server_name mysite.com时,会命中默认server块返回404。 - 本地验证:在生产服务器上执行
curl -H "Host: mysite.com" http://127.0.0.1,如果返回正常,再执行不带Host头的curl http://127.0.0.1,如果后者返回404,说明你访问时域名解析异常、或者前置CDN/代理转发时带错了Host头。
- Nginx官方镜像会自动加载
- 验证容器网络连通性
分别执行docker inspect docker-frontend和docker inspect docker-nginx,确认两个容器都接入了同一个docker-network,如果前端容器意外接入了默认bridge网络,Nginx无法解析frontend这个域名会转发失败。 - 排除请求落点错误
你贴的日志里所有404记录都是互联网恶意扫描WordPress路径的请求,没有你正常访问站点的请求记录。先在本地客户端ping你的域名,确认解析到的IP是当前生产服务器的IP,排除更新操作后DNS/CDN配置没回滚,请求打到了其他旧服务器的情况。 - 不用排查Nginx缓存:当前配置没有添加任何
proxy_cache相关规则,不存在Nginx缓存导致404的可能。
内容的提问来源于stack exchange,提问作者Peter Shneider
相关产品推荐
相关产品推荐

