Node.js 使用自定义域名在Google计算引擎上建立Websocket连接
我有一个websocket服务器(node.js),它在本地主机和以前的heroku部署上运行良好。我现在迁移到谷歌计算引擎,遇到了一些问题 websocket握手失败,返回301错误。正如文中所指出的,这可能是由于请求通过不支持websocket连接的前端服务器进行的,可以通过直接针对Node.js 使用自定义域名在Google计算引擎上建立Websocket连接,node.js,nginx,google-cloud-platform,websocket,google-compute-engine,Node.js,Nginx,Google Cloud Platform,Websocket,Google Compute Engine,我有一个websocket服务器(node.js),它在本地主机和以前的heroku部署上运行良好。我现在迁移到谷歌计算引擎,遇到了一些问题 websocket握手失败,返回301错误。正如文中所指出的,这可能是由于请求通过不支持websocket连接的前端服务器进行的,可以通过直接针对ws://my\u external\u gce\u ip来解决。我想知道是否有一些负载平衡配置我可以更新,以便我可以解决我的后端使用自定义域名 虽然我理解这个问题,但在我看来,域名应该在dns查找后解析为外部i
ws://my\u external\u gce\u ip
来解决。我想知道是否有一些负载平衡配置我可以更新,以便我可以解决我的后端使用自定义域名
虽然我理解这个问题,但在我看来,域名应该在dns查找后解析为外部ip,所以我并不真正理解约束
很抱歉,如果这是很明显的。我是GCE的新手,整天都在谷歌上搜索,想得到这个。我将在下面粘贴我的代码以及NGINX配置,但我认为这两种配置都没有特别的帮助,因为使用IP地址都可以很好地工作
index.js:
/* requirements */
var bodyParser = require("body-parser");
const WebSocket = require("ws");
const http = require("http");
const express = require("express");
const port = process.env.PORT || 3000;
/*
server definition and config
*/
const app = express();
app.use(bodyParser.json());
const server = http.createServer(app);
/*
web socket stuff
*/
const webSocketServer = new WebSocket.Server({
server,
});
webSocketServer.on("connection", (webSocket) => {
console.log("board trying to connect...");
webSocket.on("message", (data) => {
webSocketServer.clients.forEach((client) => {
if (client === webSocket && client.readyState === WebSocket.OPEN) {
client.send("[SERVER MESSAGE]: You are connected to the server :)");
}
});
});
});
/*
activate server
*/
server.listen(port, () => {
console.log(`Server is now running on port ${port}\n`);
});
nginx配置
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location \ {
# we're actually going to proxy all requests to
# a Nodejs backend
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# I added this baby in
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server
{
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name my_domain; # managed by Certbot
location / {
# we're actually going to proxy all requests to
# a Nodejs backend
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/my_domain/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/my_domain/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server
{
if ($host = my_domain) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name my_domain;
return 404; # managed by Certbot
}
事先非常感谢,如果这是一个noob问题,我很抱歉。负载平衡方面的总noob已解决。在谷歌搜索了很多次之后,我发现很多人都面临着同样的问题,大多数人要么使用apache服务器,要么使用elastic beanstalk,所以不使用nginx 似乎很多人使用socket.io让WebSocket“工作”,但他们并没有真正的双工连接,因为它正在倒退到长轮询 在我的例子中,答案很简单,我没有在我的nginx(facepalm)中包含服务器名称,而且我可能忘记了包含头。https转发现在看起来是这样的(使用my domain works进行寻址) 更新后不要忘记重新启动nginx
sudo systemctl restart nginx
sudo systemctl restart nginx