Search code examples
node.jsamazon-web-servicesnginxmeteoramazon-elastic-beanstalk

How do I customize nginx on AWS elastic beanstalk to loadbalance Meteor?


I am running Meteor on AWS Elastic Beanstalk. Everything is up and running except that it's not running Websockets with the following error:

WebSocket connection to 'ws://MYDOMAIN/sockjs/834/sxx0k7vn/websocket' failed: Error during WebSocket     handshake: Unexpected response code: 400 

My unstanding was to add something like:

proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

To the proxy config, via my YML config file.

Via my .exbextension config file:

files:
"/etc/nginx/conf.d/proxy.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
        proxy_set_header        Upgrade         $http_upgrade;
        proxy_set_header        Connection      "upgrade";

I have ssh'd into the server and I can see the proxy.conf with those two lines in it.

When I hit my webserver I still see the "Error during WebSocket handshake: " error.

I have my beanstalk load configured with stick sessions and the following ports:

enter image description here enter image description here

BTW I did see https://meteorhacks.com/load-balancing-your-meteor-app.html and I tried to:

Enable HTTP load balancing with Sticky Session on Port 80 Enable TCP load balancing on Port 8080, which allows websocket But could not seem to get that working either.

Adding another shot at some YAML that does NOT work here": https://gist.github.com/adamgins/0c0258d6e1b8203fd051

Any help appreciated?


Solution

  • With a LOT of help from AWS paid support, I got this working. The reality is I was not far off it was down to some SED syntaxt.

    Here's what currently works (Gist):

    option_settings:
    
      - option_name: AWS_SECRET_KEY
        value: <SOMESECRET>
    
      - option_name: AWS_ACCESS_KEY_ID
        value: <SOMEKEY>
    
      - option_name: PORT
        value: 8081
    
      - option_name: ROOT_URL
        value: <SOMEURL>
    
      - option_name: MONGO_URL
        value: <SOMEMONGOURL>
    
        - option_name: MONGO_OPLOG_URL
        value: <SOMEMONGOURL>
    
      - namespace: aws:elasticbeanstalk:container:nodejs
        option_name: ProxyServer
        value: nginx
    
        option_name: GzipCompression
        value: true
    
      - namespace: aws:elasticbeanstalk:container:nodejs:staticfiles
    
        option_name: /public
        value: /public
    
        container_commands:
    
      01_nginx_static:
        command: |
          sed -i '/\s*proxy_set_header\s*Connection/c \
                  proxy_set_header Upgrade $http_upgrade;\
                  proxy_set_header Connection "upgrade";\
            ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
    

    In addition to this you need to got into your Load balancer and change the Listener from HTTP to TCP:

    enter image description here

    described here: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.elb.html).