Nginx ile Reverse Proxy Kurulumu ve Yapılandırma Rehberi 
Selam sistemciler!
Bugün terminalin tozunu alıp, web mimarimizin arka planındaki sessiz kahramanlardan biri olan reverse proxy konusuna dalıyoruz. Özellikle Nginx ile nasıl güçlü, güvenli ve performanslı bir reverse proxy katmanı oluşturacağımızı adım adım konuşacağız. Eğer birden fazla uygulamanızı tek bir sunucuda yönetiyor, SSL yönetimini merkezileştirmek istiyor veya arka plandaki uygulama sunucularınızı (Node.js, Gunicorn, Tomcat vb.) korumak istiyorsanız, bu rehber tam size göre.
Reverse Proxy Nedir ve Neden İhtiyaç Duyarız?
Basitçe anlatmak gerekirse, reverse proxy (ters vekil sunucu), istemcilerden gelen talepleri alıp, uygun arka uç sunuculara yönlendiren ve cevapları istemciye geri ileten bir ara katmandır.
Neden kullanmalıyız?
Adım 1: Nginx Kurulumu
İlk olarak, güncel bir Ubuntu/Debian sunucusunda Nginx'i kuralım.
Kurulum tamamlandıktan sonra Nginx servisini başlatalım ve sistem açılışında otomatik başlamasını sağlayalım.
Tarayıcınızdan sunucunuzun IP adresini yazdığınızda "Welcome to nginx!" sayfasını görüyorsanız, kurulum başarılı demektir.
Adım 2: Temel Reverse Proxy Yapılandırması
Diyelim ki 3000 portunda çalışan bir Node.js uygulamanız var ve bunu Nginx üzerinden `ornekdomain.com` olarak sunmak istiyorsunuz.
Öncelikle, Nginx'in sites-available dizininde yeni bir yapılandırma dosyası oluşturalım.
Aşağıdaki temel yapılandırmayı dosyaya ekleyelim. Bu konfigürasyon, tüm gelen talepleri `localhost:3000` adresine yönlendirecek.
proxy_set_header direktifleri çok önemli! Arka uçtaki uygulamanızın, asıl istemcinin IP adresini ve kullanılan protokolü (http/https) doğru bir şekilde görmesini sağlar. Bu, loglama ve güvenlik için kritiktir.
Oluşturduğumuz yapılandırmayı aktif hale getirmek için, dosyayı `sites-enabled` dizinine sembolik link olarak ekleyelim ve Nginx'i test edip yeniden başlatalım.
`nginx -t` komutu hayat kurtarıcıdır! Her değişiklikten sonra mutlaka çalıştırın, hata varsa yeniden başlatmadan önce size söylesin.
Adım 3: SSL/TLS ile Güvenli Hale Getirme (Let's Encrypt)
Artık proxy'miz çalışıyor. Şimdi onu HTTPS ile güvence altına alalım. Bunun için ücretsiz ve otomatik bir sertifika sağlayıcısı olan Let's Encrypt'i kullanacağız. Öncelikle Certbot'u kuralım.
Ardından, daha önce oluşturduğumuz `ornek-proxy` yapılandırması için sertifikayı alalım ve Nginx yapılandırmasını otomatik olarak güncelleyelim.
Certbot size birkaç soru soracak (e-posta, kullanım şartları vs.). Tamamladıktan sonra, `/etc/nginx/sites-available/ornek-proxy` dosyanız otomatik olarak güncellenecek ve 80 portundan gelen trafiği 443 (HTTPS) portuna yönlendirecek şekilde ayarlanacak. Tekrar `sudo nginx -t` ve `sudo systemctl reload nginx` komutlarını çalıştırmayı unutmayın.
Adım 4: İleri Seviye Optimizasyon ve Güvenlik Ayarları
Temel işlevsellik hazır. Şimdi performansı ve güvenliği artıralım. Aynı `location /` bloğunun içine aşağıdaki ayarları ekleyebilirsiniz.
WebSocket desteği, real-time uygulamalar (canlı sohbet, bildirimler) için kritiktir. `Upgrade` ve `Connection` header'larını iletmezseniz, WebSocket bağlantıları çalışmaz.
Adım 5: Birden Fazla Uygulama için Proxy (Subdomain veya Lokasyon Bazlı)
Nginx'in gücü, tek bir noktadan birden fazla uygulamayı yönetebilmesidir.
Örnek 1: Subdomain ile Yönlendirme
`api.ornekdomain.com`'u farklı bir porta yönlendirelim.
Örnek 2: Lokasyon (Path) Bazlı Yönlendirme
`ornekdomain.com/blog` isteklerini ayrı bir sunucuya/uygulamaya yönlendirelim.
Son Kontroller ve Sorun Giderme İpuçları
Her şeyi yaptınız ama çalışmıyor mu? İşte birkaç kontrol noktası:
İşte bu kadar! Artık Nginx ile sağlam bir reverse proxy katmanınız var. Bu yapı, uygulamalarınızı daha güvenli, daha yönetilebilir ve daha ölçeklenebilir hale getirecek.
Peki siz reverse proxy'yi hangi senaryolarda kullanıyorsunuz? Veya kurulum sırasında karşılaştığınız ilginç sorunlar oldu mu? Yorumlarda deneyimlerinizi paylaşın, birlikte öğrenelim!
Selam sistemciler!
Reverse Proxy Nedir ve Neden İhtiyaç Duyarız?
Basitçe anlatmak gerekirse, reverse proxy (ters vekil sunucu), istemcilerden gelen talepleri alıp, uygun arka uç sunuculara yönlendiren ve cevapları istemciye geri ileten bir ara katmandır.
Neden kullanmalıyız?
- Güvenlik Katmanı: Arka uç sunucularınızı doğrudan internete açmazsınız. Saldırı yüzeyinizi küçültürsünüz.
- SSL Sonlandırma: Tüm SSL/TLS şifreleme işini Nginx üstlenir. Arka uç sunucularınız daha hafif ve hızlı çalışır.
- Yük Dengeleme (Load Balancing): Gelen trafiği birden fazla arka uç sunucusuna dağıtabilirsiniz.
- Önbellekleme (Caching): Statik ve hatta dinamik içerikleri önbellekleyerek arka uçtaki yükü azaltırsınız.
- Tek Noktadan Yönetim: Birden fazla uygulama veya alt alan adını (subdomain) tek bir sunucu/port üzerinden yönetebilirsiniz.
Adım 1: Nginx Kurulumu
İlk olarak, güncel bir Ubuntu/Debian sunucusunda Nginx'i kuralım.
Bash:
sudo apt update
sudo apt install nginx -y
Kurulum tamamlandıktan sonra Nginx servisini başlatalım ve sistem açılışında otomatik başlamasını sağlayalım.
Bash:
sudo systemctl start nginx
sudo systemctl enable nginx
Tarayıcınızdan sunucunuzun IP adresini yazdığınızda "Welcome to nginx!" sayfasını görüyorsanız, kurulum başarılı demektir.
Adım 2: Temel Reverse Proxy Yapılandırması
Diyelim ki 3000 portunda çalışan bir Node.js uygulamanız var ve bunu Nginx üzerinden `ornekdomain.com` olarak sunmak istiyorsunuz.
Öncelikle, Nginx'in sites-available dizininde yeni bir yapılandırma dosyası oluşturalım.
Bash:
sudo nano /etc/nginx/sites-available/ornek-proxy
Aşağıdaki temel yapılandırmayı dosyaya ekleyelim. Bu konfigürasyon, tüm gelen talepleri `localhost:3000` adresine yönlendirecek.
NGINX:
server {
listen 80;
server_name ornekdomain.com www.ornekdomain.com;
location / {
proxy_pass http://localhost:3000;
# Bazı önemli header'ları iletmek için proxy ayarları
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_set_header direktifleri çok önemli! Arka uçtaki uygulamanızın, asıl istemcinin IP adresini ve kullanılan protokolü (http/https) doğru bir şekilde görmesini sağlar. Bu, loglama ve güvenlik için kritiktir.
Oluşturduğumuz yapılandırmayı aktif hale getirmek için, dosyayı `sites-enabled` dizinine sembolik link olarak ekleyelim ve Nginx'i test edip yeniden başlatalım.
Bash:
sudo ln -s /etc/nginx/sites-available/ornek-proxy /etc/nginx/sites-enabled/
sudo nginx -t # Yapılandırma sözdizimini test et
sudo systemctl reload nginx # Değişiklikleri uygula
`nginx -t` komutu hayat kurtarıcıdır! Her değişiklikten sonra mutlaka çalıştırın, hata varsa yeniden başlatmadan önce size söylesin.
Adım 3: SSL/TLS ile Güvenli Hale Getirme (Let's Encrypt)
Artık proxy'miz çalışıyor. Şimdi onu HTTPS ile güvence altına alalım. Bunun için ücretsiz ve otomatik bir sertifika sağlayıcısı olan Let's Encrypt'i kullanacağız. Öncelikle Certbot'u kuralım.
Bash:
sudo apt install certbot python3-certbot-nginx -y
Ardından, daha önce oluşturduğumuz `ornek-proxy` yapılandırması için sertifikayı alalım ve Nginx yapılandırmasını otomatik olarak güncelleyelim.
Bash:
sudo certbot --nginx -d ornekdomain.com -d www.ornekdomain.com
Certbot size birkaç soru soracak (e-posta, kullanım şartları vs.). Tamamladıktan sonra, `/etc/nginx/sites-available/ornek-proxy` dosyanız otomatik olarak güncellenecek ve 80 portundan gelen trafiği 443 (HTTPS) portuna yönlendirecek şekilde ayarlanacak. Tekrar `sudo nginx -t` ve `sudo systemctl reload nginx` komutlarını çalıştırmayı unutmayın.
Adım 4: İleri Seviye Optimizasyon ve Güvenlik Ayarları
Temel işlevsellik hazır. Şimdi performansı ve güvenliği artıralım. Aynı `location /` bloğunun içine aşağıdaki ayarları ekleyebilirsiniz.
NGINX:
location / {
proxy_pass http://localhost:3000;
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;
# Performans için zaman aşımı (timeout) ayarları
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# WebSocket desteği için gerekli header'lar
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Buffer ayarları (yüksek trafik için önemli)
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
# Arka uç hatalarında özel hata sayfaları gösterme (Opsiyonel)
proxy_intercept_errors on;
error_page 502 503 504 /custom_50x.html;
}
WebSocket desteği, real-time uygulamalar (canlı sohbet, bildirimler) için kritiktir. `Upgrade` ve `Connection` header'larını iletmezseniz, WebSocket bağlantıları çalışmaz.
Adım 5: Birden Fazla Uygulama için Proxy (Subdomain veya Lokasyon Bazlı)
Nginx'in gücü, tek bir noktadan birden fazla uygulamayı yönetebilmesidir.
Örnek 1: Subdomain ile Yönlendirme
`api.ornekdomain.com`'u farklı bir porta yönlendirelim.
NGINX:
server {
listen 443 ssl;
server_name api.ornekdomain.com;
# ... SSL ayarları buraya (Certbot ekler) ...
location / {
proxy_pass http://localhost:8080; # Farklı bir arka uç
# ... temel proxy ayarları ...
}
}
Örnek 2: Lokasyon (Path) Bazlı Yönlendirme
`ornekdomain.com/blog` isteklerini ayrı bir sunucuya/uygulamaya yönlendirelim.
NGINX:
server {
listen 443 ssl;
server_name ornekdomain.com;
# ... SSL ayarları ...
location / {
proxy_pass http://localhost:3000; # Ana uygulama
}
location /blog {
proxy_pass http://localhost:2368; # Örneğin, bir Ghost blog
# /blog için özel proxy ayarları yapılabilir.
}
}
Son Kontroller ve Sorun Giderme İpuçları
Her şeyi yaptınız ama çalışmıyor mu? İşte birkaç kontrol noktası:
- Arka uç uygulamanız gerçekten belirttiğiniz portta (örn: 3000) ve 0.0.0.0 veya 127.0.0.1 adresinde mi çalışıyor? (`sudo ss -tulpn | grep :3000`)
- Güvenlik duvarınız (UFW/iptables) 80 ve 443 portlarını açık mı?
- DNS kayıtlarınız (A kaydı) doğru şekilde sunucu IP adresinize işaret ediyor mu?
- Nginx hata loglarını kontrol edin: `sudo tail -f /var/log/nginx/error.log`
- Arka uç uygulama loglarını kontrol edin.
İşte bu kadar! Artık Nginx ile sağlam bir reverse proxy katmanınız var. Bu yapı, uygulamalarınızı daha güvenli, daha yönetilebilir ve daha ölçeklenebilir hale getirecek.
Peki siz reverse proxy'yi hangi senaryolarda kullanıyorsunuz? Veya kurulum sırasında karşılaştığınız ilginç sorunlar oldu mu? Yorumlarda deneyimlerinizi paylaşın, birlikte öğrenelim!