【问题标题】:Node.js Socket.io WebSocket Nginx Configuration?Node.js Socket.io WebSocket Nginx 配置?
【发布时间】:2023-03-18 11:10:01
【问题描述】:

我正在使用 Citrix 负载平衡器。

在这之后,有 4 个虚拟 Nginx 服务器。 ip 比如 172.16.10.40, 172.16.10.41, 172.16.10.42, 172.16.10.43

还有 1 台测试服务器 172.16.10.50.

Nodejs 安装在位于 172.16.10.50 的测试服务器上。

我已经为 nodejs 创建了一个子域,例如 sub.example.com。

我的 nodejs 应用在 8070 端口上运行。

我想使用 Websocket 而不是 xhr-pooling。 使用下面的代码和配置,在 Chrome 控制台中我看到了

Status Code:101 Switching Protocols

但是 Frames 上没有任何内容。不推。

如果我将 socketURL 更改为

var socketURL   = http://172.16.10.50:8070

Websocket 在测试平台 (172.16.10.50) 中正常工作。

但是,在真正的平台上我必须使用'http://sub.example.com:8070';

如果我设置 socket.io : 'transsports', ['xhr-polling'] ; xhr-polling 正在工作。但我想使用 WebSocket。

 nginx version: nginx/1.4.1 
 node v0.8.8 
 socket.io v0.9.16

我该怎么办?

谢谢。

app.js

var app =
  server = require('http').createServer(app)
  , io = require('socket.io').listen(server,{ log: false })
  , url = require('url')
  , http= require('http')
  ,redis   = require("redis");

//io.set('transports', ['xhr-polling']); 

var livefeed        = redis.createClient();
server.listen(8070);

livefeed.on("message", function(channel, message){
    console.log("%s, the message : %s", channel, message);  
    io.sockets.in(channel).emit(channel,message);
});

io.sockets.on('connection', function (socket) {
    console.log("["+socket.id+"] connected"); 
    socket.on('subscribe', function (data) {
        //console.log("joining : %s",data.channel);
        socket.join(data.channel);
      });
    socket.on('unsubscribe', function(room) {  
        //console.log('leaving room', room);
        socket.leave(room); 
    });
    socket.on('disconnect', function (socket) {
        connected_socket--;
        console.log("Client disconnected");     
        SocketCount();
    });

});

example.js

var socketURL   =   'http://sub.example.com:8070';
var socket      = false;

var BKSocket = {
   connectSocket : function(){
        if(socket === false){
            try{
                socket = io.connect(socketURL,{'connect timeout': 1000});
            }catch(e){
                socket = false;
            }
        }
    },
    livefeeds:function(){
        this.connectSocket();

        if(socket !== false){
            socket.on('connect', function(data){                
                socket.emit('subscribe', {channel:'livefeed'});
            });             
            socket.on('livefeed', function (data) {
                console.log(data);
            });
        }       
    }
}

nginx 配置

upstream backend {
    server 127.0.0.1:8070;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name sub.example.com;

    #server_name _;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://backend/;
        proxy_redirect off;

        #proxy_http_version 1.1;
        #proxy_set_header Upgrade $http_upgrade;
        #proxy_set_header Connection $connection_upgrade;

        access_log off;
        error_log   /var/log/nginx/sub.example.com.error.log;

    }
}

错误日志

2013/11/25 09:40:08 [error] 29812#0: *25900 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/NPXo9XDAKbAapgpyLqCd HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/NPXo9XDAKbAapgpyLqCd", host: "v2.bitenekadar.com"
2013/11/25 09:41:36 [error] 29812#0: *26046 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/RxBjIryz50FjUs1RLqCe HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/RxBjIryz50FjUs1RLqCe", host: "v2.bitenekadar.com"
2013/11/25 09:42:10 [error] 29812#0: *26046 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/ZMuHPZgFcOGmULNdNStr HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/ZMuHPZgFcOGmULNdNStr", host: "v2.bitenekadar.com"
2013/11/25 09:43:17 [error] 29812#0: *26063 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/J3qPn40WioPviZZMNSts HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/J3qPn40WioPviZZMNSts", host: "v2.bitenekadar.com"
2013/11/25 09:45:23 [error] 29812#0: *26181 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/CtOaZ65Dq7dAX6jEOAap HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/CtOaZ65Dq7dAX6jEOAap", host: "v2.bitenekadar.com"

【问题讨论】:

    标签: node.js nginx proxy websocket socket.io


    【解决方案1】:

    你用的是什么版本的 nginx?尽管按照文档做了所有事情,但我们遇到了类似的问题。事实证明,我们的 nginx 版本 (1.2.x) 太旧并且无法正常工作,尽管接受配置没有问题。

    更新到 1.4.4 并且运行良好!

    顺便说一下,这是我们目前正在使用的配置:

    upstream devserver_pc {
        server localhost:9003;
    }
    
    server {
        listen 80;
    
        root /vagrant/pc/static;
        index index.html index.htm;
    
        access_log /var/log/nginx/pc.access.log;
        error_log  /var/log/nginx/pc.error.log;
    
        server_name pc.bvb-infotainment.vm;
    
        client_max_body_size 20M;
        location /static {
            alias /vagrant/pc/static;
        }
    
        location /socket.io/websocket {
            proxy_pass http://devserver_pc;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
        location / {
            proxy_http_version 1.1;
            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             $http_host;
            proxy_set_header   Upgrade          $http_upgrade;
            proxy_redirect     off;
            proxy_pass         http://devserver_pc;
        }
    }
    

    【讨论】:

    • 升级 nginx 是一个很好的建议。如果您在当前稳定为 1.5 时使用 1.1,这可能是一个大问题
    【解决方案2】:

    尝试使用proxy_set_header:

    server {
      listen   80;
      server_name  app.local;
      root  /home/app/public;
      passenger_enabled on;
      rails_env development;
    
      location /any_location {
         proxy_pass http://localhost:3001/realtime_page;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
      }
    }
    

    http://blog.joshsoftware.com/2013/05/28/websocket-over-nginx/

    服务器的响应是什么(标头)?请求头长什么样子?

    【讨论】:

    • 抱歉很久了。我仍然有同样的问题。我已经用我的日志编辑了我的问题。谢谢。
    • @orhanbengisu 你解决了吗?尽管我使用的是 Apache,但我遇到了相同的上游错误。
    • 在使用 socket.io、nodejs (6.10.2) 和 nginx(最新稳定版本:1.11.13)时也遇到此问题
    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2017-03-25
    • 2012-03-11
    • 2015-06-10
    • 2014-06-21
    相关资源
    最近更新 更多