配置Nginx简单反向代理时遭遇404 File Not Found问题排查
问题场景
尝试配置Docker化的Nginx反向代理,相关配置与操作如下:
nginx.conf配置
http { server { listen 80 default_server; listen [::]:80 default_server; location /api { proxy_pass http://172.17.0.1:8081/api; } } }
Dockerfile内容
FROM openresty/openresty:latest COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80/tcp ENTRYPOINT ["nginx", "-g", "daemon off;"]
执行命令
docker build . -t my-nginx docker run -p 80:80 my-nginx
错误现象
调用127.0.0.1:80/api收到404响应,Nginx日志显示:
172.17.0.1 - - [02/Jan/2023:14:39:16 +0000] "POST /api HTTP/1.1" 404 159 "-" "Apache-HttpClient/4.5.13 (Java/17.0.5)" 2023/01/02 14:39:16
[error] 7#7: *1 open() "/usr/local/openresty/nginx/html/api" failed
(2: No such file or directory), client: 172.17.0.1, server: localhost,
request: "POST /api HTTP/1.1", host: "127.0.0.1:80"
问题原因
Nginx配置文件不完整:你的
nginx.conf只包含了http块,缺少Nginx运行必需的全局块(如user、worker_processes)和events块。这种不完整的配置会导致Nginx无法正确解析你定义的server反向代理规则,转而使用默认的静态文件根目录(/usr/local/openresty/nginx/html)去查找资源,自然找不到/api路径,返回404。proxy_pass路径拼接问题(潜在隐患):当前
proxy_pass末尾带了/api,当请求/api时,Nginx会将其转发到http://172.17.0.1:8081/api/api,如果后端服务的接口并非嵌套/api/api,这也会导致后端返回404。
修正方案
1. 补全Nginx基础配置
修改nginx.conf为完整结构,确保Nginx能正确加载反向代理规则:
user root; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80 default_server; listen [::]:80 default_server; location /api { proxy_pass http://172.17.0.1:8081/; # 添加常用代理头,避免后端服务无法正确识别请求来源 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. 调整proxy_pass路径
- 如果后端服务的接口是
/api开头(如http://172.17.0.1:8081/api/xxx),保持proxy_pass http://172.17.0.1:8081;(末尾不加斜杠),此时请求/api/xxx会转发到http://172.17.0.1:8081/api/xxx。 - 如果后端服务的接口是根路径开头(如
http://172.17.0.1:8081/xxx),使用proxy_pass http://172.17.0.1:8081/;(末尾加斜杠),此时请求/api/xxx会转发到http://172.17.0.1:8081/xxx。
3. 重新构建并运行容器
docker build . -t my-nginx docker run -p 80:80 my-nginx
内容的提问来源于stack exchange,提问作者Weeedooo

