Nginx配置proxy_pass反向代理访问/subscribe返回404如何解决
问题原因
- 核心问题是Nginx location块内的指令执行优先级:
try_files优先级高于proxy_pass。当前配置下,所有请求进入location /后,Nginx会优先在本地磁盘查找和请求路径匹配的文件、目录,查找失败直接返回404,不会执行反向代理逻辑把请求转发给8064端口的NodeJS应用。 - 访问根路径
/能正常打开首页,是因为Nginx本地站点根目录下存在index.html等默认首页文件,被try_files命中直接返回,并非反向代理规则生效。
解决方法
根据实际部署需求二选一即可,注意proxy_pass的路径拼接规则:如果proxy_pass值包含除了ip+端口外的路径(比如末尾的/、/subscribe这类后缀),Nginx会把请求中匹配location前缀的部分替换成该路径;如果proxy_pass只写ip+端口,会把完整请求路径直接拼接到后端地址上。
场景1:所有请求全部转发给NodeJS应用
如果不需要Nginx处理本地静态文件,所有路径的请求都要转发给8064端口的服务,直接删除try_files指令即可,推荐补充反向代理通用头配置,方便后端获取真实客户端信息:
location / { proxy_pass http://localhost:8064/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
场景2:静态文件由Nginx本地处理,仅接口转发
如果首页等静态资源存放在服务器本地由Nginx直接返回,只有/subscribe这类接口需要转发给NodeJS,就保留根路径的静态文件规则,单独给代理路径配置location块:
# 静态资源走本地文件查找 location / { try_files $uri $uri/ =404; index index.html index.htm; } # /subscribe路径单独走反向代理 location /subscribe { proxy_pass http://localhost:8064; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
配置修改完成后,依次执行以下命令校验配置合法性并重载Nginx生效:
# 校验Nginx配置是否有语法错误 nginx -t # 校验通过后重载配置 nginx -s reload
内容的提问来源于stack exchange,提问作者user3362334
相关产品推荐
相关产品推荐

