node.js - 在指定套接字房间/命名空间时使用 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'});
提前致谢!
解决方案
好吧,我在这里找到了解决我的问题的方法。使用这个新设置,我不需要传递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);
推荐阅读
- r - 如何(在R中)根据先前值除以当前值的计算来改变新列(这些值都在现有列中)
- javascript - 如何改进这个 js 功能,使其更快,更好的单元测试?
- reactjs - 如何使用反应钩子检测 Next.js SSR 中的窗口大小?
- android - 无法更改 android 工具栏中的标题和抽屉图标和标题
- .net-core - 从控制台应用程序访问 Azure 应用程序配置
- mongodb - 解析服务器全文搜索不适用于指针列?
- html - 为什么我的图像没有显示在我的 Git Hub 页面中?
- javascript - 如何在 php 和 JS 之间进行通信?
- mysql - MariaDB Connector/J 2.6.x 是否使用 Aurora 创建与主从服务器的连接?
- java - RestTemplate 中的交换方法的目的是什么?