Nginx反向代理socket.io服务时请求socket.io.js返回404故障排查
404错误触发原因
- Nginx配置中
location /和location /socket.io/块都添加了try_files $uri $uri/ =404规则,该规则优先级高于反向代理转发规则,Nginx会优先查找本地磁盘对应路径的文件,找不到就直接返回404,不会将请求转发给运行在5000端口的Node服务,因此/socket.io/socket.io.js请求直接被拦截返回404。 location /socket.io/的proxy_pass配置存在路径拼接错误,socket.io服务本身会处理/socket.io前缀的请求,不需要在proxy_pass地址后额外拼接/socket.io路径,否则会导致路由匹配失败。- 缺少socket.io WebSocket握手必须的配置项,未关闭相关请求缓存,也可能导致请求异常。
解决方案
直接修改Nginx配置,替换原有location /和location /socket.io/块内容即可,静态资源匹配的规则可以保留不变:
location /socket.io/ { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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; proxy_cache_bypass $http_upgrade; } location / { proxy_set_header X-forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://localhost:5000; }
修改完成后按顺序执行以下操作:
- 执行
nginx -t检查配置语法是否正确,确认返回success提示 - 执行
nginx -s reload重载Nginx配置 - 重启Node服务,清空浏览器缓存后重新访问即可恢复正常
你的服务端代码、前端引入socket.io.js的写法没有问题,修改Nginx配置后即可解决404报错。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

