node.js - Socket.io 不适用于 nginx

标签 node.js nginx socket.io gunicorn pm2

我有一个运行良好的 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();
    }  
});

最佳答案

您为客户端使用的 URL 不正确:

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

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

因为您没有使用命名空间,所以您应该将其关闭:

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

关于node.js - Socket.io 不适用于 nginx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44039519/

相关文章:

javascript - Fabric.js 从 JSON 加载 Canvas 后在 Node 服务器上创建图像

Node.js 视频聊天应用

nginx - 无法从 nginx 代理到 kibana

php - Cloudflare 将子域重定向到目录

node.js - 套接字断开连接时是否必须删除事件监听器?

javascript - 多个 socket.io 客户端连接不起作用(Google Chrome、Firefox)

node.js - 如何在 Node.js 中打开命令行窗口?

caching - 在 Nginx 上永久缓存内存中的静态文件?

node.js - 无法获取/socket.io/socket.io.js

node.js - 将 Node js 应用程序部署到 MS azure 服务后出错