Nginx无法与Node.js + Socket.io一起使用

时间:2018-12-21 07:12:07

标签: node.js reactjs nginx socket.io

我一直在努力使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一起使用

1 个答案:

答案 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一起使用的解决方案。

如果有人能弄清楚为什么删除自定义名称空间的原因,请随时对此发表评论。