Node.js 应用程序在 Nginx 子文件夹中,WSS 连接到同一服务器
Node.js app in a Nginx subfolder with WSS connection to the same server
在 Apache 服务器上管理我的 Web 项目多年后,我不得不将它们转移到使用 Nginx 的新服务器上。除了使用 websockets 的那个,我已经成功迁移了所有这些。
该项目是一个基于网络的扫雷游戏,使用 websockets 与游戏服务器进行通信。可通过 https://www.my.domain.com/minesweeper 访问该游戏。在其 client.js 文件中,连接是通过行 const ws = new WebSocket('wss://www.my.domain.com:8081/')
.
建立的
服务器使用 ws 包,这里是 server.js 文件的摘录,位于 web 文件夹之外:
const fs = require('fs')
const https = require('https')
const server = new https.createServer({
key: fs.readFileSync('/etc/letsencrypt/.../privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/.../fullchain.pem')
})
const wss = new WebSocket.Server({ server })
wss.on('connection', function (ws) {
ws.on('message', function (data) {
// ...
})
ws.on('close', function () {
// ...
})
})
server.listen(8081)
游戏在以前的服务器上使用此配置运行,但我不记得是否必须编辑 Apache conf 文件才能使其运行。
现在,在新服务器上,我有以下配置文件:
server {
add_header Content-Security-Policy "default-src 'self' *.jquery.com wss: data: blob:;";
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/mydomain;
index index.html index.htm index.nginx-debian.html index.php;
server_name www.my.domain.com;
charset utf-8;
source_charset utf-8;
location / {
rewrite ^/(.*).html$ /index.php?page=;
try_files $uri $uri/ /index.php$is_args$args;
}
location /minesweeper/ {}
location ~ /\.ht {
deny all;
}
ssl_certificate /etc/letsencrypt/.../fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/.../privkey.pem; # managed by Certbot
}
在没有任何额外配置的情况下,当我尝试通过 URL 访问游戏时,websocket 请求没有 return 预期的 101 响应代码。 Firefox 还会触发 "can't establish connection to wss://www.my.domain.com:8081" 错误。
基于 official Nginx tutorial about websockets 和其他关于类似问题的 SO 答案,我尝试使用 proxy_* 参数的多种组合来编辑我的 Nginx 配置,但没有成功。
但是基于websocket服务器和Nginx服务器在同一个IP,websocket服务器监听8081端口,Nginx服务器是否也监听8081服务器(如果我编辑配置这样做,Nginx 拒绝重启,因为 websocket 服务器已经在监听那个端口,并且相互)? Nginx 真的是问题所在还是我遗漏了另一件事?
提前致谢!
我确认我不必编辑我的 Nginx 配置。它与代理无关:问题是防火墙不允许 8081 端口。
这是我在我的服务器上执行的命令,我在允许端口之前保存了我的防火墙设置(不确定这个过程是否最好,但它有效,连接建立并且我有我的 101响应代码):
/etc/init.d/iptables save
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart
在 Apache 服务器上管理我的 Web 项目多年后,我不得不将它们转移到使用 Nginx 的新服务器上。除了使用 websockets 的那个,我已经成功迁移了所有这些。
该项目是一个基于网络的扫雷游戏,使用 websockets 与游戏服务器进行通信。可通过 https://www.my.domain.com/minesweeper 访问该游戏。在其 client.js 文件中,连接是通过行 const ws = new WebSocket('wss://www.my.domain.com:8081/')
.
服务器使用 ws 包,这里是 server.js 文件的摘录,位于 web 文件夹之外:
const fs = require('fs')
const https = require('https')
const server = new https.createServer({
key: fs.readFileSync('/etc/letsencrypt/.../privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/.../fullchain.pem')
})
const wss = new WebSocket.Server({ server })
wss.on('connection', function (ws) {
ws.on('message', function (data) {
// ...
})
ws.on('close', function () {
// ...
})
})
server.listen(8081)
游戏在以前的服务器上使用此配置运行,但我不记得是否必须编辑 Apache conf 文件才能使其运行。
现在,在新服务器上,我有以下配置文件:
server {
add_header Content-Security-Policy "default-src 'self' *.jquery.com wss: data: blob:;";
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/mydomain;
index index.html index.htm index.nginx-debian.html index.php;
server_name www.my.domain.com;
charset utf-8;
source_charset utf-8;
location / {
rewrite ^/(.*).html$ /index.php?page=;
try_files $uri $uri/ /index.php$is_args$args;
}
location /minesweeper/ {}
location ~ /\.ht {
deny all;
}
ssl_certificate /etc/letsencrypt/.../fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/.../privkey.pem; # managed by Certbot
}
在没有任何额外配置的情况下,当我尝试通过 URL 访问游戏时,websocket 请求没有 return 预期的 101 响应代码。 Firefox 还会触发 "can't establish connection to wss://www.my.domain.com:8081" 错误。
基于 official Nginx tutorial about websockets 和其他关于类似问题的 SO 答案,我尝试使用 proxy_* 参数的多种组合来编辑我的 Nginx 配置,但没有成功。
但是基于websocket服务器和Nginx服务器在同一个IP,websocket服务器监听8081端口,Nginx服务器是否也监听8081服务器(如果我编辑配置这样做,Nginx 拒绝重启,因为 websocket 服务器已经在监听那个端口,并且相互)? Nginx 真的是问题所在还是我遗漏了另一件事?
提前致谢!
我确认我不必编辑我的 Nginx 配置。它与代理无关:问题是防火墙不允许 8081 端口。
这是我在我的服务器上执行的命令,我在允许端口之前保存了我的防火墙设置(不确定这个过程是否最好,但它有效,连接建立并且我有我的 101响应代码):
/etc/init.d/iptables save
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart