Socket.io与nginx无法配合使用。

3
我有一个良好运作的Django网站,它由gunicorn和nginx(作为代理服务器)提供服务。现在我想使用socket.io和nodejs在该网站中添加聊天机制。问题在于,当我直接连接到侦听端口5000的nodejs服务器时,聊天功能完美地运作,但是当我尝试使用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();
    }  
});

我没有看到任何错误。网站正常运行。在console.log(browser)中没有错误,我可以在成功的客户端和服务器连接后使用'pm2 logs app_name'命令查看nodejs服务器的输出,所以连接已经建立。还有其他地方可以找到错误吗? - atx
客户端和服务器的连接成功了,但是消息没有传输到其他客户端。 - atx
Node服务器是否接收来自客户端发送的消息?您还可以在调试模式下启动Node服务器,以便记录更多信息:env DEBUG=* node server.js(或Windows等效命令)。 - robertklep
不,连接成功,但是节点服务器没有接收到消息。 - atx
@robertklep 我已经添加了 server.js 和 client.js 的内容。 - atx
显示剩余2条评论
1个回答

6
您使用的客户端URL不正确:
var socket = io('http://127.0.0.1/socket.io/');

在连接字符串中,添加路径(在这种情况下为/socket.io/)具有特殊意义:它反映了命名空间,你希望客户端连接到的位置。

由于您没有使用命名空间,应该省略它:

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

谢谢!这个问题让我差点崩溃了。 - ggrant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接