Merhaba arkadaşlar, bugün sizlere özellikle yüksek trafikli sunucularda performans ve kaynak kullanımını optimize etmek için kullanabileceğiniz çok güzel bir yöntemden bahsedeceğim. Nginx'i ön uç (reverse proxy) ve statik dosya sunucusu, Apache'yi ise arka uç (backend) uygulama sunucusu olarak nasıl birlikte çalıştırabileceğimizi adım adım anlatacağım.
Bu yöntemle, Nginx'in statik dosya (resim, css, js) sunmadaki yüksek hızından ve düşük kaynak tüketiminden faydalanırken, Apache'nin .htaccess gibi özelliklerle güçlü dinamik içerik işleme yeteneğini de kaybetmemiş oluyoruz. Benim sunucu parkurumda özellikle WordPress veya benzeri PHP tabanlı uygulamalar için sıklıkla kullandığım bir mimari bu.
Gereksinimler ve Temel Mantık
Öncelikle sisteminizde hem Nginx hem de Apache'nin kurulu olması gerekiyor. Apache'nin, varsayılan olarak dinlediği 80 portunu bırakıp, farklı bir porttan (örneğin 8080) dinlemesini sağlayacağız. Nginx ise 80 ve 443 portlarını dinleyerek gelen tüm istekleri karşılayacak. Statik dosya isteklerini kendisi hızlıca sunacak, dinamik istekleri (PHP vs.) ise arka plandaki Apache'ye yönlendirecek (proxy edecek).
1. Adım: Apache'yi Yapılandırma (Port Değişikliği)
İlk iş olarak Apache'nin artık 80 portunda değil, 8080 portunda dinlemesini sağlayalım. Bu ayar dağıtımınıza göre değişiklik gösterebilir, ben Debian/Ubuntu için anlatıyorum.
Apache'nin ports konfigürasyon dosyasını açıyoruz:
İçerisinde `Listen 80` satırını bulup, aşağıdaki gibi 8080 olarak değiştiriyoruz. SSL için de 443 yerine 8443 kullanabilirsiniz, ancak SSL terminasyonunu genelde Nginx'e bırakmak daha mantıklı.
Şimdi de sanal host (virtual host) dosyalarımızı güncelleyelim. /etc/apache2/sites-available/ dizini altındaki konfigürasyon dosyanızı (örn: 000-default.conf) açın ve `<VirtualHost>` etiketinin başladığı satırı değiştirin:
Değişiklikleri kaydedip Apache'yi yeniden başlatalım:
Apache'nin 8080 portunda çalıştığını kontrol edelim:
2. Adım: Nginx'i Yapılandırma (Reverse Proxy)
Şimdi sıra Nginx'te. /etc/nginx/sites-available/ dizininde siteniz için bir konfigürasyon dosyası oluşturun (örn: sitem.conf). Aşağıdaki gibi temel bir yapı kurabilirsiniz.
Bu konfigürasyonda dikkat etmeniz gereken en önemli nokta, statik dosya uzantılarını Nginx'in doğrudan sunması, diğer tüm isteklerin ise `proxy_pass` direktifi ile Apache'ye (
) gönderilmesi.
Konfigürasyonunuzu kontrol edip, aktif hale getirelim:
Test ve Sorun Giderme
Her şeyin yolunda gittiğini test etmek için:
1. Tarayıcınızdan sitenizi açın, her şey normal çalışıyor olmalı.
2. Bir resim dosyasının URL'sini açın ve başlıkları (headers) inceleyin. Sunucu (server) başlığının nginx olduğunu görmelisiniz.
3. Apache erişim loglarını kontrol edin (/var/log/apache2/access.log). Artık istemci IP adreslerinin doğru şekilde (Nginx'in ilettiği `X-Forwarded-For` başlığı sayesinde) loglandığını göreceksiniz.
Ek Optimizasyon Önerileri
Önbellek (Cache): Nginx'e dinamik içeriği de belirli sürelerle önbelleklemesi için `proxy_cache` direktiflerini ekleyebilirsiniz. Bu, Apache yükünü inanılmaz derecede azaltır.
Gzip Sıkıştırma: Sıkıştırmayı Nginx seviyesinde yapın, Apache'nin işini daha da hafifletin.
SSL/TLS: Tüm SSL sertifika işlemlerini ve şifreleme yükünü Nginx'e bırakın. Apache'ye giden bağlantı düz HTTP (8080 portunda) kalabilir. Bu, güvenlik ve performans açısından çok daha iyidir.
Sonuç olarak, bu kurulumla hem statik içeriğiniz yıldırım hızında sunulur, hem de Apache'niz sadece PHP veya diğer backend script'lerini çalıştırmak için kullanıldığından çok daha az kaynak tüketir ve daha fazla eş zamanlı kullanıcıya hizmet verebilir.
Umarım faydalı bir rehber olmuştur. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Eklemek istediğiniz püf noktalar veya takıldığınız bir yer varsa aşağıya yazmaktan çekinmeyin. Herkese sorunsuz sunucular!
Bu yöntemle, Nginx'in statik dosya (resim, css, js) sunmadaki yüksek hızından ve düşük kaynak tüketiminden faydalanırken, Apache'nin .htaccess gibi özelliklerle güçlü dinamik içerik işleme yeteneğini de kaybetmemiş oluyoruz. Benim sunucu parkurumda özellikle WordPress veya benzeri PHP tabanlı uygulamalar için sıklıkla kullandığım bir mimari bu.
Öncelikle sisteminizde hem Nginx hem de Apache'nin kurulu olması gerekiyor. Apache'nin, varsayılan olarak dinlediği 80 portunu bırakıp, farklı bir porttan (örneğin 8080) dinlemesini sağlayacağız. Nginx ise 80 ve 443 portlarını dinleyerek gelen tüm istekleri karşılayacak. Statik dosya isteklerini kendisi hızlıca sunacak, dinamik istekleri (PHP vs.) ise arka plandaki Apache'ye yönlendirecek (proxy edecek).
İlk iş olarak Apache'nin artık 80 portunda değil, 8080 portunda dinlemesini sağlayalım. Bu ayar dağıtımınıza göre değişiklik gösterebilir, ben Debian/Ubuntu için anlatıyorum.
Apache'nin ports konfigürasyon dosyasını açıyoruz:
Bash:
sudo nano /etc/apache2/ports.conf
İçerisinde `Listen 80` satırını bulup, aşağıdaki gibi 8080 olarak değiştiriyoruz. SSL için de 443 yerine 8443 kullanabilirsiniz, ancak SSL terminasyonunu genelde Nginx'e bırakmak daha mantıklı.
Kod:
Listen 8080
<IfModule ssl_module>
Listen 8443
</IfModule>
<IfModule mod_gnutls.c>
Listen 8443
</IfModule>
Şimdi de sanal host (virtual host) dosyalarımızı güncelleyelim. /etc/apache2/sites-available/ dizini altındaki konfigürasyon dosyanızı (örn: 000-default.conf) açın ve `<VirtualHost>` etiketinin başladığı satırı değiştirin:
Kod:
<VirtualHost :8080>
... # Site ayarlarınız burada kalacak
</VirtualHost>
Değişiklikleri kaydedip Apache'yi yeniden başlatalım:
Bash:
sudo systemctl restart apache2
Apache'nin 8080 portunda çalıştığını kontrol edelim:
Bash:
sudo netstat -tulpn | grep :8080
Şimdi sıra Nginx'te. /etc/nginx/sites-available/ dizininde siteniz için bir konfigürasyon dosyası oluşturun (örn: sitem.conf). Aşağıdaki gibi temel bir yapı kurabilirsiniz.
Bu konfigürasyonda dikkat etmeniz gereken en önemli nokta, statik dosya uzantılarını Nginx'in doğrudan sunması, diğer tüm isteklerin ise `proxy_pass` direktifi ile Apache'ye (
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
NGINX:
server {
listen 80;
listen [::]:80;
server_name sitem.com www.sitem.com; # Kendi domaininizi yazın
root /var/www/html; # Statik dosyalarınızın ve sitenizin ana dizini
index index.php index.html index.htm;
# STATİK DOSYALAR - Nginx direkt sunsun
location ~ \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|pdf|mp4|webm)$ {
expires 30d; # Tarayıcı önbellekleme süresi
add_header Cache-Control "public, immutable";
try_files $uri =404; # Dosya varsa sun, yoksa 404 hatası
}
# DİNAMİK İSTEKLER - Apache'ye yönlendir
location / {
proxy_pass http://127.0.0.1:8080; # Apache'nin dinlediği 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;
}
# PHP dosyalarını da Apache'ye yönlendiriyoruz
location ~ \.php$ {
proxy_pass http://127.0.0.1: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;
}
}
Konfigürasyonunuzu kontrol edip, aktif hale getirelim:
Bash:
sudo nginx -t
sudo ln -s /etc/nginx/sites-available/sitem.conf /etc/nginx/sites-enabled/
sudo systemctl reload nginx
Her şeyin yolunda gittiğini test etmek için:
1. Tarayıcınızdan sitenizi açın, her şey normal çalışıyor olmalı.
2. Bir resim dosyasının URL'sini açın ve başlıkları (headers) inceleyin. Sunucu (server) başlığının nginx olduğunu görmelisiniz.
3. Apache erişim loglarını kontrol edin (/var/log/apache2/access.log). Artık istemci IP adreslerinin doğru şekilde (Nginx'in ilettiği `X-Forwarded-For` başlığı sayesinde) loglandığını göreceksiniz.
Önbellek (Cache): Nginx'e dinamik içeriği de belirli sürelerle önbelleklemesi için `proxy_cache` direktiflerini ekleyebilirsiniz. Bu, Apache yükünü inanılmaz derecede azaltır.
Gzip Sıkıştırma: Sıkıştırmayı Nginx seviyesinde yapın, Apache'nin işini daha da hafifletin.
SSL/TLS: Tüm SSL sertifika işlemlerini ve şifreleme yükünü Nginx'e bırakın. Apache'ye giden bağlantı düz HTTP (8080 portunda) kalabilir. Bu, güvenlik ve performans açısından çok daha iyidir.
Sonuç olarak, bu kurulumla hem statik içeriğiniz yıldırım hızında sunulur, hem de Apache'niz sadece PHP veya diğer backend script'lerini çalıştırmak için kullanıldığından çok daha az kaynak tüketir ve daha fazla eş zamanlı kullanıcıya hizmet verebilir.
Umarım faydalı bir rehber olmuştur. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Eklemek istediğiniz püf noktalar veya takıldığınız bir yer varsa aşağıya yazmaktan çekinmeyin. Herkese sorunsuz sunucular!