我一直在努力使Nginx / React应用程序连接到Node.js后端,该后端在我的开发环境中可以正常工作。我的前端和后端部署在同一台VM上各自的Docker容器中。 Nginx容器可以直接与Node.js容器进行通信,并且可以正常工作,因为其他get / post请求可以正常工作。
这是我最初的Nginx配置。
server {
listen 80;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
//This is the initial route to connect to socket.io
location /api/notices {
proxy_pass http://nodejs:8000;
}
location ~ ^/api/infoblock/[0-9a-zA-Z]+$ {
proxy_pass http://nodejs:8000;
}
}
这是我在控制台中遇到的错误:
POST http://domain_name/socket.io/?EIO=3&transport=polling&t=MVFZtgP 405 (Not Allowed)
我在网上做了更多研究,并被告知也要添加以下内容:
location /socket.io/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_pass http://nodejs:8000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
}
当我这样做时,405错误消失了,但是实际上似乎什么也没有发生。我没有从socket.io连接中获取任何数据,并且在控制台中没有抛出任何内容。
我不确定该怎么做。我已经尝试了很多在网上找到的“解决方案”,但似乎无法弄清为什么socket.io连接不起作用,但是正常的get / post请求可以解决这个问题。
这是我从前端进行连接的方式,再次证实了这在我的开发环境中可以正常工作。
let socket = socketIOClient("/api/notices");
socket.on("NoticesReact", this._socketNotices);
如何修复我的Nginx配置以与Node.js + Socket.io一起使用
答案 0 :(得分:0)
经过数小时的尝试来解决这个问题。我知道了,但是我不确定为什么。
这不是最初发布的,但这是我的后端socket.io代码的样子:
io.of("/api/notices").on("connection", socket => {...})
在尝试了几乎所有内容之后,我决定删除我的自定义名称空间.of("/api/notices")
,这是将套接字限制为名称空间的一种方式。这在开发中起作用,并记录了here on socket.io。
所以现在我的Nginx配置看起来像这样:
server {
listen 80;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /socket.io/ {
proxy_pass http://nodejs:8000;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ ^/api/infoblock/[0-9a-zA-Z]+$ {
proxy_pass http://nodejs:8000;
}
}
神奇地……一切正常?但是我不知道为什么删除我的自定义名称空间是使其与Nginx一起使用的解决方案。
如果有人能弄清楚为什么删除自定义名称空间的原因,请随时对此发表评论。