使用端口 80 的 AWS Elastic Beanstalk 上的 WebSocket 问题

Posted

技术标签:

【中文标题】使用端口 80 的 AWS Elastic Beanstalk 上的 WebSocket 问题【英文标题】:WebSocket Issue on AWS Elastic Beanstalk Using Port 80 【发布时间】:2017-10-03 06:44:18 【问题描述】:

我正在将 node.js 应用程序从 Heroku 迁移到在端口 80 上使用 WebSockets 的 AWS Elastic Beanstalk。WebSockets 在 AWS Elastic Beanstalk 上返回 301 错误,但在 Heroku 上没有。

要初始化 WebSocket 连接,请单击 Create a new note

AWS Beanstalk http://default-environment.psgekxtsbd.us-west-2.elasticbeanstalk.com/

Heroku https://murmuring-shelf-40601.herokuapp.com/

这就是我在服务器上设置 WebSocket 的方式。

const express = require('express');
const app = express();
require("express-ws")(app);
app.post("/service/create-account/", (req, res)=> /*code in here*/);
app.ws('/:noteId/', function (ws, req) /*code in here*/);
const port = process.env.PORT || 3000;
app.listen(port);

我尝试在.ebextensions 文件夹中添加不同的配置,例如,

files:
    "/etc/nginx/conf.d/01_websockets.conf" :
        mode: "000644"
        owner: root
        group: root
        content : |
            upstream nodejs 
                server 127.0.0.1:80;
                keepalive 256;
            

            server 
                listen 80;

                large_client_header_buffers 8 32k;

                location / 
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
                    proxy_set_header X-NginX-Proxy true;

                    # prevents 502 bad gateway error
                    proxy_buffers 8 32k;
                    proxy_buffer_size 64k;

                    proxy_pass http://nodejs;
                    proxy_redirect off;

                    # enables WS support
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                
            

还有

files:
    "/etc/nginx/conf.d/websocketupgrade.conf" :
        mode: "000755"
        owner: root
        group: root
        content: |
             proxy_set_header        Upgrade         $http_upgrade;
             proxy_set_header        Connection      "upgrade";

当我添加这些配置时,html 无法加载并出现错误 ERR_NAME_NOT_RESOLVED。这是那个网址http://websocketsissue.us-west-2.elasticbeanstalk.com/

我使用 Node.js 的预定义配置将我的弹性 beanstalk 环境设置为 Web 服务器环境。我没有添加任何额外的资源。

有没有办法让 WebSockets 使用 AWS Elastic Beanstalk 在端口 80 上工作?

更新

我能够让单实例环境工作,但不能让负载平衡的自动缩放环境工作。

为了让单个实例工作,我将以下文件添加到 .ebextensions

container_commands:
  01_nginx_websocket_support:
    command: |
      sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
          ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

【问题讨论】:

它是否适用于其他端口?我知道 8080 是默认配置你试过了吗还是你需要它是 80 我刚刚尝试将 ws 服务移动到端口 8080 并将文件服务器和 REST 服务保留在端口 80 上。它在 EB 上给了我一个 502 错误,但它在我的本地主机上工作 【参考方案1】:

我在这里找到了部分答案,https://scopestar.com/blog/aws/elasticbeanstalk/websockets/2016/10/21/enable-websockets-on-elasticbeanstalk-nginx-proxy.html

我在.ebextensions 文件夹中添加了一个文件,其中包含以下内容,并针对单实例环境修复了该文件。

container_commands:
  01_nginx_websocket_support:
    command: |
      sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
          ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

为了让 WebSockets 在负载平衡、自动缩放环境中工作,我还需要执行以下操作

转到 EC2 仪表板 找到 Elastic Beanstalk 项目创建的负载均衡器 右键单击负载均衡器,然后单击编辑侦听器 将端口 80 的负载平衡器协议从 HTTP 更改为 TCP 并保存更改

【讨论】:

如何确定哪个负载均衡器属于eb项目? @ToriHuang 当您为要部署的 EB 创建环境时,将记录创建的负载均衡器的名称。您可以查看 EB 页面上的事件日志并找到名称。它应该以 awseb 开头。 我尝试了完全相同的文件,但 eb 部署失败并出现以下错误:[emerg] 327#0: unexpected end of file, expecting ";" or "" in /etc/nginx/conf.d/01_nginx_setup.conf:4 - 你能理解这一点吗?

以上是关于使用端口 80 的 AWS Elastic Beanstalk 上的 WebSocket 问题的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 上的 Tomcat:公开多个端口

在 AWS Elastic Beanstalk / Rails 上配置 HTTPS

AWS Elastic Beanstalk HTTPS 不起作用

无法访问此站点以获取 AWS Elastic Beanstalk 环境 URL

将 Docker 部署到 AWS Elastic Beanstalk——如何将端口转发到主机? (端口绑定)

AWS Elastic Beanstalk 上的 Docker 端口映射