2017-05-18 102 views
1

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

这是我nginx的文件/网站启用/ DIR

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(); 
    } 
}); 
+0

你可以定义_“它不工作” _? HTTP错误? JS错误? – robertklep

+0

我没有看到任何错误。该网站正常运作。在console.log(浏览器)中没有错误,并且在成功的客户端 - 服务器连接之后,我可以看到nodejs服务器的输出和'pm2 logs app_name',因此建立了连接。有没有其他地方可以找到错误? – atx

+0

客户端 - 服务器连接成功,但消息没有传送到其他客户端。 – atx

回答

0

您使用客户端的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(); 
+0

非常感谢。你救了我的一天! – atx