İçindekiler
Bu tartışma neredeyse web sunucularının kendisi kadar eski. Forumlarda hâlâ "Apache ağırdır, Nginx'e geçin" tavsiyesi dolaşıyor. Bu tavsiye, Apache'nin varsayılan olarak prefork modunda ve mod_php ile çalıştığı döneme aitti. O kurulumda her bağlantı ayrı bir süreç demekti ve yoğun trafikte bellek hızla tükeniyordu.
Bugün durum farklı. Modern bir Apache kurulumu event MPM ve PHP-FPM ile çalışır, binlerce eşzamanlı bağlantıyı rahatça taşır. Yine de iki sunucunun gerçek farkları var.
Mimari fark
Nginx baştan olay güdümlü (event-driven) tasarlandı. Az sayıda işçi süreç, binlerce bağlantıyı aynı anda yönetir. Statik dosya sunmakta ve ters vekil (reverse proxy) olarak çalışmakta son derece verimlidir. PHP'yi kendisi çalıştırmaz; istekleri PHP-FPM'e iletir.
Apache'nin modüler bir mimarisi var ve farklı çalışma modları (MPM) sunar. event MPM ile Nginx'e yakın bir verimlilik elde edilir. PHP'yi modül olarak (mod_php) da, FPM üzerinden de çalıştırabilir.
Pratikte: Statik dosya yoğun, çok sayıda eşzamanlı bağlantı taşıyan bir sitede Nginx bellek kullanımında hâlâ öndedir. Ancak PHP uygulamalarında darboğaz neredeyse hiçbir zaman web sunucusu değil; PHP kodu ve veritabanıdır.
Asıl fark: .htaccess
Günlük kullanımda iki sunucuyu ayıran en önemli özellik budur.
Apache, dizin bazlı .htaccess dosyalarını okur. Bu sayede bir kullanıcı, sunucu yapılandırmasına erişmeden kendi klasöründe yönlendirme, erişim kısıtlaması ya da önbellek kuralı tanımlayabilir. WordPress, kalıcı bağlantılar için bu dosyayı kendisi yazar. Eklentilerin çoğu da kurallarını buraya ekler.
Nginx'te .htaccess yoktur. Bütün kurallar merkezi yapılandırmada durur ve değişiklik için sunucunun yeniden yüklenmesi gerekir. Bu daha hızlıdır, çünkü her istekte diskte dosya aranmaz. Daha güvenlidir, çünkü kullanıcılar sunucu davranışını değiştiremez. Ama daha az esnektir.
Bu yüzden:
- Paylaşımlı hosting ve kullanıcıların kendi ayarlarını yaptığı paneller için Apache neredeyse standarttır.
- Tek bir uygulamanın çalıştığı ve yapılandırmayı sizin yönettiğiniz sunucularda Nginx daha sade ve öngörülebilirdir.
Yapılandırma örneği
Aynı WordPress kalıcı bağlantı kuralı iki sunucuda şöyle görünür.
Apache (.htaccess):
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Nginx (sunucu bloğu):
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/www.sock;
}
İkisi birlikte
Çok yaygın bir düzen, ikisini birlikte kullanmaktır: Nginx önde durur, statik dosyaları ve TLS'i karşılar, dinamik istekleri arkadaki Apache'ye iletir. Böylece .htaccess uyumluluğu korunur, statik içerik de Nginx'in verimliliğiyle sunulur. Pek çok hosting paneli bu düzeni tek tıkla sunar.
Bunun bedeli, bir katman daha yönetmektir. Gerçek ziyaretçi IP'sinin arkadaki sunucuya doğru aktarılması gibi küçük ama önemli ayarlar gerekir (X-Forwarded-For, Apache tarafında mod_remoteip).
Peki ben ne seçiyorum?
- Birden fazla kullanıcılı hosting sunucusu: Apache (event MPM + PHP-FPM). Gerekirse önüne Nginx.
- Tek bir WordPress sitesi, kendi VPS'im: İkisi de olur. Eklentilerin
.htaccesskuralına ihtiyaç duyma ihtimali varsa Apache, yoksa Nginx. - Node.js, Python, Go gibi uygulamaların önünde ters vekil: Nginx (ya da otomatik TLS istiyorsanız Caddy).
- Yüksek trafikli statik içerik ya da dosya indirme sunucusu: Nginx.
Seçimden önemli olanlar
Hangi sunucuyu seçerseniz seçin, performansa asıl etkiyi şunlar yapar: PHP-FPM havuz ayarları, OPcache'in açık olması, sayfa önbelleği, sıkıştırma (gzip ya da brotli) ve HTTP/2. Yanlış ayarlanmış bir Nginx, iyi ayarlanmış bir Apache'den yavaştır.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.