AWS Elastic Beanstalk 上带有 Tomcat 7 的 Websocket

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 上带有 Tomcat 7 的 Websocket【英文标题】:Websocket with Tomcat 7 on AWS Elastic Beanstalk 【发布时间】:2013-08-29 22:17:31 【问题描述】:

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

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

如果能从亚马逊那里获得一些有关此流量如何路由的信息,那就太好了。

【问题讨论】:

您的 EC2 安全组是否允许端口 80? 是的,我可以通过端口 80 访问每个 servlet。只是协议升级不起作用。 它似乎是Tomcat前面EC2实例上的Apache代理 Apache 代理:tomcat.10.x6.nabble.com/Tomcat7-WebSocket-mod-jk-td4986848.html tomcat前面这个apache有什么用? 【参考方案1】:

解决方法是配置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"
    在 WEB-INF 文件夹中创建一个名为 .ebextensions 的文件夹 也许在较新的版本中,.ebextensions 必须在根文件夹中,有人可以确认吗? 在此文件夹中使用上面的内容创建一个名为 websocket.config 的文件 部署应用程序 重建环境

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

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

或者用nginx替换Apache,配置Niginx支持WebSocket

【讨论】:

这个配置是在哪里完成的?在 ebextensions 或 tomcat 配置中的某个地方? 好的 - 想通了,它是一个 ebextensions 配置文件。 @Kevin - 你能发布一个适合你的示例 .ebextension 吗? 使用 Leiningen 和lein-beanstalk,使文件的路径为war-resources/.ebextensions/websocket.config @patrick 是所需的 22 端口,您能否解释一下答案中文件中提到的配置。

以上是关于AWS Elastic Beanstalk 上带有 Tomcat 7 的 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

带有负载均衡器的 AWS Elastic Beanstalk Linux 托管实例上的 ASP.NET Core 3.1 - HTTPS

运行 Puma 和 Nginx 的带有 AWS Elastic Beanstalk 的 Rails 应用程序 502

带有 docker 的 AWS Elastic Beanstalk 版本不正确

带有 Amazon ECR Docker 映像的 AWS Elastic Beanstalk

带有 Elastic Beanstalk 的 AWS 证书管理器(ACM 证书)

带有 docker 应用程序的 AWS Elastic Beanstalk 返回 502