Reverse proxy a Node app with nginx

Your app listens on 3000, the world talks to nginx on 443.

SNP 120 #593 Filed nginx node cmd

nginx
server {
    listen 443 ssl;
    server_name app.example.com;
    # ssl_certificate and ssl_certificate_key here (certbot fills them in)

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        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;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

The Upgrade and Connection headers are what make WebSockets work through the proxy. Your app should read the client's address from X-Forwarded-For (in Express: app.set('trust proxy', 1)).

shell
sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx