Bir Node uygulaması HTTP'yi tek başına sunabilir. Sunmamalı: TLS'i sonlandırması, duruk dosyaları vermesi, bir çökmeden sağ çıkması ve 443 numaralı kapıya root olarak bağlanması gerekirdi. Önündeki Nginx dördünü de yapar; uygulamaya da yalnızca uygulama olmak kalır.

Vekil

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name app.example.com;

    ssl_certificate     /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;

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

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

WebSocket'leri çalıştıran şey Upgrade ile Connection ikilisidir. Onlar olmadan bağlantı vekillenir ve sonra düşürülür; bu da bozuk bir uygulama gibi görünür.

Node'u yalnızca localhost'a bağlayın

app.listen(3000, '127.0.0.1');
0.0.0.0'a bağlanmak, 3000 numaralı kapıyı Nginx'te yazdığınız her kuralı aşarak internetten erişilebilir bırakır. Bu kurulumun en yaygın hatası budur.

Onu bir uçbirimle değil systemd ile ayakta tutun

# /etc/systemd/system/app.service
[Unit]
Description=Node app
After=network.target

[Service]
Type=simple
User=app
WorkingDirectory=/var/www/app
EnvironmentFile=/etc/app.env
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now app
journalctl -u app -f

Vekile güvenin - uygulamanın içinde

Nginx'in arkasında uygulamanızın her istekte gördüğü adres 127.0.0.1'dir. Çerçeveye iletilen başlığı okumasını söyleyin - Express'te app.set('trust proxy', 1) - yoksa her kayıt ve her hız sınırı anlamsızdır.

Duruk dosyaları Node üzerinden değil, bir location bloğuyla Nginx'ten sunun. Daha hızlıdır ve olay döngüsünü yalnızca sizin kodunuzun yapabileceği iş için boş bırakır.