Merhaba arkadaşlar, bugün sizlere modern web uygulamalarının vazgeçilmezi olan Nginx reverse proxy konfigürasyonunu anlatacağım. Özellikle Node.js, Django veya Flask gibi framework'lerle yazdığınız uygulamaları, güvenlik ve performans için doğrudan dış dünyaya açmak yerine Nginx'in arkasına nasıl alacağımızı ve canlı, interaktif uygulamalar için kritik olan WebSocket desteğini nasıl ekleyeceğimizi adım adım göreceğiz. Bu yöntem, statik dosya servisini Nginx'e bırakıp uygulama sunucunuzun sadece dinamik işlerle uğraşmasını sağlayarak kaynak kullanımını optimize eder ve tek bir port (80/443) üzerinden tüm servisleri yönetmenize olanak tanır.
Neden Reverse Proxy Kullanmalıyız?
Benim sunucularda genelde kullandığım yöntem budur. Uygulamanız (örn: 3000 portunda çalışan bir Node.js sunucusu) doğrudan internete açılırsa, statik dosya servisi, SSL termination, rate limiting, gzip sıkıştırma gibi işler için ekstra kod yazmanız veya performans kaybı yaşamanız kaçınılmaz. Nginx ise bu işlerde bir ustadır. Ayrıca, arka planda çalışan uygulama sunucunuzu yeniden başlattığınızda, Nginx kullanıcılara "502 Bad Gateway" hatası göstermek yerine istekleri kuyruğa alabilir veya başka bir backend'e yönlendirebilir. Bu mimari, üretim ortamı için olmazsa olmazdır.
Temel Proxy Pass Konfigürasyonu
İlk olarak, uygulamamızın localhost'ta bir portta (örneğin 3000) çalıştığını varsayalım. Nginx'te ilgili site konfigürasyon dosyasını (genelde /etc/nginx/sites-available/example.com) açıyoruz ve `location /` bloğumuzu aşağıdaki gibi düzenliyoruz. Şu ayara çok dikkat etmelisiniz: `proxy_set_header` direktifleri. Bunlar, arka uçtaki uygulamanıza asıl kullanıcının IP'sini ve protokol bilgisini doğru şekilde iletmenizi sağlar.
Python (Gunicorn ile) için `proxy_pass` değerini genelde `
` şeklinde, uygulama sunucunuzun dinlediği porta göre değiştirirsiniz.
WebSocket Desteği Eklemek
WebSocket, gerçek zamanlı sohbet, canlı bildirim veya oyun gibi uygulamalar için kullanılır. Nginx varsayılan olarak WebSocket bağlantılarını "upgrade" edemez. Bunun için özel bir konfigürasyon gerekir. Genellikle WebSocket trafiği, uygulamanızda `/ws/` veya `/socket.io/` gibi özel bir yol üzerinden gelir. Aşağıdaki örnekte, `/ws/` path'ine gelen istekler için gerekli header'ları iletiyoruz.
Eğer Socket.io kullanıyorsanız, path farklı olabilir. Socket.io için genellikle yukarıdaki WebSocket ayarlarını ana `location /` bloğuna da eklemek gerekebilir, çünkü Socket.io hem HTTP polling hem de WebSocket kullanır. Deneyimlerime göre, Socket.io ile sorun yaşarsanız, tüm trafiğe WebSocket upgrade header'larını eklemeyi deneyebilirsiniz, ancak bu her zaman gerekli değildir.
Dikkat Edilmesi Gerekenler ve Optimizasyon
Buffer Ayarları: Yüksek trafikli sitelerde, büyük istek/cevaplar sorun çıkarabilir. Buffer boyutlarını artırmak faydalı olabilir. Konfigürasyonunuza şu satırları eklemeyi düşünebilirsiniz:
SSL/TLS (HTTPS): Eğer siteniz HTTPS kullanıyorsa, `X-Forwarded-Proto` header'ının `https` olarak iletilmesi çok önemlidir. Aksi takdirde uygulamanız istekleri HTTP olarak algılayabilir ve döngüsel yönlendirmelere sebep olabilir.
Socket.io Özel Durumu: Socket.io ile çalışırken, `proxy_set_header Connection "upgrade";` satırının bazen gereksiz `Connection` header'ı oluşturduğu ve sorun çıkardığı görülmüştür. Eğer bağlantı sorunu yaşarsanız, bu satırı yorum satırı yapıp deneyin.
Konfigürasyon Testi: Her değişiklikten sonra mutlaka `sudo nginx -t` komutunu çalıştırıp syntax hatası olmadığından emin olun.
Servisleri Yeniden Başlatma: Değişiklikleri aktif hale getirmek için `sudo systemctl reload nginx` komutunu kullanın. Bu, servisi yeniden başlatmadan konfigürasyonu yeniden yükler ve kesintiye yol açmaz.
Sonuç
Artık Nginx'i, Node.js veya Python uygulamalarınız için güçlü ve esnek bir reverse proxy ve WebSocket köprüsü olarak kullanabilirsiniz. Bu yapı, güvenlik, ölçeklenebilirlik ve bakım kolaylığı sağlayacaktır.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı framework'ler (Laravel, React) için ekstra ayarlar yapıyor musunuz? Yaşadığınız ilginç sorunlar ve çözümleriniz varsa paylaşmak ister misiniz? Sorusu olan aşağıya yazsın, elimden geldiğince yardımcı olmaya çalışırım.
Benim sunucularda genelde kullandığım yöntem budur. Uygulamanız (örn: 3000 portunda çalışan bir Node.js sunucusu) doğrudan internete açılırsa, statik dosya servisi, SSL termination, rate limiting, gzip sıkıştırma gibi işler için ekstra kod yazmanız veya performans kaybı yaşamanız kaçınılmaz. Nginx ise bu işlerde bir ustadır. Ayrıca, arka planda çalışan uygulama sunucunuzu yeniden başlattığınızda, Nginx kullanıcılara "502 Bad Gateway" hatası göstermek yerine istekleri kuyruğa alabilir veya başka bir backend'e yönlendirebilir. Bu mimari, üretim ortamı için olmazsa olmazdır.
İlk olarak, uygulamamızın localhost'ta bir portta (örneğin 3000) çalıştığını varsayalım. Nginx'te ilgili site konfigürasyon dosyasını (genelde /etc/nginx/sites-available/example.com) açıyoruz ve `location /` bloğumuzu aşağıdaki gibi düzenliyoruz. Şu ayara çok dikkat etmelisiniz: `proxy_set_header` direktifleri. Bunlar, arka uçtaki uygulamanıza asıl kullanıcının IP'sini ve protokol bilgisini doğru şekilde iletmenizi sağlar.
NGINX:
server {
listen 80;
server_name example.com www.example.com;
location / {
# Temel proxy ayarları
proxy_pass http://localhost:3000;
# Önemli Header'ları İlet
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;
# Zaman Aşımı Ayarları (Opsiyonel ama önerilir)
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
Python (Gunicorn ile) için `proxy_pass` değerini genelde `
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
WebSocket, gerçek zamanlı sohbet, canlı bildirim veya oyun gibi uygulamalar için kullanılır. Nginx varsayılan olarak WebSocket bağlantılarını "upgrade" edemez. Bunun için özel bir konfigürasyon gerekir. Genellikle WebSocket trafiği, uygulamanızda `/ws/` veya `/socket.io/` gibi özel bir yol üzerinden gelir. Aşağıdaki örnekte, `/ws/` path'ine gelen istekler için gerekli header'ları iletiyoruz.
NGINX:
server {
listen 80;
server_name example.com www.example.com;
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;
}
# WebSocket için özel lokasyon bloğu
location /ws/ {
proxy_pass http://localhost:3000; # WS sunucunuzun adresi
# WebSocket için KRİTİK Header'lar
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;
# Zaman aşımını uzat (WS bağlantıları uzun sürelidir)
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
Eğer Socket.io kullanıyorsanız, path farklı olabilir. Socket.io için genellikle yukarıdaki WebSocket ayarlarını ana `location /` bloğuna da eklemek gerekebilir, çünkü Socket.io hem HTTP polling hem de WebSocket kullanır. Deneyimlerime göre, Socket.io ile sorun yaşarsanız, tüm trafiğe WebSocket upgrade header'larını eklemeyi deneyebilirsiniz, ancak bu her zaman gerekli değildir.
Buffer Ayarları: Yüksek trafikli sitelerde, büyük istek/cevaplar sorun çıkarabilir. Buffer boyutlarını artırmak faydalı olabilir. Konfigürasyonunuza şu satırları eklemeyi düşünebilirsiniz:
NGINX:
proxy_buffers 8 16k;
proxy_buffer_size 32k;
Socket.io Özel Durumu: Socket.io ile çalışırken, `proxy_set_header Connection "upgrade";` satırının bazen gereksiz `Connection` header'ı oluşturduğu ve sorun çıkardığı görülmüştür. Eğer bağlantı sorunu yaşarsanız, bu satırı yorum satırı yapıp deneyin.
Konfigürasyon Testi: Her değişiklikten sonra mutlaka `sudo nginx -t` komutunu çalıştırıp syntax hatası olmadığından emin olun.
Servisleri Yeniden Başlatma: Değişiklikleri aktif hale getirmek için `sudo systemctl reload nginx` komutunu kullanın. Bu, servisi yeniden başlatmadan konfigürasyonu yeniden yükler ve kesintiye yol açmaz.
Artık Nginx'i, Node.js veya Python uygulamalarınız için güçlü ve esnek bir reverse proxy ve WebSocket köprüsü olarak kullanabilirsiniz. Bu yapı, güvenlik, ölçeklenebilirlik ve bakım kolaylığı sağlayacaktır.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı framework'ler (Laravel, React) için ekstra ayarlar yapıyor musunuz? Yaşadığınız ilginç sorunlar ve çözümleriniz varsa paylaşmak ister misiniz? Sorusu olan aşağıya yazsın, elimden geldiğince yardımcı olmaya çalışırım.