2017-05-18 140 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