2013-08-27 14 views
13

Sto provando a eseguire una semplice applicazione web echo su Elastic Beanstalk. Ma se lo eseguo ricevo un errore 400 su Socket Upgrade da Tomcat, ma questo succede solo sulla porta 80 se passo la porta 8080 ho pensato che il loadbalancer posso accedere al websocket senza l'errore 400 sull'upgrade del socket (sulla porta 8080). La porta 8080 e la porta 80 sono entrambe su TCP non HTTP.Websocket con Tomcat 7 su AWS Elastic Beanstalk

La mia domanda è chi sta eseguendo la conversione da 80 a 8080 poiché la configurazione predefinita sul loadbalancer passa solo il traffico da 80 a 80. La traduzione deve essere nell'istanza EC2. IPTables? In questa traduzione qualcosa va storto.

Sarebbe bello avere qualche informazione da Amazon su come questo traffico è routet.

+0

sei EC2 securityGroup che consente la porta 80? –

+0

sì, posso accedere ad ogni servlet tramite la porta 80. Solo l'aggiornamento del protocollo non funziona. – patrick

+0

è il proxy Apache nell'istanza EC2 davanti al proxy Apache Tomcat – patrick

risposta

16

La soluzione è quella di configurare il Loadbalacer per collegare direttamente al 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. Creare una cartella denominata .ebextensions nella cartella WEB-INF Forse in versione più recente delle .ebextensions deve essere nella cartella principale, qualcuno può confermarlo?
  2. Creare un file chiamato websocket.config in questa cartella con i contenuti dall'alto
  3. distribuire l'applicazione
  4. Ricostruire l'ambiente

Per una configurazione senza SSL rimuovere questo:

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

Oppure sostituire Apache con Nginx e configurare Niginx per supportare WebSocket

+0

dove è stata eseguita questa configurazione? Da qualche parte in ebextensions o in tomcat config? – Kevin

+1

OK - capito, è un file di configurazione di ebextensions. – Kevin

+0

@Kevin - potresti pubblicare un esempio .ebextension che funziona per te? – Jason