【问题标题】:Nginx not working with Node.js + Socket.ioNginx 不适用于 Node.js + Socket.io
【发布时间】:2019-05-21 16:18:39
【问题描述】:

我整天都在尝试让我的 Nginx/React 应用程序连接到我的 Node.js 后端,这在我的开发环境中运行良好。我的前端和后端部署在同一个虚拟机上各自的 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

【问题讨论】:

  • nginx 在 docker 容器上,不是吗?
  • 是的,我正在使用他们的官方容器,但我正在使用此配置来处理我的应用程序。
  • 你在 nginx 容器中ping nodejs 的结果是什么?
  • 不完全确定如何从容器中“ping”,因为它们都只是运行一件事,所以普通的 linux 命令不会真正起作用。但我的前端也在向api/infoblocks/... 路由发出get/post 请求。这很好用,因为它没有使用 socket.io。这只是一条正常的路线。
  • 似乎是 nginx 的配置或容器的对话方式有问题,但它们可以正常的获取/发布请求。所以不知道发生了什么。

标签: node.js reactjs nginx socket.io


【解决方案1】:

经过数小时的努力想弄清楚这一点。我知道了,但是我不知道为什么。

这不是最初发布的,但这是我的后端 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 一起使用的解决方案。

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

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2013-05-03
    • 2023-03-04
    • 2017-06-29
    • 2014-04-25
    • 2023-03-18
    相关资源
    最近更新 更多