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:
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?
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:
described here: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.elb.html).
Have you checked out Meteor WebSocket handshake error 400 with nginx? I think their configuration might be a bit different from yours. I'm in the same boat as you, trying to get this exact same set up working.
来源:https://stackoverflow.com/questions/27084124/how-do-i-customize-nginx-on-aws-elastic-beanstalk-to-loadbalance-meteor