[求助]怎样设置 Nginx 让 Nodejs 能正常运行 socket.io?

[求助]怎样设置 Nginx 让 Nodejs 能正常运行 socket.io

刚开始我访问 sockets.jiyinyiyong.info 并在浏览器里连接 socket 没有成功, 浏览器端出现报错

Error during WebSocket handshake: 'Connection' header value is not 'Upgrade'

服务器上的信息是:

a connection
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - websocket writing 5:::{"name":"cast"}
   debug - setting request GET /socket.io/1/xhr-polling/11404802851312554938?t=1344062033928
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared heartbeat interval for client 11404802851312554938
   debug - clearing poll timeout
   debug - xhr-polling writing 5:::{"name":"cast"}
   debug - set close timeout for client 11404802851312554938

我搜到的问题大致说浏览器那个错误是因为 header 被破破坏了…

http://stackoverflow.com/questions/6576403/websocket-handshake-failing-in-webkit-with-socket-io-0-7 http://stackoverflow.com/questions/6769342/websockets-handshake-problem 就怀疑到 Nginx 上去了, 想起来以前也遇到过… 就测试 jiyinyiyong.info:8000 去访问, 也 io.connect() 这个网址, 再就能显示了… 照这样问题就出在 Nginx 的配置上边了, 不怎么懂 Nginx, 求助啊, 下面是我出错的时候的配置:

upstream sockets {
    server 127.0.0.1:8005;
}

server {
    listen 0.0.0.0:80;
    server_name sockets.jiyinyiyong.info;
    access_log /var/log/nginx/sockets.log;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://sockets;
      proxy_redirect off;
    }
 }

9 回复

为了确保 Nginx 正确地代理 WebSocket 连接,你需要对 Nginx 配置做一些调整。以下是详细的配置步骤和示例代码:

Nginx 配置

首先,你需要在 Nginx 配置文件中添加一些特定的指令来处理 WebSocket 连接。下面是修改后的配置示例:

upstream sockets {
    server 127.0.0.1:8005;  # Node.js 应用运行的地址
}

server {
    listen 80;  # 监听 80 端口
    server_name sockets.jiyinyiyong.info;

    access_log /var/log/nginx/sockets.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://sockets;
        proxy_redirect off;

        # WebSocket 特定配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

解释

  1. proxy_http_version 1.1;: 设置 HTTP 版本为 1.1,这是 WebSocket 协议所必需的。
  2. proxy_set_header Upgrade $http_upgrade;: 这个头信息告诉 Nginx 将连接升级为 WebSocket。
  3. proxy_set_header Connection "upgrade";: 这个头信息确保 WebSocket 连接被正确识别。

Node.js 应用示例

确保你的 Node.js 应用正确地设置了 socket.io。以下是一个简单的示例:

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
    console.log('A user connected');
    socket.emit('welcome', 'Hello from server!');
});

server.listen(8005, () => {
    console.log('Server running on port 8005');
});

总结

通过上述配置,Nginx 应该能够正确地将 WebSocket 连接代理到你的 Node.js 应用。如果你仍然遇到问题,请检查 Nginx 和 Node.js 日志以获取更多信息。希望这些配置能帮助你解决问题!


nginx现在是不支持websocket的吧

我之前测试了下 nginx 的 1.3.4 development 版,也不支持 websocket… 要用nginx的话,还是用这样的解决办法

今天我也遇到这个问题了 我用域名链接,就会出现那个问题…不过后来改成用IPl链接解决了… 还不知道具体原因,求解答…

nginx反向代理到8080端口试试 locaton ~/ { proxy_pass:127.0.0.1:8080} ,参照网上一些实例

早上突然清醒,发现问题是nginx不支持http1.1造成的!

之前的胡说+八道。忽略…

为了使 Nginx 正确地代理 WebSocket 请求给 Node.js 应用中的 Socket.IO,你需要确保 Nginx 配置中包含正确的代理设置。以下是修改后的 Nginx 配置示例:

upstream sockets {
    server 127.0.0.1:8005;
}

server {
    listen 80;
    server_name sockets.jiyinyiyong.info;
    access_log /var/log/nginx/sockets.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-NginX-Proxy true;

        # WebSocket 配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_pass http://sockets;
        proxy_redirect off;
    }
}

解释:

  1. proxy_http_version 1.1;: 设置 HTTP 版本为 1.1,因为 WebSocket 使用的是 HTTP 1.1。
  2. proxy_set_header Upgrade $http_upgrade;: 将 Upgrade 头传递给后端服务器,这是 WebSocket 握手的一部分。
  3. proxy_set_header Connection "upgrade";: 设置 Connection 头为 upgrade,以指示 Nginx 连接到 WebSocket 协议。

通过这些配置更改,Nginx 将能够正确地处理 WebSocket 请求,并将其代理到你的 Node.js 应用中的 Socket.IO 服务。

回到顶部