当前位置: 首页 > 知识库问答 >
问题:

Ngin x不工作与Node.jsSocket.io

于嘉许
2023-03-14

我一整天都在尝试让我的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;
  }
}

这是我在控制台上看到的错误:

< code > POST http://domain _ name/socket . io/?EIO=3

我在网上做了更多的研究,被告知还要添加类似的内容:

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 连接获取任何数据,控制台中也没有抛出任何内容。

我不确定我需要做什么。我在网上找到了很多“解决方案”,但似乎无法理解为什么会出现插座。io连接不起作用,但正常的get/post请求会起作用。

这里是我如何从前端连接,这再次证实了在我的开发环境中的工作。

let socket = socketIOClient("/api/notices");
socket.on("NoticesReact", this._socketNotices);

如何修复我的nginx配置以使用Node.js Socket.io

共有1个答案

贝自怡
2023-03-14

经过几个小时的努力。我明白了,但是,我不知道为什么。

这最初没有发布,但这是我的后端 socket.io 代码的样子:

io.of("/api/notices").on("connection", socket => {...})

在尝试了几乎所有的方法后,我决定删除我的自定义命名空间,. of("/api/的通知"),这是一种限制套接字到一个命名空间的方法。

所以现在我的Ngin x配置看起来像这样:

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一起工作的解决方案。

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

 类似资料:
  • 我在digital ocean上创建了一个新实例,并安装了laravel(通过克隆我所从事的git回购)。然后我为nginx配置了默认配置,但该站点甚至无法远程访问。 brwoser中的答案是:“SERVERIP当前无法处理此请求。” 我得到的错误就是这个错误。日志 PHP消息:PHP致命错误:require():无法打开required'/var/www/mfserver/bootstrap//

  • 为了版本控制和安全,我想将两个Dockerfile合并为一个,然后为. sock=创建一个目录 第一个Dockerfile一半 第二个Dockerfiel代码是这个PHP代码的一半,相应的文件比这个代码高一级。我不会公开9000端口并注释掉CMD。所有这些都通过supervisord进行管理。 我在docker compose的帮助下构建了它 当我这样运行它时,设置php和nginx conf来使

  • 错误:活动:自2018-04-09周一16:35:28 IST以来失败(结果:退出代码);进程:22654 ExecStart=/usr/sbin/nginx(代码=退出,状态=1/失败)Apr 09 16:35:28 localhost。localdomain systemd[1]:无法启动nginx HTTP和反向代理服务器。

  • 我尝试在GKE集群(版本1.21.5-gke.1302)中使用ingress和cert-manager来公开ArgoCD,但是证书没有颁发。 重现步骤: > 安装证书管理器应用此 yaml 在运行helm的情况下安装ngin x入口控制器: 应用以下内容创建集群颁发者: 使用本指南和文件应用入口: < li >将入口控制器的ip映射到您的主机名。 预期行为:我期望证书被成功创建并可以访问应用程序。

  • 而且,如果我添加这样的内容: 单击它,我将正确地发送到,它显示中的内容。 这一切都按预期进行,而且非常完美。 我在这里做错了什么?我需要重写请求路径吗?

  • 我有一个带有Express和Socket.io(Ubuntu18.04)的Nodejs服务器应用程序。在nGinx(1.14)反向代理进入场景之前,它总是工作得很好。nginx服务器运行在Node.js应用程序的不同机器上,每个应用程序都在同一网络中的自己的虚拟机上。 2.1.1版本上的服务器和客户端。 我还尝试删除path选项,并为socket.io东西配置了一个特定的/位置(出于测试目的):