Takip et

Nginx’i Web Sunucusu ve Apache için Ters Proxy Olarak Yapılandırma: Tek Bir Ubuntu 20.04 Sunucusunda Kapsamlı Rehber

Nginx’i Web Sunucusu ve Apache için Ters Proxy Olarak Yapılandırma: Tek Bir Ubuntu 20.04 Sunucusunda Kapsamlı Rehber Giriş Günümüzün web uyg

Nginx’i Web Sunucusu ve Apache için Ters Proxy Olarak Yapılandırma: Tek Bir Ubuntu 20.04 Sunucusunda Kapsamlı Rehber

Giriş

Günümüzün web uygulamaları, yüksek performans, güvenlik ve ölçeklenebilirlik gereksinimlerini karşılamak zorundadır. Bu gereksinimleri karşılamak için genellikle birden fazla web sunucusu teknolojisi bir arada kullanılır. Özellikle Nginx ve Apache, web dünyasında en popüler iki sunucu çözümüdür. Apache, modül zenginliği ve dinamik içerik işleme yetenekleriyle öne çıkarken, Nginx yüksek performanslı statik içerik sunumu, düşük kaynak tüketimi ve ters proxy (reverse proxy) yetenekleriyle bilinir.

Bu makalede, tek bir Ubuntu 20.04 sunucusu üzerinde Nginx’i hem ana web sunucusu hem de Apache için bir ters proxy olarak nasıl yapılandıracağımızı adım adım inceleyeceğiz. Bu kurulumda Nginx, gelen tüm istekleri karşılayacak, statik dosyaları doğrudan sunacak ve dinamik içerik isteklerini arka plandaki Apache sunucusuna iletecektir. Bu mimari, her iki sunucunun da güçlü yönlerinden faydalanarak daha verimli ve sağlam bir web ortamı oluşturmamızı sağlar.

Neden Nginx ve Apache Birlikte Kullanılmalı?

Nginx ve Apache’nin birlikte kullanılması, modern web mimarilerinde yaygın bir uygulamadır. Bu entegrasyonun ardında yatan temel nedenler, her iki sunucunun da farklı güçlü yönlere sahip olması ve bu güçlerin birleştirildiğinde sinerjik bir etki yaratmasıdır.

Nginx’in Avantajları

Nginx, özellikle aşağıdaki konularda üstün performans sergiler:
* Yüksek Performanslı Statik İçerik Sunumu: Nginx, statik HTML, CSS, JavaScript dosyaları ve resimler gibi içerikleri son derece hızlı ve düşük kaynak tüketimiyle sunar. Büyük ölçekli sitelerde bu özellik kritik öneme sahiptir.
* Düşük Kaynak Tüketimi: Özellikle eşzamanlı bağlantılar (concurrent connections) arttığında Nginx’in bellek ve CPU kullanımı Apache’ye göre genellikle daha düşüktür. Bu, daha fazla isteği daha az kaynakla işleyebilmesi anlamına gelir.
* Ters Proxy ve Yük Dengeleme: Nginx, bir ters proxy olarak mükemmel bir şekilde çalışır. Gelen istekleri birden fazla arka uç sunucusuna (örneğin, Apache veya uygulama sunucuları) yönlendirebilir ve yük dengeleme (load balancing) yapabilir. Bu, ölçeklenebilirlik ve yüksek erişilebilirlik için temel bir özelliktir.
* Hızlı Bağlantı İşleme: Nginx’in olay tabanlı (event-driven) mimarisi, çok sayıda eşzamanlı bağlantıyı verimli bir şekilde yönetmesini sağlar.

Apache’nin Avantajları

Apache, yıllardır web sunucusu pazarının liderlerinden biri olmuştur ve aşağıdaki özellikleriyle öne çıkar:
* Dinamik İçerik İşleme: PHP, Python, Ruby gibi dillerde yazılmış dinamik web uygulamalarını çalıştırmak için güçlü bir platform sunar. mod_php, mod_python gibi modüller sayesinde uygulama sunucularıyla doğrudan entegre olabilir.
* Geniş Modül Desteği: Apache, çok sayıda modüle (örn. mod_rewrite için URL yeniden yazma, mod_ssl için SSL/TLS, mod_authz için yetkilendirme) sahiptir ve bu modüller sayesinde son derece esnek ve özelleştirilebilir bir yapı sunar.
* .htaccess Desteği: Dizine özel yapılandırma dosyaları olan .htaccess aracılığıyla, sunucu genelinde değişiklik yapmadan dizin bazında erişim kontrolleri, URL yeniden yazmaları ve diğer ayarları kolayca yapmaya olanak tanır. Bu, özellikle paylaşımlı barındırma ortamları veya geliştiricilerin sunucu yapılandırmasına tam erişimi olmayan durumlar için kullanışlıdır.
* Olgunluk ve Topluluk Desteği: Uzun yıllardır var olması nedeniyle geniş bir topluluğa, kapsamlı belgelere ve sorun giderme kaynaklarına sahiptir.

Birlikte Kullanımın Faydaları

Nginx’i Apache’nin önünde bir ters proxy olarak kullanmak, her iki sunucunun da en iyi özelliklerini bir araya getirir:
* Performans Artışı: Nginx, statik içerikleri doğrudan sunarak Apache’nin üzerindeki yükü azaltır. Apache yalnızca dinamik içerik istekleriyle ilgilenir, bu da genel performansı artırır.
* Güvenlik: Nginx, bir ön uç (frontend) olarak hareket ederek Apache’yi doğrudan internete maruz kalmaktan korur. Bu, potansiyel güvenlik açıklarını azaltabilir ve ek bir güvenlik katmanı sağlar.
* Esneklik: Nginx, gelen istekleri çeşitli arka uç sunucularına (sadece Apache değil, farklı uygulama sunucuları da olabilir) yönlendirme esnekliği sunar.
* Ölçeklenebilirlik: Yük dengeleme yetenekleri sayesinde, gelecekte Apache sunucularını veya diğer uygulama sunucularını kolayca ekleyerek sistemin ölçeklenmesini sağlayabiliriz.
* SSL/TLS Yönetimi: Nginx, SSL/TLS sonlandırmasını yaparak Apache’nin bu yükten kurtulmasını sağlayabilir. Bu, Apache’nin daha verimli çalışmasına olanak tanır.

Bu avantajlar göz önüne alındığında, Nginx ve Apache’nin birlikte kullanılması, yüksek performanslı ve güvenli bir web altyapısı kurmak için mantıklı bir seçimdir.

Ön Gereksinimler

Bu rehbere başlamadan önce aşağıdaki ön gereksinimlerin karşılandığından emin olun:
* Ubuntu 20.04 Sunucusu: Temiz bir Ubuntu 20.04 (Focal Fossa) sunucusu.
* Sudo Yetkilerine Sahip Kullanıcı: sudo komutunu kullanabilen, root olmayan bir kullanıcı hesabı.
* İnternet Bağlantısı: Sunucuya paketleri indirmek için aktif bir internet bağlantısı.
* Alan Adı (Domain Name): Test için example.com gibi bir alan adına sahip olmanız ve DNS kayıtlarının sunucunuzun IP adresini işaret ettiğinden emin olmanız önerilir. Bu rehberde example.com kullanılacaktır.

Apache Kurulumu ve Yapılandırması

İlk olarak, arka uç sunucusu olarak görev yapacak Apache’yi kurup yapılandıracağız. Nginx’in ters proxy’si üzerinden erişileceği için Apache’nin varsayılan 80 portu yerine farklı bir portta çalışmasını sağlayacağız.

Apache Kurulumu

Sistem paket listesini güncelleyip Apache’yi kuralım:

sudo apt update
sudo apt install apache2 -y

Kurulum tamamlandıktan sonra Apache’nin çalıştığından emin olun:

sudo systemctl status apache2

Çıktıda “active (running)” ifadesini görmelisiniz.

Apache Portunu Değiştirme

Nginx, 80 ve 443 numaralı portları dinleyeceği için Apache’nin başka bir portu dinlemesi gerekir. Bu rehberde Apache’nin 8080 portunu dinlemesini sağlayacağız.

Apache’nin dinlediği portları tanımlayan ports.conf dosyasını düzenleyin:

sudo nano /etc/apache2/ports.conf

Dosya içeriğini aşağıdaki gibi değiştirin (varsayılan 80 ve 443 portlarını kaldırıp 8080 ve 4433 ekleyin):

# If you just change the port that Apache listens on here, you will also

have to change the VirtualHost statement in /etc/apache2/sites-enabled/000-default.conf

Listen 8080 Listen 4433 Listen 4433

Şimdi, Apache’nin varsayılan sanal host yapılandırmasını 8080 portunu dinleyecek şekilde güncelleyelim.

sudo nano /etc/apache2/sites-available/000-default.conf

VirtualHost satırını :80> yerine :8080> olarak değiştirin:


    # ... diğer yapılandırmalar ...

Apache’nin SSL sanal host yapılandırmasını da 4433 portunu dinleyecek şekilde güncelleyelim (isteğe bağlı, Nginx SSL’i yönetecekse bu adım zorunlu değildir ancak Apache’nin kendi başına SSL yapmasını isterseniz gereklidir):

sudo nano /etc/apache2/sites-available/default-ssl.conf

VirtualHost satırını yerine olarak değiştirin:


    # ... diğer yapılandırmalar ...

Apache Sanal Host Yapılandırması

example.com alan adınız için özel bir sanal host oluşturalım. Bu, Apache’nin belirli bir alan adına gelen istekleri nasıl işleyeceğini tanımlar.

Yeni bir yapılandırma dosyası oluşturun:

sudo nano /etc/apache2/sites-available/example.com.conf

Aşağıdaki içeriği dosyaya ekleyin. DocumentRoot dizinini ve ServerName alan adını kendi projenize göre ayarlayın.


    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    

DocumentRoot için bir dizin oluşturalım ve örnek bir HTML dosyası ekleyelim:

sudo mkdir -p /var/www/html/example.com
sudo echo "" | sudo tee /var/www/html/example.com/index.html
sudo chown -R www-data:www-data /var/www/html/example.com
sudo chmod -R 755 /var/www/html/example.com

Yeni sanal host’u etkinleştirin ve varsayılan sanal host’u devre dışı bırakın:

sudo a2ensite example.com.conf
sudo a2dissite 000-default.conf

Yapılandırma değişikliklerini uygulamak için Apache’yi yeniden başlatın:

sudo systemctl restart apache2

Apache’yi Test Etme

Apache’nin yeni portta düzgün çalıştığını doğrulamak için sunucu içinden curl komutunu kullanın:

curl http://localhost:8080

Çıktıda “” mesajını görmelisiniz. Bu, Apache’nin başarıyla yapılandırıldığını ve 8080 portunu dinlediğini gösterir.

Nginx Kurulumu

Apache arka planda hazır olduğuna göre, Nginx’i ön uç sunucusu ve ters proxy olarak kurabiliriz.

Nginx’i yükleyin:

sudo apt update
sudo apt install nginx -y

Nginx’in çalıştığından emin olun:

sudo systemctl status nginx

Çıktıda “active (running)” ifadesini görmelisiniz.

Nginx’i Ters Proxy Olarak Yapılandırma

Şimdi Nginx’i gelen istekleri karşılayacak ve dinamik istekleri Apache’ye yönlendirecek şekilde yapılandıracağız.

Nginx Sanal Host Yapılandırması

example.com alan adınız için yeni bir Nginx sunucu bloğu (server block) oluşturalım:

sudo nano /etc/nginx/sites-available/example.com

Aşağıdaki içeriği dosyaya ekleyin. Bu yapılandırma, Nginx’in 80 portunu dinlemesini, gelen istekleri example.com ve www.example.com için işlemesini ve tüm istekleri http://localhost:8080 adresindeki Apache sunucusuna yönlendirmesini sağlar.

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

    location / {
        proxy_pass http://localhost:8080;
        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;
    }

    # Statik dosyaları doğrudan Nginx üzerinden sunmak için örnek bir yapılandırma
    # Bu kısım, Nginx'in performans avantajını kullanmak için önemlidir.
    # Örneğin, /static/ veya /uploads/ gibi yollardaki dosyaları Nginx kendisi sunabilir.
    # location ~* \.(jpg|jpeg|gif|png|css|js|ico|pdf|html)$ {
    #     root /var/www/html/example.com; # Apache'nin DocumentRoot'u ile aynı veya farklı olabilir
    #     expires 30d;
    #     log_not_found off;
    # }

    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log;
}

proxy_set_header Açıklamaları:
* proxy_set_header Host $host;: Orijinal Host başlığını Apache’ye iletir. Bu, Apache’nin hangi alan adına gelen isteği işleyeceğini bilmesi için önemlidir.
* proxy_set_header X-Real-IP $remote_addr;: İsteği yapan istemcinin gerçek IP adresini Apache’ye iletir. Aksi takdirde Apache, Nginx’in IP adresini görecektir.
* proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: İstemcinin ve tüm proxy’lerin IP adreslerini içeren bir liste iletir. Bu, isteğin geçtiği yolları izlemek için kullanışlıdır.
* proxy_set_header X-Forwarded-Proto $scheme;: İstemcinin Nginx’e bağlanmak için kullandığı protokolü (HTTP veya HTTPS) Apache’ye iletir. Bu, özellikle SSL sonlandırmasını Nginx yaptığında önemlidir.

Yeni Nginx sunucu bloğunu etkinleştirin ve varsayılan Nginx yapılandırmasını devre dışı bırakın:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default

Nginx yapılandırmasında herhangi bir sözdizimi hatası olup olmadığını kontrol edin:

sudo nginx -t

Eğer çıktı syntax is ok ve test is successful içeriyorsa, Nginx’i yeniden başlatın:

sudo systemctl restart nginx

Nginx’i Test Etme

Şimdi tarayıcınızdan http://example.com (veya sunucunuzun IP adresi) adresine gidin. Nginx’in 80 portundan isteği alıp Apache’ye yönlendirmesi ve Apache’nin index.html dosyasını sunması sonucunda “” mesajını görmelisiniz. Bu, Nginx’in başarıyla bir ters proxy olarak yapılandırıldığını gösterir.

SSL/TLS Yapılandırması (Opsiyonel ama Önemli)

Web sitelerinin güvenliği için SSL/TLS sertifikası kullanmak günümüzde standart bir uygulamadır. Let’s Encrypt ile ücretsiz bir SSL sertifikası alabilir ve Nginx üzerinde yapılandırabiliriz.

Certbot ile SSL Sertifikası Alma

Certbot, Let’s Encrypt sertifikalarını otomatik olarak almayı ve yapılandırmayı kolaylaştıran bir araçtır.

Certbot ve Nginx eklentisini yükleyin:

sudo apt install certbot python3-certbot-nginx -y

Sertifikayı almak ve Nginx yapılandırmasını otomatik olarak güncellemek için Certbot’u çalıştırın:

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

Certbot, e-posta adresinizi isteyecek, hizmet koşullarını kabul etmenizi isteyecek ve sertifikayı otomatik olarak yapılandıracaktır. Ayrıca HTTP isteklerini HTTPS’ye yönlendirip yönlendirmeyeceğinizi soracaktır. Genellikle “2: Redirect” seçeneğini seçmek en iyisidir.

Certbot’un otomatik olarak yenileme zamanlayıcısı (cron job veya systemd timer) kurduğunu doğrulayabilirsiniz:

sudo systemctl status certbot.timer

Sertifikaların otomatik olarak yenilenip yenilenmeyeceğini test etmek için:

sudo certbot renew --dry-run

Nginx SSL Yapılandırması

Certbot, Nginx yapılandırma dosyanızı otomatik olarak güncelleyecektir. example.com dosyasını kontrol ettiğinizde, 443 portunu dinleyen yeni bir server bloğu ve HTTP’den HTTPS’ye yönlendirme ayarlarını görmelisiniz.

Örnek olarak, Certbot’un eklediği yapılandırma aşağıdaki gibi görünecektir (detaylar farklılık gösterebilir):

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

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

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }

    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log;
}

Bu yapılandırma ile Nginx, tüm HTTP isteklerini HTTPS’ye yönlendirecek ve HTTPS isteklerini alıp SSL’i sonlandıracak, ardından Apache’ye HTTP üzerinden (8080 portunda) iletecektir. Bu, Apache’nin SSL yükünden kurtulmasını ve daha verimli çalışmasını sağlar.

Şimdi tarayıcınızdan https://example.com adresine gidin. Sayfa güvenli bir bağlantı üzerinden yüklenmeli ve Apache’den gelen içeriği göstermelidir.

Firewall Yapılandırması

Güvenlik için UFW (Uncomplicated Firewall) kullanmak önemlidir. Yalnızca gerekli portlara erişime izin vererek sunucunuzu koruyun.

UFW’yi etkinleştirin:

sudo ufw enable

SSH bağlantısına izin verin (bağlantınızın kesilmemesi için bu ilk adım olmalıdır):

sudo ufw allow OpenSSH

Nginx’in HTTP ve HTTPS trafiğine izin verin:

sudo ufw allow 'Nginx Full'

UFW durumunu kontrol edin:

sudo ufw status

Çıktıda 22 (SSH), 80 (HTTP) ve 443 (HTTPS) portlarının izinli olduğunu görmelisiniz.

Sonuç

Bu kapsamlı rehberde, tek bir Ubuntu 20.04 sunucusu üzerinde Nginx’i hem ana web sunucusu hem de Apache için bir ters proxy olarak nasıl yapılandıracağımızı adım adım öğrendik. Nginx’in statik içerik sunumu ve ters proxy yeteneklerini Apache’nin güçlü dinamik içerik işleme yetenekleriyle birleştirerek, performans, güvenlik ve ölçeklenebilirlik açısından optimize edilmiş bir web altyapısı kurduk.

Bu kurulum sayesinde, Nginx gelen tüm istekleri karşılayarak statik dosyaları doğrudan sunar ve dinamik istekleri Apache’ye yönlendirir. Ayrıca, Certbot ile ücretsiz SSL/TLS sertifikası alarak web sitenizin güvenliğini sağladık ve UFW ile temel güvenlik duvarı kurallarını uyguladık.

Bu mimari, küçük kişisel bloglardan büyük kurumsal uygulamalara kadar çeşitli projeler için güçlü ve esnek bir temel sunar. İhtiyaçlarınıza göre Nginx ve Apache yapılandırmalarını daha da özelleştirebilir, ek modüller veya yük dengeleme kuralları ekleyerek sisteminizi geliştirebilirsiniz. Unutmayın, herhangi bir üretim ortamında bu tür yapılandırmaları yapmadan önce kapsamlı testler yapmak ve yedeklemeler almak her zaman önemlidir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version