Nginx Reverse Proxy yapılandırması ve SSL

📅 26 Aralık 2025Emre Karabulut
⏱️ Yaklaşık 8 dakikalık okuma süresi

Merhaba Sistem Yöneticileri ve Geliştiriciler,

Günümüzün modern web uygulamaları için güvenli, yüksek performanslı ve ölçeklenebilir bir altyapı oluşturmak kritik öneme sahiptir. Bu bağağlamda Nginx, hem statik dosya sunumu hem de ters proxy (reverse proxy) ve yük dengeleme yetenekleriyle öne çıkan vazgeçilmez bir araçtır.

Bu blog yazısında, Nginx’i bir ters proxy olarak yapılandırmayı ve uygulamalarınız için uçtan uca güvenliği sağlamak amacıyla SSL/TLS şifrelemesini (Let’s Encrypt ile) nasıl entegre edeceğinizi adım adım inceleyeceğiz.

Nginx Ters Proxy Nedir ve Neden Kullanılır?

Bir Nginx ters proxy, istemciden gelen isteği doğrudan arka uç sunucuya (örneğin, Node.js, Python Flask, Java Spring uygulaması veya Apache/Tomcat gibi başka bir web sunucusu) yönlendirmek yerine, isteği kendi alır ve ardından bu isteği uygun arka uç sunucusuna iletir. Yanıtı arka uç sunucusundan alır ve istemciye geri gönderir.

Kullanım Nedenleri:

  • Güvenlik: Arka uç sunucularının doğrudan internete maruz kalmasını engelleyerek güvenlik katmanı ekler.
  • Yük Dengeleme (Load Balancing): Gelen istekleri birden fazla arka uç sunucusu arasında dağıtarak performansı artırır ve hizmet kesintilerini azaltır.
  • SSL/TLS Sonlandırma: SSL sertifikalarını Nginx üzerinde sonlandırarak arka uç sunucularının SSL yükünden kurtulmasını sağlar.
  • Önbellekleme (Caching): Statik veya sık erişilen dinamik içerikleri önbelleğe alarak yanıt sürelerini kısaltır.
  • URL Yönlendirme ve Yeniden Yazma: Karmaşık URL kurallarını yönetebilir.
  • Bakım Kolaylığı: Arka uç sunucularının IP adreslerini veya portlarını değiştirmek, istemcileri etkilemeden Nginx üzerinde yapılabilir.

Gereksinimler

  • Ubuntu/Debian tabanlı bir sunucu
  • Nginx kurulu olmalı
  • Bir alan adı (domain) ve DNS kayıtlarının sunucunuzun IP adresine yönlendirilmiş olması
  • Temel Linux komut satırı bilgisi

Temel Nginx Reverse Proxy Yapılandırması

Öncelikle, Nginx’in yapılandırma dizinine gidelim. Genellikle bu dizin `/etc/nginx/sites-available/` şeklindedir.


sudo nano /etc/nginx/sites-available/your_application

Aşağıdaki gibi basit bir yapılandırma ile başlayabiliriz. Bu örnekte, Nginx, `yourdomain.com` adresine gelen HTTP isteklerini `http://127.0.0.1:8000` adresinde çalışan bir arka uç uygulamasına yönlendirecektir.


server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    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;
    }
}

Açıklamalar:

  • listen 80;: Nginx’in 80 (HTTP) portunu dinlemesini sağlar.
  • server_name yourdomain.com www.yourdomain.com;: Bu Nginx yapılandırmasının hangi alan adları için geçerli olduğunu belirtir.
  • location / {}: Tüm gelen istekler için geçerli olan bloğu tanımlar.
  • proxy_pass http://127.0.0.1:8000;: İsteği yönlendireceğimiz arka uç uygulamasının adresi ve portu. Kendi uygulamanızın çalıştığı adres ve port ile değiştirin.
  • proxy_set_header ...;: Bu satırlar çok önemlidir. Orijinal istemci IP adresi, host bilgisi gibi detayları arka uç uygulamasına iletir. Aksi takdirde, arka uç uygulaması tüm istekleri Nginx’ten geliyormuş gibi algılar.

Yapılandırma dosyasını kaydettikten sonra, bunu `sites-enabled` dizinine bir sembolik bağ (symlink) oluşturarak etkinleştirmemiz gerekir:


sudo ln -s /etc/nginx/sites-available/your_application /etc/nginx/sites-enabled/

Nginx yapılandırmanızın sözdizimini kontrol edin ve ardından Nginx’i yeniden yükleyin:


sudo nginx -t
sudo systemctl reload nginx

Artık tarayıcınızdan `http://yourdomain.com` adresine gittiğinizde, Nginx isteği arka uç uygulamanıza yönlendirecektir.

SSL/TLS Ekleme (Let’s Encrypt ve Certbot ile)

Web sitenizin güvenliği ve kullanıcı güvenini sağlamak için SSL/TLS sertifikası kullanmak vazgeçilmezdir. Let’s Encrypt, ücretsiz, otomatik ve açık bir Sertifika Yetkilisi (CA) olarak bu süreci kolaylaştırır. Certbot aracı ile Nginx üzerinde SSL’i hızla yapılandırabiliriz.

Certbot Kurulumu

Ubuntu üzerinde Certbot’u Nginx eklentisi ile birlikte kurmak için aşağıdaki komutları kullanın:


sudo apt update
sudo apt install certbot python3-certbot-nginx

SSL Sertifikası Oluşturma ve Yapılandırma

Certbot’u Nginx ile birlikte çalıştırmak en kolay yöntemdir. Certbot, Nginx yapılandırmanızı otomatik olarak algılar ve günceller:


sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Bu komut çalıştırıldıktan sonra, Certbot sizden bazı bilgiler isteyecek (e-posta adresi, hizmet şartlarını kabul etme vb.). Başarılı bir şekilde tamamlandığında, Certbot Nginx yapılandırmanızı otomatik olarak güncelleyecek, HTTP isteklerini HTTPS’ye yönlendirecek ve sertifika dosyalarını doğru yerlere yerleştirecektir.

Certbot’un Otomatik Yapılandırmasından Sonra `your_application` Dosyanızın Görünümü (Örnek)

Certbot başarılı olursa, `/etc/nginx/sites-available/your_application` dosyanız aşağıdaki gibi güncellenmiş olacaktır:


server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.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;
    }
}

Açıklamalar:

  • Birinci server bloğu (port 80): Gelen tüm HTTP isteklerini 301 kalıcı yönlendirme ile HTTPS’ye yönlendirir.
  • İkinci server bloğu (port 443): HTTPS isteklerini dinler.
  • ssl_certificate ve ssl_certificate_key: Let’s Encrypt tarafından oluşturulan sertifika ve özel anahtar dosyalarının yollarını gösterir.
  • include /etc/letsencrypt/options-ssl-nginx.conf; ve ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;: Certbot’un otomatik olarak eklediği, güvenlik için önerilen SSL ayarlarını ve DH parametrelerini içerir.

Certbot aynı zamanda sertifikalarınızın süresi dolmadan önce otomatik olarak yenilenmesini de ayarlayacaktır. Bunu kontrol etmek için:


sudo systemctl status certbot.timer

Bu komut, Certbot’un periyodik olarak sertifika yenileme görevini çalıştıran zamanlayıcısının durumunu gösterir.

Gelişmiş Nginx Reverse Proxy Kullanım Durumları

Yük Dengeleme (Load Balancing)

Birden fazla arka uç sunucunuz varsa, Nginx’i bir yük dengeleyici olarak kullanabilirsiniz. Bu, trafiği sunucular arasında dağıtarak performansı ve dayanıklılığı artırır.


upstream backend_servers {
    server 192.168.1.100:8000 weight=5;
    server 192.168.1.101:8000;
    server 192.168.1.102:8001 backup; # Yedek sunucu
    # Diğer stratejiler: least_conn, ip_hash
}

server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;
    # ... (SSL ayarları) ...

    location / {
        proxy_pass http://backend_servers;
        # ... (proxy_set_header ayarları) ...
    }
}

Websocket Desteği

Eğer uygulamanız Websocket kullanıyorsa (gerçek zamanlı uygulamalar, sohbet vb.), Nginx’in bu bağlantıları doğru şekilde proxy’lemesini sağlamalısınız:


location /ws/ {
    proxy_pass http://127.0.0.1:8001; # Websocket arka ucu
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

Yola Göre Yönlendirme

Farklı URL yollarını farklı arka uç uygulamalarına yönlendirebilirsiniz:


server {
    listen 443 ssl;
    server_name yourdomain.com;
    # ... (SSL ayarları) ...

    location /api/ {
        proxy_pass http://127.0.0.1:3000; # API uygulamasına yönlendir
        proxy_set_header Host $host;
    }

    location /blog/ {
        proxy_pass http://127.0.0.1:4000; # Blog uygulamasına yönlendir
        proxy_set_header Host $host;
    }

    location / {
        proxy_pass http://127.0.0.1:5000; # Ana uygulamaya yönlendir
        proxy_set_header Host $host;
    }
}

Yapılandırmayı Test Etme ve Yeniden Yükleme

Herhangi bir Nginx yapılandırma değişikliğinden sonra daima sözdizimini kontrol edin:


sudo nginx -t

Eğer "test is successful" mesajını görürseniz, değişiklikleri uygulamak için Nginx'i yeniden yükleyebilirsiniz:


sudo systemctl reload nginx

Herhangi bir hata durumunda, Nginx hata günlüklerini (`/var/log/nginx/error.log`) kontrol etmek, sorunun kaynağını anlamanıza yardımcı olacaktır.

Sonuç

Nginx'i bir ters proxy olarak yapılandırmak, web uygulamalarınızın performansını, güvenliğini ve esnekliğini önemli ölçüde artırır. Let's Encrypt ve Certbot ile SSL/TLS şifrelemesini entegre etmek ise bu yapıyı tamamlayarak modern web standartlarına uygun bir çözüm sunar.

Bu yapılandırma, daha karmaşık mimarilere geçiş için sağlam bir temel oluşturur. İster küçük bir proje ister büyük ölçekli bir uygulama yönetiyor olun, Nginx'in gücünden faydalanmak, dağıtım sürecinizi çok daha verimli hale getirecektir.

Umarım bu blog yazısı Nginx ters proxy ve SSL yapılandırması hakkında kapsamlı bir rehber olmuştur. Sorularınız veya eklemek istedikleriniz olursa çekinmeyin!

Emre Karabulut
📊 Bu yazı 2 kez okundu.