Socket.io 不适用于 nginx

Posted

技术标签:

【中文标题】Socket.io 不适用于 nginx【英文标题】:Socket.io not working with nginx 【发布时间】:2017-10-17 18:45:55 【问题描述】:

我有一个运行良好的 django 网站,由 gunicorn 和 nginx(作为代理服务器)提供服务,现在我想使用 socket.io 和 nodejs 在该网站中添加聊天机制。问题是,当我将 socketio 直接连接到 nodejs 服务器(正在侦听端口 5000)时,聊天工作得非常好,但是当我尝试使用 nginx 将 socketio 请求代理到 nodejs 时,它不起作用。

这是我在 /sites-enabled/ 目录中的 nginx 文件

server 
    listen 80;
    server_name 127.0.0.1;

    location = /favicon.ico 
        access_log off;
        log_not_found off;
    
    location /static/ 
        root /path/to/static;
    
    location / 
        include proxy_params;
        proxy_pass http://unix:/path/to/file.sock;
    

    location /socket.io/ 
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    

顺便说一句,我正在使用 pm2 来管理 nodejs(如果有什么不同的话)。

编辑:

server.js:


var io = require('socket.io').listen(5000);
var fs = require('fs');

io.on('connection', function(socket)
    console.log('connected');


    socket.on('question', function(data)
        console.log(data);
        soc.emit('question', data);
    );

    socket.on('advice', function(data)
        console.log(data);
        soc.emit('advice', data);
    );

    socket.on('disconnect', function() 
        console.log('disconnected');
    );
);




client.js

var socket  = io('http://127.0.0.1/socket.io/');


socket.on('question', function(data)
    console.log(data);
);


socket.on('advice', function(data)
    console.log(data);
);

$('#send').click(function() 

    var msg     = $('#msg').val();

    if (msg == '') $('#msg').focus();
    else

        data = msg:msg;
        socket.emit('question', data);

        var msg = $('#msg').val('').focus();
      
);

【问题讨论】:

你能定义“它不起作用”吗? HTTP错误? JS 错误? 我没有看到任何错误。该网站正常运行。 console.log(browser) 中没有错误,并且在客户端-服务器连接成功后,我可以看到带有“pm2 logs app_name”的nodejs服务器的输出,因此建立了连接。还有其他地方可以找到错误吗? 客户端-服务器连接成功,但消息没有传输到其他客户端。 Node服务器是否收到客户端发来的消息?您还可以在调试模式下启动 Node 服务器,以便记录更多信息:env DEBUG=* node server.js(或 Windows 等效项) 不,连接成功,但是节点服务器没有收到消息。 【参考方案1】:

您用于客户端的 URL 不正确:

var socket = io('http://127.0.0.1/socket.io/');

添加路径(在本例中为/socket.io/)在连接字符串中具有特殊含义:它反映了您希望客户端连接到的namespace。

因为你没有使用命名空间,你应该把它关掉:

var socket = io('http://127.0.0.1/');
// Or possibly even just this:
// var socket = io();

【讨论】:

谢谢!我对这个几乎失去了理智。

以上是关于Socket.io 不适用于 nginx的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 不适用于 nginx

CORS 不适用于 hapijs 和 socket.io

Socket.io + NodeJS 不适用于 Heroku

socket.io 广播不适用于 React

socket.io 连接不适用于 react.js

node.js 中的 socket.io 不适用于 3G 移动网络