You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Nginx简单反向代理时遭遇404 File Not Found问题排查

Nginx反向代理404问题排查与解决

问题场景

尝试配置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"


问题原因

  1. Nginx配置文件不完整:你的nginx.conf只包含了http块,缺少Nginx运行必需的全局块(如user、worker_processes)和events块。这种不完整的配置会导致Nginx无法正确解析你定义的server反向代理规则,转而使用默认的静态文件根目录(/usr/local/openresty/nginx/html)去查找资源,自然找不到/api路径,返回404。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:40:25