首页 > 解决方案 > 在指定套接字房间/命名空间时使用 NGINX + Socket.io

问题描述

我刚刚更新了一个 node+socket 应用程序以使用 https。花了一些时间,但我现在在这里有一个可以工作的 nginx、node.js、socket.io 配置。它工作得很好,但我的问题是,是否可以配置服务器端,以便客户端不需要提交path参数,或者至少将其作为 url 的一部分包含在内?我希望能够只为用户提供一个 url 以供使用,例如https://mywebsite.com/apiPath/myNamespace.

目前:

NGINX 配置:

upstream websocket1 {
    server 127.0.0.1:3000;
} 
server {
    listen 80;
    listen [::]:80;
    server_name mywebsite.com;
    return 301 https://mywebsite.com$request_uri;
}
server {
        listen 443 ssl;
        server_name         mywebsite.com;
        ssl_certificate     this.crt;
        ssl_certificate_key this.pem;
        location /apiPath/ {
                proxy_pass http://websocket1/socket.io/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

服务器:

var express = require('express');
var app = express();

var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 3000;
http.listen(port);

var nsp = io.of('/myNamespace');

nsp.on('connection', function(socket) {
  console.log('connected!');
});

客户:

var socket = require('socket.io-client')(https://mywebsite.com/myNamespace, {path: '/apiPath'});

提前致谢!

标签: node.jssocketsexpressnginxsocket.io

解决方案


好吧,我在这里找到了解决我的问题的方法。使用这个新设置,我不需要传递path参数并且可以使用命名空间作为我的 url 的一部分。我修改后的设置如下所示:

NGINX 配置:

upstream websocket1 {
    server 127.0.0.1:3000;
} 
server {
    listen 80;
    listen [::]:80;
    server_name mywebsite.com;
    return 301 https://mywebsite.com$request_uri;
}
server {
        listen 443 ssl;
        server_name         mywebsite.com;
        ssl_certificate     this.crt;
        ssl_certificate_key this.pem;
        location ~(myNamespace|socket\.io).*$ {
                proxy_pass http://websocket1;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

服务器:

var express = require('express');
var app = express();

var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 3000;
http.listen(port);

var nsp = io.of('/myNamespace');

nsp.on('connection', function(socket) {
  console.log('connected!');
});

客户:

var socket = require('socket.io-client')(https://mywebsite.com/myNamespace);


推荐阅读