2013-08-27 14 views
13

Ich versuche, eine einfache Websocket Echo-Anwendung auf Elastic Beanstalk auszuführen. Aber wenn ich es ausführe bekomme ich einen Fehler 400 auf dem Socket Upgrade von Tomcat, aber das passiert nur auf Port 80, wenn ich Port 8080 überlege, dass der Loadbalancer auf den Websocket ohne den Fehler 400 beim Socket Upgrade (auf Port 8080) zugreifen kann). Port 8080 und Port 80 sind beide auf TCP und nicht auf HTTP.Websocket mit Tomcat 7 auf AWS Elastic Beanstalk

Meine Frage ist, wer die Übersetzung von 80 bis 8080 als die Standardkonfiguration auf dem Loadbalancer gerade passiert Verkehr von 80 zu 80 übergeben. Die Übersetzung muss auf der EC2-Instanz sein. IPTabellen? In dieser Übersetzung läuft etwas schief.

Es wäre schön, von amazon eine Infor- mation darüber zu erhalten, wie dieser Traffic routet.

+0

ist die EC2 securityGroup Port 80? –

+0

Ja, ich kann auf jedes Servlet über Port 80 zugreifen. Nur das Protokoll-Upgrade funktioniert nicht. – patrick

+0

es scheint der Apache-Proxy auf der EC2-Instanz vor dem Tomcat – patrick

Antwort

16

Die Lösung ist die Loadbalacer zu konfigurieren, dass der Tomcat für die direkte Verbindung:

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. Erstellen Sie einen Ordner .ebextensions im WEB-INF-Ordner Vielleicht in neueren Version der .ebextensions genannt hat im Stammordner sein, kann das jemand bestätigen?
  2. Erstellen Sie eine Datei aus websocket.config in diesem Ordner mit dem Inhalt aufgerufen oben
  3. Stellen Sie die Anwendung
  4. Rebuild die Umwelt

Für ein Setup ohne SSL entfernen Sie diese:

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

Oder Apache durch Nginx ersetzen und Niginx zur Unterstützung vonkonfigurieren

+0

wo ist diese Konfiguration getan? Irgendwo in Ebextensions oder in tomcat config? – Kevin

+1

OK - herausgefunden, es ist eine Ebextensions-Konfigurationsdatei. – Kevin

+0

@Kevin - könnten Sie ein Beispiel für .exextension schreiben, das für Sie funktioniert? – Jason

Verwandte Themen