Reverse Proxy Nedir ve Nginx ile Nasıl Kurulur?
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?
- Ön Koşullar
- Nginx Kurulumu
- Basit Reverse Proxy (Tek Uygulama)
- Yük Dengeleme (Upstream)
- SSL Sonlandırma (Let’s Encrypt) ve HTTP/2
- Önbellekleme ve Sıkıştırma
- Path/Host Bazlı Yönlendirme
- Gerçek IP ve Proxy Zinciri
- Oran Sınırlama (Rate Limit) ve Temel Güvenlik
- WebSocket ve gRPC Dikkatleri
- Günlükler (Access/Error) ve İzleme
- Servis Yönetimi ve Otomatik Yeniden Yükleme
- Sorun Giderme İpuçları
- Sonuç
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/Connectionbaşlıklarını iletin (yukarıdaki örnek). - gRPC için
http2vegrpc_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_passve uygulama loglarını kontrol edin. - SSL Handshake: Sertifika yolu ve
server_nameeşleşmesini doğrulayın. - Gerçek IP görünmüyor:
real_ip_headerveset_real_ip_fromCIDR’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.