Ubuntu 22.04
Nginx: 1.23.2
Nodejs: 12.22.9
Socket.io: 2.0.3我在Apache2中构建了一个基本的Apache2聊天室,但是我把所有的东西都迁移到了Ngnix,而且我很难让聊天室恢复正常工作。我试图让我的聊天应用程序工作目录/cnode2/而不是根网址(因为我有其他的应用程序)。
当我尝试加载页面时,我得到了以下错误:
WebSocket connection to 'wss://www.*****.com/socket.io/?EIO=3&transport=websocket' failed:
r.doOpen @ websocket.js:112
r.open @ transport.js:80
r.open @ socket.js:245
r @ socket.js:119
r @ socket.js:28
r.open.r.connect @ manager.js:226
r @ manager.js:69
r @ manager.js:37
r @ index.js:60
(anonymous) @ (index):539
cmain.js:160 connect_error: {"type":"TransportError","description":{"isTrusted":true}}这似乎是一个非常简单的修复,也许它应该连接到"wss://www.*****.com/cnode2/socket.io/“(或者不是)?我不太明白如何正确配置所有东西,或者在哪里配置它。以下是我的心声:
package.json:
{
"name": "chat",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "nodejs app"
},
"dependencies": {
"cluster": "^0.7.7",
"domain": "0.0.1",
"express": "^4.16.3",
"helmet": "^3.12.0",
"mongoose": "^5.0.0",
"mysql": "^2.15.0",
"os": "^0.1.1",
"package.json": "^2.0.1",
"redis": "^2.8.0",
"socket.io": "^2.0.3",
"socket.io-redis": "^5.2.0",
"sticky-session": "^1.1.2"
}
}Ngnix Config:
server {
server_name www.********.com;
root /home/********/********.com;
charset utf-8;
#listen [::]:443 http2 ssl; # managed by Certbot
rewrite ^([^.]*[^/])$ $1/ permanent;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm-******.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location /cnode2/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
listen 443 ssl; # managed by Certbot
ssl_certificate ***; # managed by Certbot
ssl_certificate_key ***; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}客户端连接到网页中的IO代码:
var socket = io('https://www.*********.com/cnode2', {resources: "/cnode2/socket.io", transports: ['websocket','polling']});服务器端app.js设置:
var http = require('http'),
express = require('express'),
cluster = require('cluster'),
net = require('net'),
io = require('socket.io'),
io_redis = require('socket.io-redis'),
sticky = require('sticky-session'),
os = require('os'),
helmet = require('helmet'),
app = new express;
app.use(helmet());
var server = http.createServer(app, function(req, res) {
console.log('launch server');
res.end('worker: '+cluster.worker.id);
});
var numCPUs = os.cpus().length;
console.log('num CPUs: '+numCPUs);
if(!sticky.listen(server, 3000)) {
for(var i = 0; i < numCPUs; i++) {
cluster.fork();
}
server.once('listening', function() {
console.log('server started on 3000 port');
});
}
else {
console.log('spawn worker');
var io = io(server, {path: '/cnode2', transports: ['websocket', 'polling']});
....
}发布于 2022-11-21 02:41:17
在我的头撞到墙上和一点点的试错运气后,我通过将客户端脚本更改为:
var socket = io('https://www.*************.com', {path: "/cnode2", transports: ['websocket','polling']});看起来,“路径”必须与服务器端应用程序配置中设置的“路径”相匹配。
https://serverfault.com/questions/1116106
复制相似问题