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

Nodejs不能与nginx反向代理一起工作的socket.io

柴修筠
2023-03-14

我有一个带有Express和Socket.io(Ubuntu18.04)的Nodejs服务器应用程序。在nGinx(1.14)反向代理进入场景之前,它总是工作得很好。nginx服务器运行在Node.js应用程序的不同机器上,每个应用程序都在同一网络中的自己的虚拟机上。

2.1.1版本上的服务器和客户端。

location /company1-srv/ {
     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-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-NginX-Proxy true;
     proxy_redirect off;
     proxy_pass http://172.16.0.25:51001/;
}
// companySrv and URL is actually returned by another service (following code is for illustrative purposes):
let companyUrl = 'https://api.myserver.com/company1-srv';
let companySrv = '/company1-srv'; 

socket(companyUrl, {
      path: companySrv + '/socket.io/'
});

我还尝试删除path选项,并为socket.io东西配置了一个特定的/位置(出于测试目的):

location /socket.io/ {
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection 'upgrade';
   proxy_set_header Host $host;
   proxy_cache_bypass $http_upgrade;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-NginX-Proxy true;
   proxy_redirect off;
   proxy_pass http://172.16.0.25:51001/socket.io/;
}

什么都没起作用。

它连接,但不发射任何东西。过了一段时间(大约一分钟),它变得不可用,引发“Disconnect”(原因:transport close)客户端事件。

const io = require('socket.io')(https || http, {
   transports: ['polling', 'websocket'],
   allowUpgrades: true, 
   pingInterval: 60000*60*24, 
   pingTimeout: 60000*60*24
});

共有1个答案

轩辕修能
2023-03-14

我们还将socket.io与来自ngnix的反向代理一起使用。我可以分享一点我们的设置,也许这有助于排除一切。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

stream {
        log_format      basic   '$time_iso8601 $remote_addr '
                                '$protocol $status $bytes_sent $bytes_received '
                                '$session_time $upstream_addr '
                                '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
        
        access_log /var/log/nginx/stream.log basic;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        ##
        # Server Blocks 
        ##


        # DOMAINEXAMPLE A
        server {
                server_name exampleA.domain.com;
                location / {
                        proxy_set_header        X-Forwarded-For $remote_addr;
                        proxy_set_header        Host $http_host;
                        proxy_pass              http://192.168.21.105:5050;
                 }
        }

        # DOMAINEXAMPLE B
        server {
                server_name exampleB.domain.com;
                location /api {
                        proxy_set_header        X-Forwarded-For $remote_addr;
                        proxy_set_header        Host $http_host;
                        proxy_pass              http://192.168.21.106:5050;
                }
        }

     
}

这里最有趣的部分可能是服务器块

        # DOMAINEXAMPLE A
        server {
                server_name exampleA.domain.com;
                location / {
                        proxy_set_header        X-Forwarded-For $remote_addr;
                        proxy_set_header        Host $http_host;
                        proxy_pass              http://192.168.21.105:5050;
                 }
        }

        # DOMAINEXAMPLE B
        server {
                server_name exampleB.domain.com;
                location /api {
                        proxy_set_header        X-Forwarded-For $remote_addr;
                        proxy_set_header        Host $http_host;
                        proxy_pass              http://192.168.21.106:5050;
                }
        }

对于/http://192.168.21.105:5050的位置,我们有一个正在运行的NodeJS进程,包括socket.io的设置

const express = require('express');
const http    = require('http');
const app     = express();
const server  = http.createServer(app);
const io      = require('socket.io')(server);
const express  = require('express');
const http     = require('http');
const app      = express();
const server   = http.createServer(app);
const io       = require('socket.io')(server, {path: '/api/socket.io'});
const io= require('socket.io')(server, {path: '/api/socket.io'});
const nsp = io.of('/api/frontend');

然后在客户端,连接到它,就像

import io from 'socket.io-client'
const socket = io('https://exampleB.domain.com/api/frontend', {path: "/api/socket.io"});
 类似资料:
  • 据我所知,问题必须与Ngnix反向代理和websockets如何路由有关。服务器对ping请求的答复似乎没有发送到客户端。但我似乎无法确定原因。任何帮助都是非常感谢的。

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

  • 我试图使用Apache创建一个反向代理。我正在使用Apache为一个php应用程序提供服务,并在node中编写了一个使用Express的API。 在我的PHP应用程序中,我使用AJAX调用node来检索JSON。我希望使用端口80进行PHP应用程序中的调用,并使用Apache来表达一个反向代理。

  • 本文向大家介绍nginx正向代理与反向代理详解,包括了nginx正向代理与反向代理详解的使用技巧和注意事项,需要的朋友参考一下 正向代理 就是假设有一个内网 内网有两台机器,这两台机器只有 a 可以上网 b 不能上网,但是 a 和 b 通过网络相连接 这时如果 b 想访问外网,就可以通过 a 来正向代理访问外网 正向代理就是在内网中模拟目标服务器,把内网中其它机器的请求 转发给外网中的真正的目标服

  • 主要内容:1. 代理服务器介绍,2. 将请求传递给代理的服务器,3. 传递请求标头,4. 配置缓冲区,5. 选择传出IP地址本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理服务器的基本配置目录 代理服务器介绍 将请求传递给代理的服务器 传递请求标头 配置缓冲区 选择传出IP地址 1. 代理服务器介绍 代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过

  • Nginx 是一个高性能的 HTTP 和反向代理服务器,代码完全用 C 实现,基于它的高性能以及诸多优点,我们可以把它设置为 hyperf 的前置服务器,实现负载均衡或 HTTPS 前置服务器等。 配置 Http 代理 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 IP 及 端口 server