Reverse Proxy Nedir ve Nginx ile Nasıl Kurulur?

Reverse Proxy Nedir ve Nginx ile Nasıl Kurulur?
Yazı Özetini Göster

Reverse Proxy Nedir ve Nginx ile Nasıl Kurulur?

Reverse proxy, istemci isteklerini arka plandaki uygulama sunucularına yönlendiren ve arada bir vekâlet katmanı oluşturan ağ bileşenidir. Nginx reverse proxy; SSL sonlandırma, yük dengeleme, önbellekleme, hız sınırlama, WAF entegrasyonu ve gerçek IP başlıklarının yönetimi gibi kritik görevleri üstlenir. Bu rehberde reverse proxy’nin temel mantığını, Nginx ile kurulum adımlarını ve uygulama örneklerini ele alıyoruz.

Reverse Proxy Ne İşe Yarar?

  • Güvenlik: Uygulama sunucularını internete kapalı tutar, TLS ve header hijyeni sağlar.
  • Performans: Static cache, HTTP/2, sıkıştırma ve keepalive ile gecikmeyi düşürür.
  • Ölçek: Yük dengeleme (round-robin, ip_hash, least_conn) ve health check.
  • Esneklik: WebSocket/HTTP/2 gRPC geçişi, path/host tabanlı yönlendirme.

Ön Koşullar

  • Linux sunucu (Ubuntu/Debian/CentOS/AlmaLinux).
  • Root veya sudo erişimi, 80/443 portlarına izin.
  • Uygulama sunucularınız (örn. Node.js, PHP-FPM, .NET, Python) iç ağda/localhost’ta dinliyor olmalı.

Nginx Kurulumu

# Ubuntu/Debian
sudo apt update && sudo apt install -y nginx

# RHEL tabanlı
sudo dnf install -y nginx
sudo systemctl enable --now nginx

Basit Reverse Proxy (Tek Uygulama)

# /etc/nginx/sites-available/example.conf
server {
  listen 80;
  server_name 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   Upgrade $http_upgrade;
    proxy_set_header   Connection "upgrade";
  }
}
# Etkinleştirme (Debian ailesi)
sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Yük Dengeleme (Upstream)

# /etc/nginx/conf.d/upstream.conf
upstream app_pool {
  least_conn;
  server 10.0.0.11:3000 max_fails=3 fail_timeout=10s;
  server 10.0.0.12:3000 max_fails=3 fail_timeout=10s;
  keepalive 64;
}

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://app_pool;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

SSL Sonlandırma (Let’s Encrypt) ve HTTP/2

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

# Örnek sunucu bloğu (özet)
server {
  listen 443 ssl http2;
  server_name example.com;
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

  location / {
    proxy_pass http://127.0.0.1:3000;
  }
}

server {
  listen 80;
  server_name example.com;
  return 301 https://$host$request_uri;
}

Önbellekleme ve Sıkıştırma

# /etc/nginx/conf.d/cache.conf
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=60m max_size=1g;

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

  gzip on; gzip_types text/css application/javascript application/json image/svg+xml;
  location /assets/ {
    proxy_cache STATIC;
    proxy_cache_valid 200 302 30m;
    proxy_cache_valid 404 1m;
    add_header X-Cache-Status $upstream_cache_status;
    proxy_pass http://127.0.0.1:3000;
  }
}

Path/Host Bazlı Yönlendirme

# Tek alan adı, çok servis
location /api/  { proxy_pass http://127.0.0.1:4000/; }
location /app/  { proxy_pass http://127.0.0.1:5000/; }

# Çok alan adı (server_name match)
server_name api.example.com;  # → API havuzu
server_name www.example.com;  # → Frontend

Gerçek IP ve Proxy Zinciri

# Cloudflare/Azure FrontDoor/ELB ardında
set_real_ip_from  173.245.48.0/20;  # Cloudflare örnek
real_ip_header    X-Forwarded-For;
real_ip_recursive on;

Oran Sınırlama (Rate Limit) ve Temel Güvenlik

# /etc/nginx/conf.d/limit.conf
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
server {
  location /login {
    limit_req zone=req burst=20 nodelay;
    proxy_pass http://127.0.0.1:3000;
  }

  # Güvenlik başlıkları
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-Content-Type-Options "nosniff";
  add_header Referrer-Policy "strict-origin-when-cross-origin";
}

WebSocket ve gRPC Dikkatleri

  • WebSocket için Upgrade/Connection başlıklarını iletin (yukarıdaki örnek).
  • gRPC için http2 ve grpc_pass (stream) yapılandırmalarını kullanın.

Günlükler (Access/Error) ve İzleme

access_log /var/log/nginx/access.log main;
error_log  /var/log/nginx/error.log warn;

# Canlı test
sudo nginx -t
sudo tail -f /var/log/nginx/access.log

Servis Yönetimi ve Otomatik Yeniden Yükleme

sudo systemctl enable --now nginx
sudo systemctl reload nginx

Sorun Giderme İpuçları

  • 502 Bad Gateway: Upstream kapalı/port hatalı; proxy_pass ve uygulama loglarını kontrol edin.
  • SSL Handshake: Sertifika yolu ve server_name eşleşmesini doğrulayın.
  • Gerçek IP görünmüyor: real_ip_header ve set_real_ip_from CIDR’larını ekleyin.

Sonuç

Nginx reverse proxy, uygulamalarınızı güvenli, ölçeklenebilir ve hızlı biçimde internete açmanın en pratik yoludur. SSL sonlandırma, önbellekleme, yük dengeleme ve güvenlik başlıklarıyla tek katmanda standartlaştırılmış bir giriş noktası (ingress) oluşturursunuz. Kurumsal trafikte Premium VDS veya Sunucu Barındırma altyapılarıyla birleştiğinde gecikme düşer, güvenlik ve gözlenebilirlik artar.

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer Yazılar