Nginx ile ters vekil (reverse proxy) ve ücretsiz SSL kurulumu
Node.js, Python veya Go ile yazdığın bir uygulama genelde 3000, 8000 gibi bir portta çalışır. Onu doğrudan internete açmak yerine önüne Nginx koymak; SSL, sıkıştırma, statik dosya ve hız sınırı gibi işleri tek yerde çözmeni sağlar.
Aşağıdaki adımlar Ubuntu/Debian içindir; alan adının DNS kaydının sunucuya baktığını varsayıyoruz.
1. Nginx'i kur
sudo apt update
sudo apt install nginx
sudo ufw allow 'Nginx Full'
2. Site yapılandırması
/etc/nginx/sites-available/uygulama dosyasını oluştur:
server {
listen 80;
server_name ornek.com www.ornek.com;
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";
}
}
Upgrade ve Connection satırları WebSocket kullanıyorsan gerekir.
Etkinleştir ve test et:
sudo ln -s /etc/nginx/sites-available/uygulama /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
nginx -t hata veriyorsa yeniden yükleme; önce hatayı düzelt.
3. Let's Encrypt ile ücretsiz SSL
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d ornek.com -d www.ornek.com
Certbot sertifikayı alır, Nginx yapılandırmasına ekler ve HTTP'den HTTPS'e yönlendirmeyi ayarlayabilir. Sertifikalar 90 gün geçerlidir ve kurulumla gelen zamanlayıcı onları otomatik yeniler. Yenilemeyi denemek için:
sudo certbot renew --dry-run
4. Uygulamayı yalnızca yerelde dinlet
Uygulaman 0.0.0.0:3000 yerine 127.0.0.1:3000 adresini dinlesin. Böylece dışarıdan doğrudan porta erişilemez, her istek Nginx üzerinden geçer.
5. Uygulama tarafında dikkat
Nginx arkasında uygulama, isteğin HTTPS ile geldiğini ve gerçek istemci IP'sini X-Forwarded-* başlıklarından öğrenir. Çatının "trusted proxy" ayarını yapmazsan yönlendirme döngüleri, yanlış oluşturulan http:// bağlantıları veya bütün kullanıcıların IP'sinin 127.0.0.1 görünmesi gibi sorunlar çıkar.
Sık görülen hatalar
- 502 Bad Gateway: Uygulama çalışmıyor ya da farklı portta.
curl http://127.0.0.1:3000ile sunucunun içinden dene. - 413 Request Entity Too Large: Dosya yükleme sınırı.
client_max_body_size 20M;ekle. - 504 Gateway Timeout: Uzun süren istekler.
proxy_read_timeoutdeğerini artır ama asıl çözüm işi arka plana almaktır.
Loglar /var/log/nginx/error.log dosyasında; sorun yaşadığında ilk bakılacak yer burası.