我有一个很好用的django网站,由gunicorn和nginx(作为代理服务器)提供服务,现在我想使用socket.io和nodejs在该网站中添加聊天机制。问题是,当我将socketio直接连接到nodejs服务器(正在侦听端口5000)时,聊天工作完全正常,但是当我尝试使用nginx将socketio请求代理到nodejs时,它不起作用。
这是我在/ sites-enabled / dir
中的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";
}
}
BTW我使用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 :(得分:2)
您为客户使用的网址不正确:
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();