Nginx同端口配置多Node.js应用 访问/dictionary路径404问题
错误原因
你遇到的404错误是Nginx的proxy_pass路径拼接规则导致的:
- 当
proxy_pass的目标地址末尾不带斜杠时,Nginx会将location匹配到的完整路径原样转发给上游服务。你当前访问example.com/dictionary/时,实际转发给3001端口Node.js应用的请求路径是/dictionary/,而该应用没有对应前缀的路由,因此返回错误。 - 你通过8088、444端口测试时正常,是因为这两个端口的配置直接把根路径请求转发给3001,转发路径和应用路由匹配。
修复方案
只需修改80/443端口server块下/dictionary/路径对应的proxy_pass配置,在目标地址末尾添加斜杠即可。添加斜杠后Nginx会自动去掉/dictionary/前缀再转发请求,和8088端口的转发逻辑保持一致。
修改后的完整Nginx配置如下:
http { server { listen 80; listen 443 ssl; ssl_certificate /etc/..; ssl_certificate_key /etc/..; location /dictionary/ { # 仅修改此行,末尾添加斜杠 proxy_pass http://localhost:3001/; # 可选补充配置,避免应用获取请求信息异常 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; } location / { proxy_pass http://localhost:3000; # 同上,也可补充上述proxy_set_header配置 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; } } server { listen 8088; listen 444 ssl; ssl_certificate /etc/..; ssl_certificate_key /etc/..; location / { proxy_pass http://localhost:3001; 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; } } } events { }
修改后执行nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者maaartin
相关产品推荐
相关产品推荐

