Elbette, Nginx Reverse Proxy ve SSL yapılandırması üzerine uzman bir sistem yöneticisi perspektifinden teknik bir blog yazısı:
—
`
Nginx Reverse Proxy ve SSL ile Güvenli ve Verimli Uygulama Dağıtımı
`
`
Modern web mimarilerinde uygulamaları doğrudan internete açmak yerine bir reverse proxy arkasında çalıştırmak yaygın ve oldukça avantajlı bir pratiktir. Nginx, bu konuda hızlı, esnek ve güçlü bir çözümdür. Bu blog yazısında, Nginx’i bir reverse proxy olarak nasıl yapılandıracağımızı ve uygulamalarımıza SSL/TLS şifrelemesini nasıl ekleyeceğimizi adım adım ele alacağız. Reverse proxy kullanımı, yük dengeleme, güvenlik katmanı, önbellekleme ve SSL sonlandırma gibi birçok avantaj sunar.
`
`
Ön Gereksinimler
`
`
Başlamadan önce aşağıdaki maddelerin hazır olduğundan emin olun:
`
`
- `
- Nginx kurulu bir sunucu (Ubuntu için `sudo apt install nginx`, CentOS için `sudo yum install nginx`).
- Ters proxy yapacağınız uygulamanın/servisin bir IP adresi ve portu üzerinde çalışıyor olması (örneğin, `http://127.0.0.1:8080` veya `http://192.168.1.10:3000`).
- Yapılandırma yapacağınız bir alan adı (örneğin, `uygulama.alanadiniz.com`). Bu alan adının DNS kaydının (A/AAAA kaydı) Nginx sunucunuzun IP adresine işaret ettiğinden emin olun.
- SSL/TLS sertifikaları (Let’s Encrypt ile ücretsiz alabilir, özel bir CA’dan temin edebilir veya kendinden imzalı sertifikalar kullanabilirsiniz).
- Temel Linux komut satırı bilgisi.
`
`
`
`
`
`
`
`
`
`
`
`
`
Temel Nginx Reverse Proxy Yapılandırması (HTTP)
`
`
İlk olarak, uygulamamızı sadece HTTP üzerinden bir Nginx reverse proxy’nin arkasına alalım. Nginx yapılandırma dosyaları genellikle `/etc/nginx/sites-available/` dizininde bulunur. Yeni bir yapılandırma dosyası oluşturalım (örneğin, `sudo nano /etc/nginx/sites-available/uygulama.alanadiniz.com.conf`).
`
`
`
`server {`
` listen 80;`
` server_name uygulama.alanadiniz.com;`
` location / {`
` proxy_pass http://127.0.0.1:8080; # Uygulamanızın çalıştığı adres ve port`
` 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 X-Forwarded-Port $server_port;`
` }`
`}`
`
`
`
Bu yapılandırmayı etkinleştirmek için bir sembolik bağlantı oluşturmalı, Nginx yapılandırma sentaksını kontrol etmeli ve Nginx servisini yeniden başlatmalıyız:
`
`
`
`sudo ln -s /etc/nginx/sites-available/uygulama.alanadiniz.com.conf /etc/nginx/sites-enabled/`
`sudo nginx -t # Yapılandırma sentaksını kontrol et`
`sudo systemctl restart nginx`
`
`
`
Açıklamalar:
`
`
- `
- `**`listen 80;`**`: Nginx’in HTTP isteklerini 80 numaralı porttan dinlemesini sağlar.
- `**`server_name uygulama.alanadiniz.com;`**`: Bu yapılandırmanın hangi alan adına yanıt vereceğini belirtir. Birden fazla alan adı için boşluklarla ayırarak listeleyebilirsiniz.
- `**`location / { … }`**`: Tüm gelen isteklerin kök dizine yönlendirilmesini sağlar. Daha spesifik yollar için farklı `location` blokları tanımlayabilirsiniz (örneğin, `/api/` veya `/static/`).
- `**`proxy_pass http://127.0.0.1:8080;`**`: Gelen istekleri arkadaki (`upstream`) uygulamamıza yönlendirir. Kendi uygulamanızın IP adresini ve portunu buraya girin.
- `**`proxy_set_header …;`**`: Orijinal isteğe ait bilgileri (istemcinin IP’si, host bilgisi vb.) arka uca iletir. Bu başlıklar, uygulamanızın gerçek istemci IP’sini, hangi ana bilgisayar üzerinden erişildiğini ve orijinal protokolü (HTTP/HTTPS) görmesi için kritik öneme sahiptir.
`
`
`
`
`
`
`
`
`
`
`
`
`
SSL/TLS Ekleme (HTTPS)
`
`
Uygulamamızın güvenliğini artırmak ve modern web standartlarına uyum sağlamak için SSL/TLS şifrelemesini etkinleştirmeliyiz. Bu, verilerin istemci ile sunucu arasında şifreli bir şekilde iletilmesini sağlar. Let’s Encrypt ile ücretsiz sertifika alabilir (örneğin `certbot` aracı ile) veya kendi sertifikalarınızı kullanabilirsiniz.
`
`
Varsayalım ki sertifikalarınız `/etc/letsencrypt/live/uygulama.alanadiniz.com/fullchain.pem` (genel sertifika zinciri) ve `/etc/letsencrypt/live/uygulama.alanadiniz.com/privkey.pem` (özel anahtar) yollarında mevcut. Mevcut yapılandırma dosyamızı (örneğin, `/etc/nginx/sites-available/uygulama.alanadiniz.com.conf`) aşağıdaki gibi güncelleyelim:
`
`
`
`server {`
` listen 80;`
` server_name uygulama.alanadiniz.com;`
` return 301 https://$host$request_uri; # Tüm HTTP isteklerini HTTPS'e kalıcı olarak yönlendir`
`}`
`server {`
` listen 443 ssl http2; # 443 portunu SSL ve HTTP/2 desteğiyle dinle`
` server_name uygulama.alanadiniz.com;`
` ssl_certificate /etc/letsencrypt/live/uygulama.alanadiniz.com/fullchain.pem; # Genel sertifika zinciri`
` ssl_certificate_key /etc/letsencrypt/live/uygulama.alanadiniz.com/privkey.pem; # Özel anahtar`
` ssl_session_cache shared:SSL:10m;`
` ssl_session_timeout 10m;`
` ssl_protocols TLSv1.2 TLSv1.3; # Yalnızca güvenli TLS protokollerini kullan`
` ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; # Güvenli şifre paketleri`
` ssl_prefer_server_ciphers on;`
` # Opsiyonel: HSTS (HTTP Strict Transport Security) header'ı`
` add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;`
` add_header X-Content-Type-Options nosniff;`
` add_header X-XSS-Protection "1; mode=block";`
` add_header X-Frame-Options DENY;`
` location / {`
` proxy_pass http://127.0.0.1:8080; # Uygulamanızın çalıştığı adres ve port`
` 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 https; # Çok önemli: Arka uç uygulamanızın isteğin HTTPS olduğunu anlamasını sağlar`
` proxy_set_header X-Forwarded-Port 443;`
` }`
`}`
`
`
`
Yukarıdaki yapılandırmada yapılan önemli değişiklikler:
`
`
- `
- `**HTTP Yönlendirme:**` İlk `server` bloğu, 80 numaralı porttan gelen tüm HTTP isteklerini 301 (kalıcı) yönlendirmeyle HTTPS’e yönlendirir. Bu, kullanıcıların her zaman güvenli bağlantı üzerinden sitenize erişmesini sağlar.
- `**`listen 443 ssl http2;`**`: Nginx’in 443 portunu SSL desteğiyle dinlemesini ve modern HTTP/2 protokolünü kullanmasını sağlar. HTTP/2, performansı artırır.
- `**`ssl_certificate`**` ve `**`ssl_certificate_key`**`: Sertifika dosyalarınızın yollarını belirtirsiniz. Let’s Encrypt kullanıyorsanız, `fullchain.pem` ve `privkey.pem` dosyalarını kullanmalısınız.
- `**`ssl_protocols`**` ve `**`ssl_ciphers`**`: Yalnızca güçlü ve güvenli şifreleme protokollerini ve algoritmalarını kullanmak, güvenlik seviyenizi artırır ve eski, zayıf protokollerin kullanılmasını engeller.
- `**`add_header Strict-Transport-Security …;`**`: HSTS (HTTP Strict Transport Security), tarayıcıların belirli bir süre boyunca (burada 1 yıl) sitenize her zaman HTTPS üzerinden erişmesini zorunlu kılar ve MITM (Man-in-the-Middle) saldırılarını önlemeye yardımcı olur. `preload` direktifi, sitenizin Google’ın HSTS preload listesine eklenmesini sağlar.
- `**`X-Content-Type-Options`, `X-XSS-Protection`, `X-Frame-Options`**`: Bu güvenlik başlıkları, çeşitli web güvenlik açıklarına (MIME-sniffing, XSS, Clickjacking) karşı ek koruma sağlar.
- `**`proxy_set_header X-Forwarded-Proto https;`**`: Bu başlık, arka uç uygulamanıza isteğin orijinalde HTTPS olduğunu bildirir. Uygulamanızın bu bilgiyi alması (örneğin, bir oturum çerezini güvenli olarak ayarlamak veya yönlendirmeleri doğru yapmak için) kritik olabilir.
`
`
`
`
`
`
`
`
`
`
`
`
`
`
`
`
`
Yapılandırma dosyasını kaydettikten sonra tekrar Nginx’i kontrol edip yeniden başlatın:
`
`
`
`sudo nginx -t`
`sudo systemctl restart nginx`
`
`
`
Ek İpuçları ve En İyi Uygulamalar
`
`
- `
- `**`client_max_body_size`**`: Büyük dosya yüklemelerini desteklemek için `http` veya `server` bloğunda `client_max_body_size 100M;` gibi bir direktif ekleyebilirsiniz. Varsayılan değer genellikle 1M’dir.
- `**Önbellekleme (Caching):**` Nginx, statik dosyalar için güçlü önbellekleme yetenekleri sunar. Örneğin, görseller, CSS ve JavaScript dosyaları için tarayıcı önbelleklemesini artırabilirsiniz:
`` `location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {` ` expires 30d;` ` add_header Cache-Control "public, no-transform";` ` try_files $uri @fallback; # Eğer dosya yoksa arka uca yönlendir` `}` ``
- `**Logging:**` Erişi ve hata kayıtlarını düzenli olarak izleyerek olası sorunları hızlıca tespit edebilirsiniz. `access_log` ve `error_log` direktiflerini kullanın.
- `**Performans Ayarları:**` `worker_processes`, `worker_connections` gibi global ayarları `/etc/nginx/nginx.conf` dosyasında sunucunuzun CPU çekirdek sayısına ve belleğine göre optimize edin.
- `**Güvenlik Duvarı:**` Sunucunuzda sadece 80 (geçici) ve 443 (kalıcı) portlarının dışarıdan erişilebilir olduğundan emin olun. Diğer tüm portları kapatmak için UFW (Ubuntu) veya firewalld (CentOS) gibi bir güvenlik duvarı kullanın.
- `**Diffie-Hellman Parametreleri:**` Güvenliği artırmak için özel bir Diffie-Hellman parametre dosyası oluşturmak iyi bir uygulamadır:
`` `sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048` ``
Ardından, Nginx yapılandırmanıza `ssl_dhparam /etc/nginx/dhparam.pem;` satırını ekleyin.
`
`
`
`
`
`
`
`
`
`
`
`
`
`
`
Sonuç
`
`
Nginx’i bir reverse proxy ve SSL sonlandırma noktası olarak yapılandırmak, web uygulamalarınız için önemli güvenlik, performans ve yönetim avantajları sağlar. Bu kılavuz sayesinde, uygulamalarınızı güvenli ve verimli bir şekilde dağıtmak için temel adımları atmış oldunuz. Daha karmaşık senaryolar (yük dengeleme, mikroservisler için yönlendirme, WebSockets desteği vb.) için Nginx’in zengin dokümantasyonunu incelemeyi unutmayın.
`
`
Artık uygulamanıza `https://uygulama.alanadiniz.com` adresinden güvenle erişebilirsiniz! Herhangi bir sorunla karşılaşırsanız, Nginx’in hata günlüklerini (`/var/log/nginx/error.log`) kontrol etmekle başlayabilirsiniz.
`
