aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Araçlar & DevOps

Nginx Reverse Proxy: Uygulama Sunucusunu Önüne Alma

Bir nginx reverse proxy kurmak, uygulama sunucunuzu doğrudan internete açmak yerine onun önüne sağlam bir kapı koymanın en pratik yoludur. İster bir Node.js API'si, ister Laravel için bir PHP-FPM süreci, ister 8080 portunda dinleyen bir oyun panel arayüzü olsun; Nginx gelen istekleri karşılar, TLS'i sonlandırır, statik dosyaları servis eder ve geri kalanı arka taraftaki uygulamaya iletir. Bu yazıda sıfırdan çalışan bir yapılandırmayı, sık yapılan hataları ve üretim için gereken ince ayarları adım adım kuruyoruz.

Reverse proxy tam olarak ne yapar?

Klasik bir proxy istemci tarafında durur ve dışarı çıkan trafiği yönetir. Reverse proxy ise tam tersidir: sunucu tarafında durur ve içeri gelen trafiği karşılar. İstemci sadece Nginx'i görür; arkadaki uygulamanın hangi portta, hangi dilde veya kaç kopya halinde çalıştığını bilmez. Bu soyutlama size birçok kazanım sağlar:

  • TLS sonlandırma: Sertifika yönetimi tek noktada, Nginx'te toplanır. Uygulama düz HTTP konuşur.
  • Tek port, tek alan: 80 ve 443'ten gelen her şeyi karşılayıp farklı yollara (/api, /admin) farklı arka uçlara dağıtırsınız.
  • Güvenlik: Uygulama portu dışarıya kapalı kalır; sadece localhost'tan erişilir.
  • Performans: Statik dosyalar, gzip/brotli sıkıştırma ve önbellek doğrudan Nginx tarafından yönetilir.

Kurulum ve temel yapılandırma

Debian/Ubuntu üzerinde kurulum tek satırdır:

sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx

Yapılandırma dosyalarını /etc/nginx/sites-available/ altında tutmak ve sites-enabled/ içine sembolik bağ ile etkinleştirmek en temiz yöntemdir. Diyelim ki uygulamanız 127.0.0.1:3000 üzerinde çalışıyor. Aşağıdaki sunucu bloğu gelen tüm istekleri ona iletir:

server {
    listen 80;
    server_name uygulama.example.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;
    }
}

Dosyayı etkinleştirip yapılandırmayı test ederek yeniden yükleyin:

sudo ln -s /etc/nginx/sites-available/uygulama \
           /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Proxy başlıkları neden bu kadar önemli?

Yukarıdaki proxy_set_header satırları süs değildir. Nginx araya girdiği an, arka uçtaki uygulama artık gerçek istemciyi göremez; karşısında sadece 127.0.0.1 vardır. Doğru başlıkları geçmezseniz log'larda herkesin IP'si localhost görünür, HTTPS'i HTTP sanıp sonsuz yönlendirme döngüsüne girersiniz veya oturum çerezleri bozulur.

  • X-Forwarded-For gerçek istemci IP'sini taşır.
  • X-Forwarded-Proto isteğin aslında HTTPS olduğunu söyler; framework'ünüzün güvenli çerez ve doğru URL üretmesi buna bağlıdır.
  • Host başlığını korumak, çok alanlı kurulumlarda uygulamanın doğru host'u görmesini sağlar.

Laravel gibi framework'lerde bu başlıkların güvenilir sayılması için trusted proxy ayarını yapmayı unutmayın; aksi halde X-Forwarded-* başlıkları yok sayılır.

HTTPS ve TLS sonlandırma

Reverse proxy'nin en güçlü yanı sertifikayı tek yerde toplamasıdır. Let's Encrypt ile ücretsiz sertifika almak için Certbot en pratik araçtır:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d uygulama.example.com

Certbot 443 bloğunu, sertifika yollarını ve 80'den 443'e yönlendirmeyi otomatik ekler. Manuel yazmak isterseniz iskelet şöyledir:

server {
    listen 443 ssl;
    server_name uygulama.example.com;

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

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

TLS'i Nginx'te sonlandırdığınız için arka uçla iletişim düz HTTP olabilir; bu, localhost üzerinde tamamen güvenlidir ve uygulamayı sertifika derdinden kurtarır.

WebSocket, zaman aşımı ve önbellek

Gerçek zamanlı uygulamalar (sohbet, canlı pano, oyun konsolu) WebSocket kullanır. Nginx'in bağlantıyı yükseltebilmesi için iki başlık şarttır:

location /ws {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade    $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
}

Uzun süren isteklerde varsayılan 60 saniyelik proxy_read_timeout sizi yanıltabilir; ağır bir rapor üretimi yarıda kesilir. Statik içerik için ise Nginx'in kendi önbelleğini veya expires direktifini kullanmak, isteği hiç arka uca taşımadan yanıt vererek uygulamayı rahatlatır.

Yük dengeleme ve birden çok arka uç

Tek bir uygulama kopyası yeterli olmadığında upstream bloğu ile birden fazla süreci tek havuz olarak tanımlarsınız:

upstream app_pool {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    listen 80;
    location / {
        proxy_pass http://app_pool;
    }
}

Nginx istekleri varsayılan olarak sırayla (round-robin) dağıtır; least_conn ile en az bağlantısı olana, ip_hash ile aynı istemciyi hep aynı arka uca gönderebilirsiniz. Bu, sıfır kesintili dağıtım (mavi-yeşil) yapmanın da temelidir.

Sık Sorulan Sorular

Reverse proxy ile yük dengeleyici aynı şey mi?

Tam olarak değil. Her yük dengeleyici bir reverse proxy gibi davranır ama her reverse proxy yük dengelemek zorunda değildir. Nginx ikisini de yapabilir: tek arka uç varsa sadece proxy, birden çok arka uç varsa upstream ile yük dengeleyici olur.

502 Bad Gateway hatasını nasıl çözerim?

502 neredeyse her zaman arka ucun çalışmadığı veya proxy_pass'teki adres/portun yanlış olduğu anlamına gelir. Uygulamanın gerçekten dinlediğini ss -ltnp ile doğrulayın ve /var/log/nginx/error.log dosyasına bakın.

TLS'i arka uçta mı sonlandırmalıyım?

Çoğu kurulumda hayır. TLS'i Nginx'te sonlandırıp localhost üzerinden düz HTTP konuşmak hem basit hem güvenlidir. Yalnızca ağ üzerinden geçen iç trafiği de şifrelemeniz gereken katı uyumluluk senaryolarında uçtan uca TLS düşünülür.

Altyapınızı Nginx arkasına almak mı istiyorsunuz? TLS, önbellek ve sıfır kesintili dağıtım dahil sağlam bir reverse proxy kurulumunu birlikte tasarlayabiliriz. Benimle iletişime geçin ve projenizi konuşalım.

Bu kategorideki tüm yazılar →

Devamı için