【问题标题】:How do I customize nginx on AWS elastic beanstalk to loadbalance Meteor?如何在 AWS 弹性 beantalk 上自定义 nginx 以对 Meteor 进行负载平衡?
【发布时间】:2015-01-20 22:37:20
【问题描述】:

我在 AWS Elastic Beanstalk 上运行 Meteor。一切都启动并运行,除了它没有运行 Websockets 并出现以下错误:

WebSocket connection to 'ws://MYDOMAIN/sockjs/834/sxx0k7vn/websocket' failed: Error during WebSocket     handshake: Unexpected response code: 400 

我的理解是添加如下内容:

proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

通过我的 YML 配置文件到代理配置。

通过我的 .exbextension 配置文件:

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

我已经 ssh 进入服务器,我可以看到 proxy.conf 里面有这两行。

当我点击我的网络服务器时,我仍然看到“WebSocket 握手期间出错:”错误。

我的 beanstalk 负载配置了棒会话和以下端口:

顺便说一句,我确实看到了 https://meteorhacks.com/load-balancing-your-meteor-app.html 并且我尝试过:

Enable HTTP load balancing with Sticky Session on Port 80 Enable TCP load balancing on Port 8080, which allows websocket 但似乎也无法让它发挥作用。

添加另一个在此处不起作用的 YAML 的镜头“:https://gist.github.com/adamgins/0c0258d6e1b8203fd051

任何帮助表示赞赏?

【问题讨论】:

    标签: node.js amazon-web-services nginx meteor amazon-elastic-beanstalk


    【解决方案1】:

    您查看Meteor WebSocket handshake error 400 with nginx 了吗?我认为他们的配置可能与您的配置有些不同。我和你在同一条船上,试图让这个完全相同的设置正常工作。

    【讨论】:

    • 感谢您的回复。是的,我已经看到了,但这是一个直接的 EC2(不是 Beanstalk)示例。我知道配置文件必须发生什么才能使其工作......我似乎无法正确获取 YAML 配置以使其生效。我想我可能需要使用 SED 来尝试更新现有的 NGINX 配置文件而不是追加/添加到它们。所以我想我更多的是询问语法与实际需要做什么。
    • 我昨天与 AWS 打了一个付费支持电话...所以看看会发生什么。
    【解决方案2】:

    在 AWS 付费支持的大力帮助下,我完成了这项工作。现实情况是我离它不远了,它归结为一些 SED 语法。

    这是目前有效的 (Gist):

    option_settings:
    
      - option_name: AWS_SECRET_KEY
        value: <SOMESECRET>
    
      - option_name: AWS_ACCESS_KEY_ID
        value: <SOMEKEY>
    
      - option_name: PORT
        value: 8081
    
      - option_name: ROOT_URL
        value: <SOMEURL>
    
      - option_name: MONGO_URL
        value: <SOMEMONGOURL>
    
        - option_name: MONGO_OPLOG_URL
        value: <SOMEMONGOURL>
    
      - namespace: aws:elasticbeanstalk:container:nodejs
        option_name: ProxyServer
        value: nginx
    
        option_name: GzipCompression
        value: true
    
      - namespace: aws:elasticbeanstalk:container:nodejs:staticfiles
    
        option_name: /public
        value: /public
    
        container_commands:
    
      01_nginx_static:
        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
    

    除此之外,您还需要进入负载均衡器并将侦听器从 HTTP 更改为 TCP:

    此处描述:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.elb.html)。

    【讨论】:

    • 请注意,我确实有一个未解决的问题。将协议交换为 TCP 时,我必须禁用粘性会话。我有一个悬而未决的问题想了解我是否可以恢复。
    • 好的,关于websockets的重要性的讨论在这里:groups.google.com/forum/#!topic/meteor-talk/M6L_Ihpu-e0如果你有任何意见请跳进去
    • 是的 - 当您想要扩展时,就会出现问题。看起来 opsworks 或自定义 EC2 现在只是有效的选项......我仍在努力。看起来我需要使用 NGINX 或 HAPROXY 构建一个自定义代理层,因为 Opswork 上的开箱即用 HAPROXY 也不会这样做......啊,我迫不及待想要解决这个问题......或者直到 AWS开始在 Beanstalk 上开箱即用地支持此功能(提示 ;-))
    • 按照blog.sunsama.com/meteor-docker-opsworks,我最终转而使用opsworks、集群和docker
    • 我刚刚投票赞成与我们分享您的“付费”帮助技巧。
    【解决方案3】:

    这不再有效。我在这里https://solitaired.com/websockets-elastic-beanstalk 发布了更多内容,但主要是在.ebextensions(例如称为websockets.config)中创建一个文件,其中包含以下内容:

    files:
      "/etc/nginx/conf.d/websockets.conf":
        content: |
    
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
    

    【讨论】:

    • 我刚刚部署了一个 beanstalk,并且 websockets 在没有配置文件的情况下工作正常。还需要吗? (当我尝试添加此配置文件时,部署失败。)
    猜你喜欢
    • 2017-09-21
    • 2019-02-02
    • 1970-01-01
    • 2011-03-16
    • 2021-05-28
    • 2020-09-01
    • 2020-09-06
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多