【问题标题】:Websocket connection on Google Compute Engine using a custom domain nameGoogle Compute Engine 上使用自定义域名的 Websocket 连接
【发布时间】:2021-05-23 13:35:25
【问题描述】:

我有一个 websocket 服务器 (node.js),它在 localhost 和以前的 heroku 部署上运行良好。我现在正在迁移到谷歌计算引擎并遇到了一些问题。

websocket 握手失败,返回 301 错误。正如this answer 中所指出的,这可能是由于请求通过了不支持 websocket 连接的前端服务器,并且可以通过直接定位ws://my_external_gce_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
}

非常感谢,如果这是一个菜鸟问题,我们深表歉意。负载均衡方面的菜鸟

【问题讨论】:

    标签: node.js nginx google-cloud-platform websocket google-compute-engine


    【解决方案1】:

    解决了。经过更多的谷歌搜索后,我发现this thread 面临同样问题的人大多使用 apache 服务器或弹性 beanstalk,而不是使用 nginx。

    似乎很多人使用 socket.io 让 websockets “工作”,但他们并没有真正的双工连接,因为它正在回退到长轮询。

    在我的情况下,答案很简单,我没有在我的 nginx (facepalm) 中包含服务器名称,我可能忘记包含标题。 https 转发现在看起来像这样(并且使用我的域进行寻址)

    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;
                    proxy_set_header        X-Real-IP $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header        X-Forwarded-Proto $scheme;
                    proxy_read_timeout  90;
                  
                  
            }
    

    更新后别忘了重启你的nginx

    sudo systemctl restart nginx
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2017-01-23
      • 2020-09-25
      • 2020-11-02
      相关资源
      最近更新 更多