【问题标题】:Using NGINX + Socket.io while specifying socket room/namespace在指定套接字房间/命名空间时使用 NGINX + Socket.io
【发布时间】:2019-01-24 20:15:51
【问题描述】:

我刚刚更新了一个 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.js sockets express nginx socket.io


    【解决方案1】:

    好吧,我找到了解决问题的方法here。使用这个新设置,我不需要传递 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);

    【讨论】:

      【解决方案2】:

      您可以选择不使用路径参数,但路径是命名空间。如果您不提供,它只使用/ 的命名空间。如果您只需要一个命名空间,那应该没问题。无需在 io 调用中指定 .of(),您只需执行 io.to() 即可,它将使用默认命名空间

      【讨论】:

      • 感谢您的回复!不幸的是,我确实需要使用多个命名空间(或者至少我认为我会这样做......也许几个月后,当我更好地理解套接字和 NGINX 时,我会意识到我当前的设置是多么荒谬)。无论如何,我可以在这里找到解决方案:fadeit.dk/blog/2015/05/21/socketio-namespaces-and-nginx 使用这种位置语法,我可以在我的客户端中使用以下内容:var socket = require('socket.io-client')(https://mywebsite.com/myNamespace);
      猜你喜欢
      • 2012-06-11
      • 2017-01-03
      • 1970-01-01
      • 2015-07-21
      • 2019-07-20
      • 2016-09-04
      • 2011-01-02
      • 2014-01-19
      • 2015-10-08
      相关资源
      最近更新 更多