Using the Elastic Beanstalk web console, I've launched a new Web Server 1.0 environment with:
- Predefined configuration: Node.js, 64bit Amazon Linux 2014.09 v1.0.9
- Environment type: Load balancing, autoscaling
and have set Proxy Server to none.
I've successfully compressed & uploaded via the console my code:
package.json
{
"name": "cool",
"version": "0.0.0",
"dependencies": {
"ws": "0.4.x"
}
}
server.js
var wss = new (require('ws')).Server({port: (process.env.PORT || 3000)})
wss.on('connection', function(ws) {
console.log('connected')
ws.on('message', function(message) {
console.log(message)
ws.send(message)
});
ws.on('close', function() {
console.log('disconnected')
})
})
I also tried including the node_modules
directory.
After running:
wscat -c ws://default-environment-xxxxxxxxxx.elasticbeatalk.com/
I got back:
Error: unexpected server response (200)
How can I find out more about that error?
Amazon sets the PORT environment variable to 8080. So, I also tried:
wscat -c ws://default-environment-xxxxxxxxxx.elasticbeatalk.com:8080/
But, that just hung and then returned:
Error: connect ETIMEDOUT
Also, when I do establish a WebSocket connection, I want the server to allow it to stay open indefinitely, unlike Heroku's WebSocket implementation, which times out after 60 seconds.
Is there a detailed tutorial on how to do this?
If you have set up your
package.json
file correctly (primarily by using--save
whennpm install
ing) then you should not have to include the node_modules directory.Check that the
process.env.PORT
setting is not changing the listened port - AWS EB usually sets the port to 8081.To find the port being reported, you can add
console.log(process.env.PORT)
in your code, then connect via ssh to the server and runtail -f var/log/nodejs/nodejs.log
(this monitors the log output of node.js). Then hit your server again and see what port shows up in the log output on your ssh connection.To investigate the error you are getting, add a
ws.on('error',...)
function and log what you want.Alright, after quite a bit or searching, I found a solution that works without changing anything to the ELB and without setting the proxy to none (I use nginx).
All you need is this:
.ebextensions
directory (if it doesn't already exist)01_nginx.config
In this file, put the following code: container_commands:
Deploy your code to elastic beanstalk and enjoy websockets connecting!
PS: You don't really need the
proxy_read_timeout
property set, I just use that for my own. Also, it doesn't seem to do much so, I'll keep looking.