在AWS Elastic Beanstalk上使用Tomcat 7的Websocket

13

我正在尝试在 Elastic Beanstalk 上运行一个简单的 WebSocket 回声应用程序。但是,如果我运行它,从 Tomcat 到 Socket Upgrade 就会出现 400 错误,但是只有在端口 80 上才会发生这种情况,如果我通过负载均衡器传递端口 8080,我可以访问 WebSocket 而无需在套接字升级时出现 400 错误(在端口 8080 上)。端口 8080 和端口 80 都在 TCP 上,而不是 HTTP。

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

从亚马逊那里获取一些关于这个流量如何路由的信息将是很好的。


你的EC2安全组是否允许端口80? - Scary Wombat
是的,我可以通过80端口访问每个servlet。只是协议升级不起作用。 - patrick
似乎是位于 EC2 实例前面的 Apache 代理,用于与 Tomcat 配合。 - patrick
Apache代理:http://tomcat.10.x6.nabble.com/Tomcat7-WebSocket-mod-jk-td4986848.html - patrick
这个 Apache 在 Tomcat 前面有什么用途? - patrick
显示剩余2条评论
1个回答

16
解决方案是配置负载均衡器直接连接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"}

或者将Apache替换为Nginx,并配置Nginx以支持WebSocket


这个配置在哪里完成的?是在ebextensions中还是在tomcat配置中? - Kevin
1
好的 - 我弄清楚了,这是一个 ebextensions 配置文件。 - Kevin
@Kevin - 你能否发布一个对你有效的 .ebextension 示例呢? - Jason
非常好的答案,真的帮了我很多。不过有一个小问题需要纠正一下。.ebextensions 文件夹必须放在根文件夹中,而不是 webinf 内部。 - CuriousCoder
@Araf 配置文件是用于在 AWS 上运行应用程序的容器。您必须将配置文件与要部署到 Elastic Beanstalk 上的 WAR 文件捆绑在一起,放置在上述某个文件夹中。 - patrick
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接