Reverse Proxy Nedir? Nginx ile Örnek Yapılandırma
Reverse proxy, istemci isteklerini arka uç sunuculara ileten bir ara katmandır. Nginx ile Node.js veya Python uygulamasını nasıl serve edersiniz?
Reverse Proxy Nedir?
Reverse proxy, istemcilerin isteklerini alarak arka uç sunuculara (backend) ileten ve yanıtları istemciye geri döndüren bir ara katman sunucusudur. İstemci, gerçekte hangi sunucudan yanıt aldığını bilmez; tüm iletişim reverse proxy üzerinden geçer.
Bunu bir otel resepsiyonuyla düşünebilirsiniz: Misafir (istemci) odaya (arka uç sunucu) doğrudan gitmez; resepsiyondan (reverse proxy) geçer.
Normal (forward) proxy ile karıştırılmamalıdır:
- Forward Proxy: İstemci tarafında çalışır. İstemci → Proxy → Internet
- Reverse Proxy: Sunucu tarafında çalışır. İstemci → Reverse Proxy → Backend
Reverse Proxy Kullanım Avantajları
1. SSL Termination
SSL şifreleme/çözme işlemini reverse proxy üstlenir. Arka uç sunucular düz HTTP üzerinden iletişim kurabilir.
2. Load Balancing
Gelen istekleri birden fazla arka uç sunucuya dağıtır.
3. Önbelleğe Alma (Caching)
Statik içerikleri önbelleğe alarak arka uç sunucu yükünü azaltır.
4. Güvenlik
Arka uç sunucuların IP adresleri gizlenir. DDoS koruması ve rate limiting eklenebilir.
5. Sıkıştırma
Gzip/Brotli sıkıştırmasını merkezi olarak uygular.
Temel Nginx Reverse Proxy Yapılandırması
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000; # Arka uç adres
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
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_cache_bypass $http_upgrade;
}
}
Node.js Uygulamasını Nginx ile Serve Etme
Node.js uygulamanız 3000 portunda çalışıyorsa:
sudo nano /etc/nginx/sites-available/nodejs-app
upstream nodejs {
server 127.0.0.1:3000;
keepalive 64;
}
server {
listen 80;
server_name app.example.com;
# HTTPS'e yönlendir
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
# Güvenlik başlıkları
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
# Statik dosyalar Nginx'ten serve et
location /static/ {
root /var/www/nodejs-app;
expires 1y;
add_header Cache-Control "public";
}
# Dinamik istekleri Node.js'e yönlendir
location / {
proxy_pass http://nodejs;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
# WebSocket desteği için
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}
sudo ln -s /etc/nginx/sites-available/nodejs-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Python/Gunicorn Uygulamasını Nginx ile Serve Etme
# Gunicorn kurulumu ve başlatma
pip install gunicorn
gunicorn --workers 4 --bind 127.0.0.1:8000 myapp:app
# Nginx yapılandırması
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
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;
# Timeout ayarları
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
Load Balancing Yapılandırması
Birden fazla arka uç sunucu arasında yük dağılımı:
upstream backend_cluster {
# Round-robin (varsayılan)
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000;
# Ağırlıklı dağılım
# server 192.168.1.10:3000 weight=3;
# server 192.168.1.11:3000 weight=1;
# En az bağlantılı sunucuya yönlendir
# least_conn;
# IP bazlı tutarlı yönlendirme (session stickiness)
# ip_hash;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name example.com;
location / {
proxy_pass http://backend_cluster;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Health Check ve Failover
upstream backend_cluster {
server 192.168.1.10:3000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:3000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:3000 backup; # Diğerleri çökerse devreye girer
}
Nginx Reverse Proxy ile Önbelleğe Alma
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m max_size=1g
inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 1d;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout http_500;
proxy_cache_bypass $http_cache_control;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
Rate Limiting
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
Özet
Nginx reverse proxy, modern web mimarisinin temel taşlarından biridir. Node.js veya Python uygulamalarınızı internete güvenle açmak, SSL termination yapmak ve yük dengeleme sağlamak için Nginx vazgeçilmez bir araçtır. X-Real-IP başlığını doğru ilettiğinizden ve SSL yapılandırmasını eksiksiz yaptığınızdan emin olun.
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!