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ı yerine 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.