Ters proxy, 80 ve 443 portlarındaki genel trafiği alır ve yalnızca yerelde dinleyen uygulamalara iletir. HTTPS, tek IP üzerinde birden çok site ve günlükler ile limitler için tek bir nokta sağlar. Bu rehber, Node.js, Python veya Docker uygulamaları için bunu bir VPS Linux Infrawire üzerinde kurar.
📋 Ön koşullar
- Root SSH erişimli bir Linux VPS (Ubuntu 24.04 / Debian 12 veya AlmaLinux 9 / Rocky 9). IP adresi ve root parolası müşteri alanınızdadır.
- A/AAAA kayıtları
VPS_IPadresine işaret edenexample.comalan adı. - Yerel bir portu dinleyen bir uygulama, örneğin
127.0.0.1:3000.
📦 Nginx kurulumu
Bash# Debian / Ubuntu sudo apt update && sudo apt install -y nginx # AlmaLinux / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginx
AlmaLinux/Rocky'da SELinux, Nginx'in arka uçlara bağlanmasını varsayılan olarak engeller. Bir kez izin verin:
Bashsudo setsebool -P httpd_can_network_connect 1
🚀 Proxy arkasında ilk uygulama
Uygulamanız yalnızca Nginx üzerinden erişilebilsin diye 0.0.0.0 değil 127.0.0.1 adresini dinlemelidir. Dil ne olursa olsun düzen aynıdır: 3000 portunda node server.js, Python için gunicorn -b 127.0.0.1:8000 app:app ya da docker run -d -p 127.0.0.1:3000:80 IMAGE ile yayımlanan bir konteyner.
/etc/nginx/sites-available/example.com dosyasını oluşturun (AlmaLinux/Rocky'da /etc/nginx/conf.d/example.com.conf kullanın):
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 6 location / { 7 proxy_pass http://127.0.0.1:3000; 8 proxy_http_version 1.1; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 proxy_set_header X-Forwarded-Proto $scheme; 13 } 14}
Debian/Ubuntu'da etkinleştirin, ardından doğrulayıp yeniden yükleyin:
Bashsudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
X-Forwarded-* başlıkları uygulamaya gerçek istemci IP'sini ve ziyaretçinin HTTPS kullanıp kullanmadığını bildirir. Bunlar olmadan uygulamanız yalnızca 127.0.0.1 görür ve http:// bağlantıları üretebilir. Pek çok çatının da proxy'ye güvenmesi gerekir (örneğin Express'te app.set('trust proxy', 1)).
🔌 WebSocket desteği
WebSocket, HTTP yükseltme başlıklarına ihtiyaç duyar. http bağlamının başına bir map ekleyin (örneğin /etc/nginx/conf.d/websocket.conf içinde):
Nginxmap $http_upgrade $connection_upgrade { default upgrade; '' close; }
Sonra location bloğunda:
Nginxproxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
⏱️ Zaman aşımları ve gövde boyutu
Varsayılanlar 60 saniye ve 1 MB'tır. Yavaş uç noktalar veya dosya yüklemeleri için ayarlayın:
Nginxproxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; client_max_body_size 50m;
Uzun ömürlü bir WebSocket için proxy_read_timeout değerini artırın (örneğin 3600s) veya uygulamanın ping göndermesini sağlayın.
🔒 Certbot ile HTTPS
Önce güvenlik duvarında 80 ve 443 portlarını açın, sonra:
Bash# Debian / Ubuntu sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com
AlmaLinux/Rocky'da Certbot'u önce sudo dnf install -y epel-release, ardından sudo dnf install -y certbot python3-certbot-nginx ile kurun. Certbot sertifikayı server bloğunuza ekler, HTTP'den HTTPS'e yönlendirmeyi önerir ve otomatik yenilemeyi kurar. Şununla doğrulayın:
Bashsudo certbot renew --dry-run
🗂️ Tek VPS'te birden çok uygulama
Her alan adı için ayrı bir server bloğu oluşturun; her birinin kendi server_name değeri ve yerel portu olsun:
Nginx1server { 2 listen 80; 3 server_name app1.example.com; 4 location / { proxy_pass http://127.0.0.1:3000; } 5} 6 7server { 8 listen 80; 9 server_name app2.example.com; 10 location / { proxy_pass http://127.0.0.1:8000; } 11}
Proxy başlıklarını her blokta tekrarlayın, ardından Certbot'u -d app1.example.com -d app2.example.com ile çalıştırın. Yola göre de ayırabilirsiniz (location /api/ { proxy_pass http://127.0.0.1:8000/; }); sondaki eğik çizgi öneki kaldırır.
✅ Test
Bashcurl -I https://example.com ss -ltnp | grep -E ':(80|443|3000)' sudo tail -f /var/log/nginx/error.log
Arka uç portu yalnızca 127.0.0.1 adresine bağlı olmalı, Nginx ise 80 ve 443'ü dinlemelidir.
🛠️ Sorun giderme
502 Bad Gateway. Uygulama durmuş veya başka bir portta. ss -ltnp ile kontrol edip başlatın. AlmaLinux/Rocky'da hata günlüğündeki Permission denied, yukarıdaki SELinux ayarının eksik olduğunu gösterir.
504 Gateway Timeout. Arka uç proxy_read_timeout süresinden uzun sürüyor. Değeri artırın veya uç noktayı optimize edin.
WebSocket kopuyor ya da 400/426 ile başarısız oluyor. Upgrade ve Connection başlıkları eksik ya da proxy_http_version 1.1; yok.
Günlüklerde yanlış istemci IP'si. X-Forwarded-For gönderiliyor ama uygulamanız proxy'ye güvenmiyor. Çatınızın güven ayarını etkinleştirin.
🎉 Uygulamalarınız artık Nginx arkasında HTTPS, temiz başlıklar ve VPS'inizin kaldırabildiği kadar site için yer ile sunuluyor.