Nginx может завершать TLS и проксировать приложение на localhost. Передавайте стандартные заголовки, задавайте таймауты и ограничивайте backend firewall-ом.

Важно: Не доверяйте входящему X-Forwarded-For напрямую; доверенная цепочка proxy настраивается отдельно.

1. Запустите backend только локально

sudo ss -lntp | grep 127.0.0.1:3000

2. Создайте location

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_read_timeout 60s;
}

3. Для WebSocket добавьте upgrade map

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

4. Проверьте и примените

sudo nginx -t
sudo systemctl reload nginx
curl -I -H 'Host: example.com' http://127.0.0.1/

Официальная документация