Nginx'i arka uç uygulamalar için ters proxy olarak yapılandırma
Giriş
Modern sunucu kurulumlarında, uygulamalar nadiren doğrudan internete bağlanır. Bunun yerine, bir ters proxy onların önünde durur ve gelen istemci isteklerini yönetir. Nginx, bu iş için en popüler araçlardan biridir çünkü hızlı, güvenilir ve yapılandırması kolaydır. Bu eğitimde, aynı sunucuda çalışan bir arka uç uygulaması için Nginx'i ters proxy olarak nasıl yapılandıracağınızı öğreneceksiniz.
Ters proxy nedir?
Ters proxy, bir sunucudur ve:
- İstemcilerden (tarayıcılar, API'ler vb.) gelen istekleri kabul eder
- Bu istekleri bir arka uç uygulamasına iletir
- Arka uçtan gelen yanıtı istemciye geri gönderir
İstemci, arka uç uygulamasıyla doğrudan konuşmaz.
Ters proxy vs doğrudan erişim
Ters proxy olmadan:
İstemci ---> Arka uç uygulaması (port 3000)
Ters proxy ile:
İstemci ---> Nginx (port 80, 443) ---> Arka uç uygulaması (port 3000)
Nginx'i ters proxy olarak kullanmanın avantajları nelerdir?
Uygulamanızın önünde Nginx kullanmak, size şunları sağlar:
- Yalnızca 80/443 portlarını internete açma
- Arka uç hizmetlerini doğrudan erişimden gizleme
- HTTPS (TLS) bağlantılarını tek bir yerde sonlandırma
- Günlük kaydı, erişim kontrolü ve hız sınırlama ekleme
- Bir sunucuda birden fazla uygulama çalıştırma
Sistem yöneticileri için bu, daha iyi güvenlik ve daha kolay yönetim anlamına gelir.
Bu eğitimde kullanılan senaryo
İşleri basit tutmak için aşağıdaki kurulumu kullanacağız:
- Nginx,
80portunu dinler - Arka uç uygulaması
127.0.0.1:3000adresini dinler http://example.comadresine yapılan istekler arka uca yönlendirilir
Trafik akış diyagramı
[ Tarayıcı ] | v [ Nginx example.com:80,443 ] | v [ Arka uç uygulaması 127.0.0.1:3000 ]
Ön koşullar
Başlamadan önce, şunlara sahip olduğunuzdan emin olun:
- En son Debian kararlı sürümüne sahip bir Linux sunucu
- Root veya sudo erişimi
- Halihazırda çalışan bir arka uç uygulaması (örneğin, bir Node.js, Python veya Java uygulaması)
- Linux terminali ile temel düzeyde aşinalık
Nginx'i yükleyin
Paket listelerini güncelleyin ve Nginx ile curl'u (kurulum testi için) yükleyin:
sudo apt update
sudo apt install nginx curl
Nginx'in çalıştığını kontrol edin:
systemctl status nginx
Çıktıda "active (running)" ifadesini görmelisiniz.
Nginx'i yerel olarak test edin:
curl http://localhost
Nginx çalışıyorsa, varsayılan karşılama sayfasını alırsınız.
Nginx yapılandırma yapısını anlayın
Nginx yapılandırma dosyaları genellikle /etc/nginx/ içinde saklanır. Önemli dizinler:
/etc/nginx/nginx.conf— ana yapılandırma dosyası/etc/nginx/sites-available/— site yapılandırma dosyaları (aktif değil)/etc/nginx/sites-enabled/— etkin site yapılandırmaları (sembolik bağlantılar)
Nginx, yapılandırma dosyalarını sites-enabled klasöründen okur, doğrudan sites-available'dan değil. Site yapılandırma dosyalarını sites-available'da oluşturup ardından bunlara sites-enabled'da sembolik bağlantılar oluşturmanız önerilir.
Ters proxy yapılandırması oluşturun
Yeni bir site dosyası oluşturun
sudo nano /etc/nginx/sites-available/reverse-proxy.conf
Ters proxy yapılandırmasını ekleyin
server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1: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; } }
Yapılandırmayı anlayın
Sunucu bloğu
server { listen 80; server_name example.com; }
listen 80;— Nginx, 80 portunda HTTP trafiğini dinlerserver_name example.com;— bu sunucu bloğunun yanıt verdiği alan adı
Konum bloğu
location / { proxy_pass http://127.0.0.1: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; }
location /— gelen tüm URL'leri eşleştirirproxy_pass— istekleri arka uç uygulamasına iletir
Proxy başlıkları
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;
Bu başlıklar, arka ucun şunları bilmesini sağlar:
- Orijinal alan adı
- İstemcinin gerçek IP adresi
- İsteğin HTTP mi yoksa HTTPS mi olduğu
Bu başlıklar olmadan, arka uç uygulamaları yanlış istemci bilgilerini kaydedebilir.
Yapılandırmayı etkinleştirin
80 portunda çakışmaları önlemek için varsayılan Nginx sitesini devre dışı bırakın:
sudo rm /etc/nginx/sites-enabled/default
Siteyi etkinleştirmek için bir sembolik bağlantı oluşturun:
sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/
Yapılandırmayı sözdizimi hataları için test edin:
sudo nginx -t
Test başarılı olursa, Nginx'i yeniden yükleyin:
sudo systemctl reload nginx
Ters proxy'yi test edin
Sunucudan test edin:
curl http://example.com
Test etmek için bir tarayıcıda http://example.com adresini açın. Nginx'in varsayılan sayfası yerine arka uç uygulamanızdan bir yanıt almalısınız. Her şey doğru yapılandırılmışsa, arka uç uygulaması yüklenecektir.
İsteğin nasıl işlendiği
- İstemci, example.com adresine istek gönderir
- Nginx, isteği 80 portunda alır
- Nginx, isteği 127.0.0.1:3000 adresine iletir
- Arka uç, isteği işler
- Yanıt, Nginx üzerinden geri gider
- İstemci, yanıtı alır
Yaygın hatalar ve sorun giderme
Arka uç çalışmıyor
- Uygulamanın çalıştığından emin olun
- Doğru portu doğrulayın
ss -tuln | grep 3000
Yanlış proxy_pass adresi
- Her zaman
http://ekleyin - IP ve portun doğru olduğundan emin olun
Nginx'i yeniden yüklemeyi unutma
Her yapılandırma değişikliğinden sonra:
sudo systemctl reload nginx
Güvenlik duvarı erişimi engelliyor
80 portunun açık olduğundan emin olun:
sudo ufw allow 80
Opsiyonel iyileştirmeler
Ters proxy çalıştıktan sonra, şunları düşünün:
- Let's Encrypt ile HTTPS etkinleştirme
- Birden fazla arka uç uygulaması çalıştırma
- Erişim günlükleri ve hata günlükleri ekleme
- Yük dengeleme yapılandırma
- WebSocket bağlantılarını destekleme
HTTPS Yapılandırması
Üretim ortamlarında, her zaman HTTP yerine HTTPS kullanmalısınız. HTTPS, istemci ile sunucunuz arasındaki trafiği şifreler, şifreler, API anahtarları, çerezler ve diğer hassas verileri korur. Nginx, SSL/TLS sertifikaları kullanarak HTTPS'yi destekler. Bu bölümde şunları öğreneceksiniz:
- Certbot nedir
- Certbot nasıl kurulur
- Certbot'un Nginx yapılandırmasını otomatik olarak nasıl değiştirdiği
- Satın alınmış bir sertifika kullanarak Nginx'i manuel olarak nasıl yapılandıracağınız
Certbot nedir?
Certbot, Let's Encrypt'ten ücretsiz SSL/TLS sertifikaları otomatik olarak elde eden ve yükleyen bir araçtır. Şunları yapabilir:
- Ücretsiz bir sertifika talep etme
- Alan adı sahipliğini doğrulama
- Nginx'i otomatik olarak yapılandırma
- Otomatik sertifika yenileme ayarlama
Yeni başlayanlar ve çoğu üretim ortamı için, Certbot, HTTPS'yi etkinleştirmenin en kolay ve en güvenli yoludur.
Certbot'u yükleme
Paket listelerini güncelleyin:
sudo apt update
Certbot ve Nginx eklentisini yükleyin:
sudo apt install certbot python3-certbot-nginx
python3-certbot-nginx paketi, Certbot'un Nginx yapılandırmanızı otomatik olarak değiştirmesine olanak tanır.
Sertifika Alma ve Yükleme
Certbot'u çalıştırmadan önce, şunlardan emin olun:
- Alan adınızın sunucunuzun genel IP adresine yönlendirildiği
- Nginx'in çalıştığı
- Güvenlik duvarında 80 ve 443 portlarının açık olduğu
Çalıştırın:
sudo certbot --nginx
Certbot şunları yapacaktır:
- Hangi alan adını güvence altına almak istediğinizi sorar
- Alan adı sahipliğini doğrular
- Nginx yapılandırmanızı otomatik olarak günceller
- Nginx'i yeniden yükler
Certbot, Nginx yapılandırmanızı otomatik olarak değiştirir. Genellikle 443 (HTTPS) portu için yeni bir sunucu bloğu ekler, SSL sertifika yollarını ekler, bu seçeneği seçerseniz HTTP'den HTTPS'ye yönlendirme ekler ve önerilen SSL ayarlarını ekler.
Certbot tarafından eklenen örnek yapılandırma:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://127.0.0.1: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; } }
Certbot ayrıca HTTP bloğunu trafiği yönlendirmek için değiştirebilir:
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Certbot yapılandırma dosyalarını otomatik olarak düzenlediği için, şunları yapmanız önerilir:
- Yapılandırmanızın yedeklerini tutun
- Yapılan değişiklikleri anlayın
- Değişikliklerden sonra her zaman yapılandırmayı test edin
Yapılandırmayı test edin:
sudo nginx -t
Otomatik Sertifika Yenileme
Let's Encrypt sertifikaları 90 gün geçerlidir. Certbot, otomatik bir yenileme zamanlayıcısı kurar. Yenilemeyi test etmek için:
sudo certbot renew --dry-run
Doğru yapılandırılmışsa, yenileme kesinti olmadan otomatik olarak gerçekleşecektir.
Satın Alınmış SSL Sertifikası Kullanma
Bir sertifika otoritesinden (CA) bir SSL sertifikası satın alırsanız, Nginx'i manuel olarak yapılandırmanız gerekir. Satın aldıktan sonra genellikle şunları alırsınız:
- Bir sertifika dosyası (örneğin,
example.com.crt) - Bir özel anahtar (
example.com.key) - Bir CA demet dosyası (
ca_bundle.crt)
Güvenli bir dizin oluşturun:
sudo mkdir -p /etc/nginx/ssl
sudo chmod 700 /etc/nginx/ssl
Sertifika dosyalarınızı bu dizine kopyalayın.
Satın alınmış bir sertifika ile örnek HTTPS yapılandırması:
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1: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; } }
HTTP'den HTTPS'ye yönlendirme ekleyin:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }
Manuel yapılandırmadan sonra Nginx'i yeniden yükleyin:
sudo nginx -t
sudo systemctl reload nginx
Yeni başlayan sistem yöneticileri için, Certbot, kuruluşunuz ticari sertifikalar gerektirmedikçe şiddetle tavsiye edilir.
Özet
Bu eğitimde şunları öğrendiniz:
- Ters proxy nedir ve neden faydalıdır
- Nginx'in istekleri arka uç uygulamalarına nasıl ilettiği
- Ters proxy yapılandırmasının nasıl oluşturulup etkinleştirileceği
- Yaygın sorunların nasıl test edilip giderileceği
- HTTPS'nin nasıl yapılandırılacağı
Nginx ters proxy kullanımı, sistem yöneticileri için temel bir beceridir ve üretim ortamlarında yaygın olarak kullanılır.