Buyukweb
VDS'de Apache 2.4 Kurulumu ve Yapılandırması: MPM, .htaccess, PHP-FPM

VDS'de Apache 2.4 Kurulumu ve Yapılandırması: MPM, .htaccess, PHP-FPM

VDS sunucusunda Apache 2.4 kurulumu, MPM seçimi (prefork/worker/event), PHP-FPM entegrasyonu, mod_rewrite, mod_security + OWASP CRS, TLS ve performans tuning rehberi.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü12 dakika okuma

VDS'de Apache 2.4 Kurulumu ve Yapılandırması: MPM, .htaccess, PHP-FPM ve Güvenlik

Yeni VDS aldınız, üzerine WordPress kuracaksınız ve kafanızda şu soru var: "Apache mi, Nginx mi, yoksa başka bir şey mi?" Bu soruya dürüst bir cevap vererek başlayalım.

Eğer Buyukweb cPanel hosting paketindeyseniz: Zaten LiteSpeed 6.x çalışıyor; Apache 2.4 .htaccess direktiflerini tam olarak destekliyor, üstelik saf Apache'den çok daha hızlı. Ayrıca Apache kurmanıza gerek yok. Bu yazı tamamen VDS senaryosu için — kendi sunucunuzu yönetiyorsanız ve Apache 2.4'ü elle kurup yapılandırmak istiyorsanız doğru yerdesiniz.

Apache hâlâ seçilebilir mi? Evet, şu durumlar için: .htaccess bağımlı uygulamalar, mod_rewrite gerektiren legacy PHP projeler, mod_security + OWASP CRS ile katmanlı WAF kurmak isteyenler ve Apache'nin 30 yıllık modül ekosistemiyle aşinalığı olan ekipler. Ama modern WordPress/WooCommerce trafiği için saf Apache 2.4'ü tercih etmemenizi öneririm — LiteSpeed (cPanel'de standart) veya Nginx + PHP-FPM daha verimli çalışır. Bu yazı teknik bir referans; hangi senaryoda neyin mantıklı olduğunu görmek için okuyun.

Apache 2.4 ve Alternatifler: Kısa Kıyaslama

VDS'de web sunucusu seçiminde üç isme bakılır: Apache 2.4, Nginx ve LiteSpeed. Nginx olay güdümlü (event-driven) asenkron mimarisi ile yüksek eş zamanlılıkta bellek ayak izini düşük tutar, statik dosya sunumunda ve reverse proxy olarak öne çıkar; .htaccess desteği yoktur, tüm yapılandırma merkezi nginx.conf dosyasında tutulur. LiteSpeed, Buyukweb cPanel paketlerinde standart olarak gelir; Apache 2.4 .htaccess uyumluluğunu korurken bu ikisinden daha yüksek statik + PHP performansı sunar. Apache 2.4'ün en güçlü yanı modüler yapı esnekliğidir: prefork/worker/event MPM seçimi, .htaccess ile dizin bazlı konfigürasyon, mod_security entegrasyonu ve PHP'yi doğrudan işleyen mod_php desteği (artık deprecated, ama hâlâ çalışır). Eğer VDS'de Apache seçiyorsanız bunlar için seçin.

Kurulum

Ubuntu 22.04 / Debian 12

apt update
apt install -y apache2

# Başlat ve önyüklemeye ekle
systemctl enable --now apache2

# Güvenlik duvarı — UFW ile HTTP + HTTPS izni
ufw allow 'Apache Full'

# Sürüm kontrolü
apache2 -v
# Server version: Apache/2.4.58 (Ubuntu)

AlmaLinux 9 / RHEL 9

dnf install -y httpd

# Başlat ve önyüklemeye ekle
systemctl enable --now httpd

# Güvenlik duvarı
firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --reload

# Sürüm kontrolü
httpd -v
# Server version: Apache/2.4.57 (AlmaLinux)

Dikkat: Ubuntu/Debian'da servis adı apache2, AlmaLinux/RHEL'de httpd. Komutlarda bu fark önemli.

Dizin Yapısı: Debian vs RHEL Karşılaştırması

Apache'nin iki farklı yerleşim şeması var; hangisinde çalıştığınızı bilmeden konfigürasyon dosyası aramak zaman kaybettirir.

Ubuntu / Debian:

/etc/apache2/
├── apache2.conf           → Ana konfigürasyon dosyası
├── ports.conf             → Port dinleme ayarları (Listen 80, Listen 443)
├── mods-available/        → Mevcut tüm modüller (.load + .conf)
├── mods-enabled/          → Aktif modüller (mods-available'a symlink)
├── sites-available/       → Tanımlı VirtualHost dosyaları
├── sites-enabled/         → Aktif siteler (sites-available'a symlink)
└── conf-available/        → Ek yapılandırma parçaları

a2enmod, a2dismod, a2ensite, a2dissite komutları bu symlink mekanizmasını yönetir.

AlmaLinux / RHEL:

/etc/httpd/
├── conf/httpd.conf        → Ana konfigürasyon (Debian'daki apache2.conf karşılığı)
├── conf.d/                → Ek konfigürasyonlar (her site için .conf dosyaları buraya)
└── conf.modules.d/        → Modül yükleme direktifleri

RHEL'de symlink mekanizması yoktur; siteye özel dosyalar doğrudan conf.d/ altına yazılır.

MPM (Multi-Processing Module) Seçimi

Apache'nin en kritik yapılandırma kararlarından biri MPM seçimidir. Yanlış MPM, aynı donanımda bellek tüketimini iki-üç katına çıkarabilir.

MPM Çalışma Modeli PHP Entegrasyonu Ne Zaman
prefork Her istek için ayrı process mod_php (thread-safe değil) Legacy mod_php zorunluysa
worker Process + thread PHP-FPM (mod_proxy_fcgi) Karışık iş yükü
event Asenkron, keepalive bağlantılar ayrı thread PHP-FPM (mod_proxy_fcgi) Modern PHP-FPM + yüksek eş zamanlılık

Öneri: PHP-FPM kullanacaksanız event MPM seçin; prefork'tan bellek kullanımı belirgin şekilde düşük kalır. mod_php (legacy) zorunluysa prefork dışında seçenek yoktur.

Aktif MPM kontrolü:

apache2ctl -V | grep MPM          # Ubuntu
httpd -V | grep MPM               # AlmaLinux

MPM değiştirme (Ubuntu):

a2dismod mpm_prefork
a2enmod mpm_event
systemctl restart apache2

AlmaLinux'ta /etc/httpd/conf.modules.d/00-mpm.conf dosyasında prefork satırını comment'e alıp event satırını aktif edin, ardından systemctl restart httpd.

VirtualHost Yapılandırması

Ubuntu / Debian

/etc/apache2/sites-available/example.com.conf dosyasına yazın:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public

    ErrorLog  /var/log/apache2/example.com-error.log
    CustomLog /var/log/apache2/example.com-access.log combined

    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Siteyi etkinleştirin:

a2ensite example.com.conf
apachectl configtest          # Söz dizimi hatası var mı?
systemctl reload apache2

AlmaLinux / RHEL

/etc/httpd/conf.d/example.com.conf dosyasına yazın (içerik aynı). Symlink gerekmez; doğrudan yeniden yükleyin:

apachectl configtest
systemctl reload httpd

AllowOverride All neden önemli: Bu direktif olmadan .htaccess dosyaları tamamen yok sayılır. WordPress, .htaccess aracılığıyla permalink yapısını yönetir; AllowOverride None ile kurulmuş bir Apache'de WordPress permalinkları çalışmaz.

PHP Entegrasyonu: mod_php (Legacy) vs PHP-FPM (Modern)

Özellik mod_php (prefork) PHP-FPM + mod_proxy_fcgi (event/worker)
MPM uyumu Yalnızca prefork event veya worker
Bellek (idle process) Her process PHP yükler Ayrı FPM pool, paylaşılan
PHP sürümü değiştirme Apache restart gerekir php-fpm servisini yeniden başlat
Thread-safe Hayır (ZTS gerekir) Evet (FPM kendi process'inde)
Üretim önerisi Deprecated, yeni kurulum önerilmez Modern standart

PHP 8.2 + PHP-FPM kurulumu (Ubuntu):

apt install -y php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl php8.2-mbstring php8.2-zip
systemctl enable --now php8.2-fpm

Apache'de mod_proxy_fcgi etkinleştirme:

a2enmod proxy_fcgi setenvif
a2enconf php8.2-fpm
systemctl reload apache2

VirtualHost içinde PHP-FPM entegrasyonu:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com/public

    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # PHP-FPM unix socket üzerinden
    <FilesMatch ".php$">
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>

    ErrorLog  /var/log/apache2/example.com-error.log
    CustomLog /var/log/apache2/example.com-access.log combined
</VirtualHost>

PHP-FPM pool yapılandırması (/etc/php/8.2/fpm/pool.d/www.conf):

[www]
user  = www-data
group = www-data

; Unix socket (TCP için: listen = 127.0.0.1:9000)
listen       = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode  = 0660

pm                   = dynamic
pm.max_children      = 20
pm.start_servers     = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10

php_admin_value[memory_limit]        = 256M
php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size]       = 64M
systemctl restart php8.2-fpm
apachectl configtest && systemctl reload apache2

.htaccess ve mod_rewrite

.htaccess, Apache'nin ve LiteSpeed'in en güçlü araçlarından biridir: VirtualHost yeniden başlatmadan, dizin bazında URL rewrite, erişim kontrolü, header manipülasyonu yapabilirsiniz.

mod_rewrite etkinleştirme (Ubuntu — AlmaLinux'ta varsayılan açıktır):

a2enmod rewrite
systemctl restart apache2

Temel mod_rewrite örnekleri:

RewriteEngine On

# HTTP → HTTPS zorlama
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# www → non-www canonical
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

# WordPress pretty permalink
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

.htaccess vs VirtualHost include performans notu: .htaccess her HTTP isteğinde dosya sisteminden okunur. Yüksek trafikli (saniyede 200+ istek) bir sitede bu I/O maliyeti birikir. Kuralları VirtualHost bloğunun içine taşıyarak AllowOverride None yaparsanız bu maliyeti ortadan kaldırırsınız. WordPress için bu pratikte beklediğiniz kadar büyük bir fark yaratmayabilir; ama trafiğiniz büyüdükçe dikkat etmeye değer.

TLS + Let's Encrypt + certbot

# Ubuntu / Debian
apt install -y certbot python3-certbot-apache

# AlmaLinux 9
dnf install -y epel-release
dnf install -y certbot python3-certbot-apache

# Sertifika al — certbot apache.conf'u otomatik günceller
certbot --apache -d example.com -d www.example.com

# Otomatik yenilemeyi test et
certbot renew --dry-run

Certbot HTTPS VirtualHost bloğunu oluşturur. Sonrasında TLS ayarlarını güçlendirmek için manuel düzenleme yapın:

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example.com/public

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    # TLS 1.2 ve 1.3 — eski protokoller devre dışı
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
    SSLHonorCipherOrder off

    # HSTS — 1 yıl, ilk kez kısa test edin: max-age=300
    Header always set Strict-Transport-Security "max-age=15768000"

    # HTTP/2
    Protocols h2 http/1.1

    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch ".php$">
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

mod_ssl ve mod_headers etkinleştirme (Ubuntu):

a2enmod ssl headers http2
systemctl restart apache2

Performans Tuning

KeepAlive ve MaxRequestWorkers

apache2.conf veya httpd.conf ana dosyasında:

# KeepAlive — her bağlantıyı canlı tut
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

# event MPM için
<IfModule mpm_event_module>
    StartServers          4
    MinSpareThreads       25
    MaxSpareThreads       75
    ThreadsPerChild       25
    MaxRequestWorkers    150
    MaxConnectionsPerChild 0
</IfModule>

MaxRequestWorkers değerini doğrudan RAM'e göre belirleyin: mevcut RAM (MB) / ortalama Apache process boyutu (MB). Örneğin 2 GB RAM ve 25 MB/process için MaxRequestWorkers 80 makul bir başlangıç değeridir.

mod_deflate ve mod_expires

a2enmod deflate expires
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml
    AddOutputFilterByType DEFLATE application/javascript application/json
    AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpeg        "access plus 1 year"
    ExpiresByType image/png         "access plus 1 year"
    ExpiresByType image/webp        "access plus 1 year"
    ExpiresByType image/svg+xml     "access plus 1 year"
    ExpiresByType text/css          "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType font/woff2        "access plus 1 year"
    ExpiresByType text/html         "access plus 1 hour"
</IfModule>

Güvenlik: mod_security + OWASP CRS

mod_security Apache için açık kaynaklı bir WAF (Web Application Firewall) modülüdür. OWASP CRS (Core Rule Set) ile birlikte SQL injection, XSS, path traversal gibi yaygın saldırı kalıplarını engeller.

# Ubuntu
apt install -y libapache2-mod-security2

# AlmaLinux
dnf install -y mod_security

# OWASP CRS
apt install -y modsecurity-crs       # Ubuntu
# veya GitHub'dan: https://github.com/coreruleset/coreruleset
# Ubuntu: örnek konfigürasyonu kopyala
cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Temel yapılandırma:

# /etc/modsecurity/modsecurity.conf içinde
SecRuleEngine DetectionOnly   # Başlangıç: sadece logla, engelleye
# Test sonrası: SecRuleEngine On

SecRequestBodyAccess On
SecResponseBodyAccess Off     # Response body inceleme — performans maliyeti var
SecRequestBodyLimit 13107200

# OWASP CRS include (yol kuruluma göre değişir)
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/*.conf
a2enmod security2
apachectl configtest && systemctl reload apache2

Önemli: mod_security önce DetectionOnly modda çalıştırın, logları inceleyin (false positive?), sonra SecRuleEngine On yapın. Doğrudan On ile açmak meşru istekleri engelleyebilir.

Temel güvenlik direktifleri (VirtualHost veya ana config):

# Sunucu sürümünü gizle
ServerTokens Prod
ServerSignature Off

# Dizin listelemesini kapat
Options -Indexes

# .htaccess ve wp-config.php'yi doğrudan erişimden koru
<Files ".htaccess">
    Require all denied
</Files>
<Files "wp-config.php">
    Require all denied
</Files>

# Güvenlik header'ları
<IfModule mod_headers.c>
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

Konfigürasyon Test Komutları

apachectl configtest      # Söz dizimi kontrolü — hata yoksa "Syntax OK"
apachectl -t              # Aynı, kısa form

# Yeniden yükle (aktif bağlantıları kesmez)
systemctl reload apache2   # Ubuntu
systemctl reload httpd     # AlmaLinux

# Modül listesi
apache2ctl -M             # Ubuntu
httpd -M                  # AlmaLinux

# Canlı hata logu izleme
tail -f /var/log/apache2/error.log    # Ubuntu
tail -f /var/log/httpd/error_log      # AlmaLinux

Buyukweb VDS notu: E5-V4 ve E5-V2 VDS paketleri KVM altyapısıyla teslim edilir; unmanaged gelir, Apache kurulumu ve yapılandırması tamamen sizde. Yanlış VirtualHost yapılandırması siteye erişimi kesebilir; her değişiklik öncesi apachectl configtest alışkanlık edin. Erişim kaybı durumunda KVM konsol üzerinden bağlanabilirsiniz; teknik destek: 0850 302 60 70.

Apache 2.4 vs LiteSpeed: VDS Senaryosu

Özellik Apache 2.4 (VDS, saf) LiteSpeed (cPanel, Buyukweb standart)
.htaccess uyumluluğu Tam Tam (Apache 2.4 uyumlu)
PHP-FPM desteği mod_proxy_fcgi LSAPI (PHP-FPM'den hızlı)
Statik dosya hızı Orta Yüksek
mod_security / WAF mod_security + OWASP CRS Imunify360 entegrasyonu
HTTP/2 mod_http2 Dahili
Yapılandırma yönetimi Manuel cPanel arayüzü
Uygun senaryo Kendi VDS, tam kontrol cPanel hosting

cPanel hosting paketlerinde LiteSpeed zaten yapılandırılmış gelir; .htaccess kurallarınız doğrudan çalışır. Saf Apache 2.4 kurmayı, VDS sunucunuzu tamamen kendiniz yönetiyorsanız ve Apache'nin modül ekosistemini spesifik olarak kullanmak istediğinizde değerlendirin.

Sıkça Sorulan Sorular

prefork, worker ve event MPM arasındaki fark nedir?

prefork: Her HTTP isteği için ayrı bir process açılır. Bellek tüketimi en yüksek olan MPM'dir; ama PHP'yi thread-safe olmayan mod_php ile doğrudan çalıştırmanın tek yolu prefork'tur. worker: Process + thread modeli. Her process birden fazla thread açarak aynı anda birden fazla isteği işler; prefork'tan daha az bellek tüketir. event: worker'ın geliştirilmiş versiyonu — KeepAlive bağlantılarını ayrı bir thread'de bekletir; aktif istek işleyen thread'ler meşgul edilmez. PHP-FPM ile kullanıldığında bu üçü arasında en verimli seçimdir.

.htaccess ile VirtualHost include arasında performans farkı gerçekten önemli mi?

Önemli, ama bağlama göre. .htaccess her HTTP isteğinde dosya sistemi okur; 100-200 istek/saniye üzerindeki trafikte bu I/O birikmeye başlar. Kuralları doğrudan VirtualHost bloğuna alıp AllowOverride None yaparsanız bu maliyeti kaldırırsınız. WordPress için gerçekçi bir önerim: .htaccess'i başlangıçta kullanın, trafiğiniz kritik eşiği (saatte 50K+ istek) geçmeye başladığında VirtualHost include'a geçiş planlayın.

mod_php deprecated mı, yeni kurulumda kullanmalı mıyım?

PHP geliştiricileri mod_php'yi eski ve önerilmeyen yöntem olarak değerlendiriyor; ancak tamamen kaldırılmadı. Yeni kurulumda PHP-FPM + mod_proxy_fcgi kombinasyonunu tercih edin: PHP sürüm değişikliği Apache restart gerektirmez, pool başına bellek ve process sınırı tanımlayabilirsiniz, event MPM ile çalışır. mod_php'yi ancak legacy uygulama zorunlu kıldığında ve prefork MPM ile birlikte kullanın.

Apache ile PHP-FPM nasıl entegre edilir, mod_php'den ne farkı var?

PHP-FPM ayrı bir servis olarak çalışır; Apache bu servise istekleri unix socket veya TCP üzerinden yönlendirir. Bunun için Apache tarafında mod_proxy_fcgi modülü gerekir. VirtualHost içinde <FilesMatch ".php$"> bloğuna SetHandler "proxy:unix:/run/php/phpX.X-fpm.sock|fcgi://localhost" yazılır. mod_php'de ise PHP doğrudan Apache process'inin içinde çalışır; her Apache worker PHP'yi belleğe yükler, bu yüzden idle worker bile fazladan bellek tüketir.

Buyukweb cPanel hosting'de Apache mi çalışıyor?

Hayır. Buyukweb cPanel paketlerinde LiteSpeed 6.x çalışır. Ancak LiteSpeed, Apache 2.4 .htaccess direktiflerini (mod_rewrite, mod_headers, mod_expires, mod_deflate dahil) doğrudan yorumlar; Apache'ye özel uygulamalarınız .htaccess düzeyinde çalışmaya devam eder. Saf Apache 2.4 kurmak istiyorsanız bu yalnızca VDS/dedicated sunucu senaryosudur.

apachectl configtest "Syntax OK" diyor ama site açılmıyor — ne yapmalıyım?

Syntax OK yalnızca yapılandırma dosyasının söz diziminin geçerli olduğunu söyler; runtime hataları (örneğin var olmayan DocumentRoot dizini, çözülemeyen mod bağımlılığı) configtest'te yakalanmaz. Adımlar: /var/log/apache2/error.log (Ubuntu) veya /var/log/httpd/error_log (AlmaLinux) dosyasına bakın, VirtualHost'ta DocumentRoot dizininin gerçekten var olduğunu kontrol edin (ls /var/www/example.com/public), PHP-FPM unix socket'ının mevcut olduğunu doğrulayın (ls -l /run/php/php8.2-fpm.sock), systemctl status apache2 ile servis durumunu inceleyin.

mod_security false positive veriyor, meşru istekleri engelliyor — ne yapmalıyım?

OWASP CRS'yi önce DetectionOnly modda çalıştırın; bu modda kural ihlali loglanır ama istek engellenmez. /var/log/apache2/modsec_audit.log dosyasındaki kayıtları inceleyerek hangi kuralın (Rule ID) tetiklendiğini bulun. Belirli bir kural gereksiz yere tetikleniyorsa SecRuleRemoveById [RULE_ID] ile kaldırabilir ya da SecRuleUpdateActionById ile sadece loglama yapmasını sağlayabilirsiniz.


İlgili Büyükweb Hizmetleri

Apache 2.4 ve PHP-FPM için kendi sunucunuzu yönetmek isteyenler:

Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.

Sunucu Yönetimi İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#apache#kurulum rehberi#sunucu#server yönetimi#sistem yönetimi

Bu yazıyı paylaş