通过Nginx部署两个Node.js实例失败:仅一个实例正常运行求助
嘿,我来帮你排查这个问题!你现在遇到的情况是80端口的代理能正常访问,但81端口的/test路径无法连接到Node.js 3001实例,咱们一步步来找出问题并解决:
第一步:确认Node.js 3001实例本身可访问
先排除后端服务的问题——直接在浏览器里访问 http://127.0.0.1:3001,看能不能正常加载内容:
- 如果访问失败:检查你的Node.js代码是否正确监听了3001端口,有没有报错信息,或者用
netstat -ano | findstr :3001(Windows命令)查看端口是否被其他程序占用。 - 如果访问正常:那问题出在Nginx的配置或网络层面,继续往下排查。
第二步:修正Nginx代理路径的常见坑
你的第二个server配置里,proxy_pass的地址末尾没有加斜杠,这是很多新手会踩的坑:
当你访问 http://localhost:81/test 时,Nginx会把完整的/test路径传递给后端,也就是代理到 http://127.0.0.1:3001/test。如果你的Node.js 3001实例没有配置/test这个路由,就会返回404错误。
解决办法有两种,选一种适合你的:
方案A:让Nginx去掉/test前缀后代理
修改proxy_pass,在末尾加上斜杠:
server { listen 81; server_name localhost; location /test { proxy_pass http://127.0.0.1:3001/; # 注意末尾的斜杠 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
这样配置后,访问http://localhost:81/test/xxx会被代理到http://127.0.0.1:3001/xxx,后端只需要处理根路径的路由即可。
方案B:给Node.js 3001实例添加/test路由
如果你的业务逻辑需要/test前缀,那就在Node.js代码里配置对应的路由(比如Express里的app.use('/test', router)),这样Nginx传递的/test路径就能被后端正确处理。
第三步:确保Nginx重载了配置
修改完nginx.conf后,必须让Nginx加载新配置才能生效:
在Windows上,打开管理员身份的命令提示符,进入Nginx安装目录(比如C:\nginx),执行命令:
nginx -s reload
如果之前Nginx没启动,先执行nginx启动服务,再重载配置。
第四步:检查Windows防火墙是否开放81端口
Windows防火墙可能会阻止81端口的入站请求,导致无法访问http://localhost:81:
- 可以临时关闭防火墙测试,如果能访问了,就去防火墙的“高级设置”里添加一条允许Nginx通过81端口的入站规则。
第五步:查看Nginx错误日志定位问题
如果以上步骤都没解决,去Nginx的logs目录打开error.log,看看有没有相关错误信息:
- 比如
connect() failed (10061: No connection could be made because the target machine actively refused it):说明3001实例没启动或者端口不对。 - 比如
404 Not Found:说明后端没有对应的路由,回到第二步调整配置。
按照这些步骤排查,应该就能解决第二个实例无法访问的问题啦!
内容的提问来源于stack exchange,提问作者Ankit

