I’ve made a small application that has a chat feature using node.js + socket.io to communicate. It works perfectly on my local ubuntu machine but I can’t seem to getting working on my droplet. The websocket communication just times out.
I’ve tried following multiple tutorials including http://nginx.com/blog/nginx-nodejs-websockets-socketio/ to no avail. I’ve spent two days so far on this. Any help would be greatly appreciated.
The app is written using the php framework Laravel, and node.js + socket.io is being used on the back end. The /etc/nginx/sites-available/default file is as below by default: (I have reverted all my attempts at fixing the problem)
server { listen 80 default_server; server_name default; root /home/forge/default/public;
# FORGE SSL (DO NOT REMOVE!)
# ssl_certificate;
# ssl_certificate_key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_log /var/log/nginx/default-error.log error;
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_param APP_KEY "SomeRandomString";
fastcgi_param APP_DEBUG "true";
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
I added a proxy pass in my nginx config: (replace PRIVATE_IP with your private IP)
location /socks/ {
proxy_pass http://PRIVATE_IP:8080/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Then when setting up the node app on the same server I had to configure socket.io with that /socks/:8080 namespace like so: (notice io.of('/socks/:8080');)
var http = require('http')
var server = http.Server();
var io = require('socket.io')(server);
var nsp = io.of('/socks/:8080');
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel');
redis.on('message', function(channel, data){
console.log('Message received', arguments);
message = JSON.parse(data);
nsp.emit(channel + ':' + message.event, message.data);
})
server.listen(8080, process.env.SOCKET_PRIVATE_HOST)
I realized by default digital ocean droplets have ports closed.
I opened up the port to fix my timing out issue using the following command: iptables -I INPUT 1 -i eth0 -p tcp --dport 8080 -j ACCEPT
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Full documentation for every DigitalOcean product.
The Wave has everything you need to know about building a business, from raising funding to marketing your product.
Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.
New accounts only. By submitting your email you agree to our Privacy Policy
Scale up as you grow — whether you're running one virtual machine or ten thousand.
Sign up and get $200 in credit for your first 60 days with DigitalOcean.*
*This promotional offer applies to new accounts only.