Nginx ters proxy: Node.js ya da Python uygulamasını Nginx arkasında yayınlama

Nginx ve Web Sunucusu 70 görüntülenme Markdown

Node.js, Python (Gunicorn, Uvicorn), bir Docker konteyneri ya da herhangi bir uygulama genellikle 3000 veya 8000 gibi bir portta dinler. Bu portu doğrudan internete açmak yerine Nginx'i önüne koymak üç kazanç sağlar: alan adı üzerinden normal 80/443 portlarıyla erişirsiniz, https sertifikasını Nginx karşılar ve birden fazla uygulamayı tek IP'de barındırabilirsiniz. Nginx'in bu rolüne ters proxy denir.

Uygulamanız hazır olsun

Önce uygulamanın arka planda çalıştığından emin olun (ör. systemd servisi): Node.js veya Python uygulamasını yayınlama. Uygulamanın yalnızca yerel adreste (127.0.0.1) dinlemesi önerilir; böylece dışarıdan yalnızca Nginx üzerinden erişilir. Kontrol: curl -I http://127.0.0.1:3000.

Nginx ayarı

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

server {
    listen 80;
    server_name app.ornek.com;
    client_max_body_size 50M;

    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 $connection_upgrade;
        proxy_read_timeout 120s;
    }
}

Dosyayı /etc/nginx/sites-available/app.ornek.com içine yazıp bağlantısını etkinleştirin ve sudo nginx -t && sudo systemctl reload nginx çalıştırın. map bloğu server bloğunun dışında, http bağlamında olmalıdır; sites-available dosyalarının en üstüne yazmak bu bakımdan doğrudur.

Başlıklar ne işe yarar?

  • Host: Uygulamanın hangi alan adıyla çağrıldığını bilmesi için.
  • X-Forwarded-For ve X-Real-IP: Ziyaretçinin gerçek IP adresi. Bunlar olmazsa uygulamanız her isteği 127.0.0.1'den geliyormuş gibi görür (günlük ve hız sınırı işe yaramaz).
  • X-Forwarded-Proto: İstek https ile geldiyse uygulamaya söyler; aksi halde uygulama https yönlendirmesi yapıp sonsuz döngüye girebilir ya da yanlış (http) bağlantılar üretir. Uygulama çerçevenizin "proxy'e güven" ayarını (Express'te app.set('trust proxy', 1)) açın.
  • Upgrade ve Connection: WebSocket bağlantıları için (canlı sohbet, bildirim, oyun). Olmadan WebSocket bağlanamaz.

https

Ayar çalıştıktan sonra: sudo certbot --nginx -d app.ornek.com. Sertifika Nginx'e eklenir, uygulamanıza yine http ile (yerel) bağlanılır; uygulamanın kendisinin sertifikaya ihtiyacı yoktur.

Sık hatalar

  • 502 Bad Gateway: Uygulama çalışmıyor ya da farklı bir portta. sudo ss -tlnp | grep 3000: 502 makalesi.
  • 504 Gateway Timeout: Uygulama çok yavaş yanıt veriyor. proxy_read_timeout değerini artırabilir ama asıl yavaşlığı bulmalısınız.
  • proxy_pass sonuna / koymak: proxy_pass http://127.0.0.1:3000/; ile proxy_pass http://127.0.0.1:3000; yol işleme bakımından farklıdır. Alt yolda proxy yapıyorsanız (location /api/) bu farkı bilin; düz location / için ikisi aynıdır.
  • Dosya yüklemede 413: 413 hatası.

Bot hosting paketimiz bu işi sizin yerinize halleder ve ters proxy kurmanızı gerektirmez: Bot ve Uygulama Hosting. Kendi sunucunuz için Linux VDS.

Sık sorulanlar

Uygulamayı doğrudan 3000 portundan yayınlasam olmaz mı?

Olur ama alan adı adresinde port numarası görünür, https sertifikasını uygulamanın kendisi yönetmek zorunda kalır ve güvenlik duvarında bir portu daha dışarı açarsınız. Nginx önünde tutmak daha düzenli ve güvenlidir.

Birden fazla uygulamayı tek alan adında nasıl yayınlarım?

Farklı yollara farklı portlar atayın: location /api/ { proxy_pass http://127.0.0.1:4000/; } ve location / { proxy_pass http://127.0.0.1:3000; }. Her biri için gerekli başlıkları ekleyin.

WebSocket hâlâ bağlanmıyor.

map bloğunun varlığını ve proxy_http_version 1.1; ile iki Upgrade/Connection başlığını kontrol edin. Önünde Cloudflare varsa WebSocket'in açık olduğundan emin olun.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.