13

我正在尝试在 Elastic Beanstalk 上运行一个简单的 websocket 回显应用程序。但是,如果我运行它,我会在从 Tomcat 升级套接字时收到错误 400,但是如果我通过端口 8080 认为负载均衡器我可以访问 websocket 而不会在套接字升级时出现错误 400(在端口 8080 上),这只会发生在端口 80 上)。端口 8080 和端口 80 都在 TCP 而不是 HTTP 上。

我的问题是谁在进行从 80 到 8080 的转换,因为负载均衡器上的默认配置只是将流量从 80 传递到 80。转换必须在 EC2 实例上。IPTables?在这个翻译中出现了问题。

很高兴从亚马逊获得有关此流量如何路由的一些信息。

4

1 回答 1

16

解决方案是配置Loadbalacer直接连接Tomcat:

Resources:
  AWSEBSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Security group to allow HTTP, SSH and 8080 for all"
      SecurityGroupIngress:
        - {CidrIp: "0.0.0.0/0", IpProtocol: "tcp", FromPort: "80", ToPort: "80"}
        - {CidrIp: "0.0.0.0/0", IpProtocol: "tcp", FromPort: "8080", ToPort: "8080"}
        - {CidrIp: "0.0.0.0/0", IpProtocol: "tcp", FromPort: "22", ToPort: "22"}
  AWSEBLoadBalancer:
    Type: "AWS::ElasticLoadBalancing::LoadBalancer"
    Properties:
      Listeners:
        - {LoadBalancerPort: 443, InstanceProtocol: "TCP", InstancePort: 8080, Protocol: "SSL", SSLCertificateId: "arn:aws:iam::9999999999999:server-certificate/sslcert"}
        - {LoadBalancerPort: 80, InstanceProtocol: "TCP", InstancePort: 8080, Protocol: "TCP"}
      AppCookieStickinessPolicy:
        - {PolicyName: "lb-session", CookieName: "lb-session"}
      HealthCheck:
        HealthyThreshold: "3"
        Interval: "30"
        Target: "HTTP:8080/ping.html"
        Timeout: "5"
        UnhealthyThreshold: "5"
  1. 在 WEB-INF 文件夹中创建一个名为 .ebextensions 的文件夹 也许在较新的版本中 .ebextensions 必须在根文件夹中,有人可以确认吗?
  2. 在此文件夹中使用上面的内容创建一个名为 websocket.config 的文件
  3. 部署应用程序
  4. 重建环境

对于没有 SSL 的设置,请删除

 - {LoadBalancerPort: 443, InstanceProtocol: "TCP", InstancePort: 8080, Protocol: "SSL", SSLCertificateId: "arn:aws:iam::9999999999999:server-certificate/sslcert"}

或者用Nginx替换 Apache并配置 Niginx 以支持WebSocket

于 2013-08-28T05:16:38.963 回答