Apache Web Sunucusu Kurulum ve Temel Yapılandırma Rehberi

Web sunucusu kurmak, bir sysadmin’in kariyerinde mutlaka geçeceği köprülerden biridir. Apache HTTP Server, onlarca yıldır bu alanın tartışmasız lideri olmaya devam ediyor. Nginx’in popülerliği artmış olsa da Apache, modüler yapısı, .htaccess desteği ve devasa dokümantasyonu sayesinde hâlâ milyonlarca sunucuda çalışıyor. Bu rehberde Apache’yi sıfırdan kurup, production ortamına yakın bir yapılandırma elde edene kadar adım adım ilerleyeceğiz.

Apache Nedir ve Neden Hâlâ Popüler?

Apache HTTP Server, Apache Software Foundation tarafından geliştirilen açık kaynaklı bir web sunucusudur. 1995 yılından bu yana aktif geliştirme sürecinde olan bu yazılım, modüler mimarisi sayesinde ihtiyaç duyduğunuz özellikleri açıp kapatmanıza olanak tanır.

Nginx ile kıyaslandığında Apache’nin öne çıktığı birkaç nokta vardır:

  • .htaccess desteği: Dizin bazlı yapılandırma, paylaşımlı hosting ortamlarında vazgeçilmezdir
  • mod_rewrite olgunluğu: URL yeniden yazma kuralları söz konusu olduğunda Apache’nin ekosistemi çok daha olgundur
  • Geniş modül desteği: mod_security, mod_evasive gibi güvenlik modülleri Apache için çok daha iyi belgelenmiştir
  • Prefork/Worker/Event MPM seçenekleri: Farklı iş yüklerine göre çalışma modelini değiştirebilirsiniz

Kurulum

Ubuntu/Debian Üzerinde Kurulum

sudo apt update
sudo apt install apache2 -y

# Servis durumunu kontrol et
sudo systemctl status apache2

# Sistem açılışında otomatik başlatmayı etkinleştir
sudo systemctl enable apache2

Kurulum tamamlandıktan sonra tarayıcınızdan http://sunucu-ip-adresi adresine girdiğinizde Apache’nin varsayılan karşılama sayfasını görmeniz gerekir. Bu sayfayı görüyorsanız Apache çalışıyor demektir.

RHEL/CentOS/Rocky Linux Üzerinde Kurulum

sudo dnf install httpd -y

# RHEL tabanlı sistemlerde servis adı "httpd"
sudo systemctl start httpd
sudo systemctl enable httpd

# Firewall kurallarını ekle
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Önemli not: Debian tabanlı sistemlerde paket ve servis adı apache2 iken RHEL tabanlı sistemlerde httpd olarak geçer. Bu farkı aklınızın bir köşesinde tutun, aksi hâlde servis komutlarında hata alırsınız.

Dizin Yapısını Tanıyalım

Apache’yi kurar kurmaz hangi dosyanın ne işe yaradığını bilmek, ileride kafanızın karışmamasını sağlar.

Ubuntu/Debian dizin yapısı:

  • /etc/apache2/apache2.conf: Ana yapılandırma dosyası
  • /etc/apache2/sites-available/: Tanımlı virtual host’ların bulunduğu dizin
  • /etc/apache2/sites-enabled/: Aktif virtual host’ların sembolik linklerinin bulunduğu dizin
  • /etc/apache2/mods-available/: Kullanılabilir modüller
  • /etc/apache2/mods-enabled/: Aktif modüller
  • /etc/apache2/conf-available/: Ek yapılandırma dosyaları
  • /var/www/html/: Varsayılan web kök dizini
  • /var/log/apache2/: Log dosyaları

RHEL/CentOS dizin yapısı:

  • /etc/httpd/conf/httpd.conf: Ana yapılandırma dosyası
  • /etc/httpd/conf.d/: Ek yapılandırma dosyaları
  • /var/www/html/: Varsayılan web kök dizini
  • /var/log/httpd/: Log dosyaları

Temel Yapılandırma

Ana Yapılandırma Dosyasını Düzenlemek

Apache’nin ana yapılandırma dosyasında değiştirmeniz gereken birkaç temel direktif vardır. Dosyayı açmadan önce mutlaka bir yedek alın:

sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.bak

# Yapılandırma dosyasını düzenle
sudo nano /etc/apache2/apache2.conf

Yapılandırma dosyasında dikkat etmeniz gereken temel direktifler:

  • ServerRoot: Apache’nin ana dizini, genellikle değiştirmeye gerek yoktur
  • Timeout: İstemci bağlantısı için bekleme süresi (saniye cinsinden, varsayılan 300)
  • KeepAlive: Kalıcı bağlantıları etkinleştirir, production’da On olmalı
  • MaxKeepAliveRequests: Tek bağlantıda işlenecek maksimum istek sayısı
  • KeepAliveTimeout: Kalıcı bağlantı için bekleme süresi

Gerçek bir production senaryosunda bu değerleri şu şekilde ayarlayabilirsiniz:

# /etc/apache2/apache2.conf içinde
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

KeepAliveTimeout değerini çok yüksek tutmak sunucu kaynaklarını gereksiz yere tüketir. 5 saniye çoğu senaryo için yeterlidir.

Virtual Host Yapılandırması

Apache’nin en güçlü özelliklerinden biri, tek bir IP adresi üzerinden birden fazla web sitesini yönetebilmesidir. Buna Virtual Hosting denir. Birkaç farklı web sitesini aynı sunucuda barındırma senaryosunu inceleyelim.

Önce her site için dizin yapısını oluşturalım:

# Site dizinlerini oluştur
sudo mkdir -p /var/www/site1.example.com/html
sudo mkdir -p /var/www/site2.example.com/html

# Dizin sahipliğini ayarla
sudo chown -R www-data:www-data /var/www/site1.example.com
sudo chown -R www-data:www-data /var/www/site2.example.com

# İzinleri düzenle
sudo chmod -R 755 /var/www/site1.example.com
sudo chmod -R 755 /var/www/site2.example.com

# Test sayfaları oluştur
echo "<h1>Site 1 Çalışıyor</h1>" | sudo tee /var/www/site1.example.com/html/index.html
echo "<h1>Site 2 Çalışıyor</h1>" | sudo tee /var/www/site2.example.com/html/index.html

Şimdi virtual host yapılandırma dosyalarını oluşturalım:

sudo nano /etc/apache2/sites-available/site1.example.com.conf
<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName site1.example.com
    ServerAlias www.site1.example.com
    DocumentRoot /var/www/site1.example.com/html

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

    ErrorLog ${APACHE_LOG_DIR}/site1-error.log
    CustomLog ${APACHE_LOG_DIR}/site1-access.log combined
</VirtualHost>

Virtual host’u etkinleştirmek ve yapılandırmayı test etmek:

# Site'yi etkinleştir
sudo a2ensite site1.example.com.conf
sudo a2ensite site2.example.com.conf

# Varsayılan siteyi devre dışı bırak (isteğe bağlı)
sudo a2dissite 000-default.conf

# Yapılandırmayı test et
sudo apache2ctl configtest

# Servisi yeniden başlat
sudo systemctl reload apache2

apache2ctl configtest komutu mutlaka bir alışkanlık hâline gelmeli. Yanlış bir yapılandırmayla Apache’yi yeniden başlatırsanız servis ayağa kalkmaz ve siteniz çöker.

Önemli Modüller

mod_rewrite ile URL Yönetimi

mod_rewrite, Apache’nin en çok kullanılan modüllerinden biridir. WordPress, Laravel, Drupal gibi hemen her modern CMS ve framework bu modülü gerektirir.

# Modülü etkinleştir
sudo a2enmod rewrite
sudo systemctl reload apache2

Tipik bir WordPress .htaccess yapılandırması şu şekilde görünür:

# /var/www/site1.example.com/html/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

Bu çalışması için virtual host yapılandırmasında AllowOverride All direktifinin aktif olması gerekir. Bunu zaten yukarıdaki örnekte eklemiştik.

Güvenlik İçin Temel Direktifler

Apache’nin varsayılan yapılandırması production için yeterince güvenli değildir. Birkaç kritik ayarı mutlaka yapmanız gerekir.

Ana yapılandırma dosyasına veya ayrı bir güvenlik yapılandırma dosyasına şunları ekleyin:

sudo nano /etc/apache2/conf-available/security.conf
# Apache sürüm bilgisini gizle
ServerTokens Prod
ServerSignature Off

# Dizin listeleмesini devre dışı bırak
Options -Indexes

# TRACE metodunu kapat
TraceEnable Off

# Clickjacking koruması
Header always append X-Frame-Options SAMEORIGIN

# XSS koruması
Header set X-XSS-Protection "1; mode=block"

# MIME type sniffing koruması
Header set X-Content-Type-Options nosniff

# Referrer Policy
Header set Referrer-Policy "strict-origin-when-cross-origin"
# Headers modülünü etkinleştir
sudo a2enmod headers

# Güvenlik yapılandırmasını etkinleştir
sudo a2enconf security

sudo systemctl reload apache2

ServerTokens Prod direktifi Apache’nin HTTP yanıt başlıklarında sürüm numarası göstermesini engeller. Saldırganlar belirli Apache sürümlerindeki açıkları hedef aldığı için bu bilgiyi gizlemek saldırı yüzeyini daraltır.

SSL/TLS Yapılandırması

Modern bir web sunucusunda HTTPS zorunludur. Let’s Encrypt ile ücretsiz sertifika alabiliriz.

# Certbot kurulumu
sudo apt install certbot python3-certbot-apache -y

# Sertifika al ve Apache'yi otomatik yapılandır
sudo certbot --apache -d site1.example.com -d www.site1.example.com

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

Certbot, Apache yapılandırmanızı otomatik olarak düzenler ve HTTPS yönlendirmesini ekler. Ancak el ile yapılan yapılandırmayı anlamak da önemlidir. Certbot’un oluşturduğu SSL virtual host şuna benzer:

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

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

    # Güvenli SSL protokolleri
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256

    # HSTS başlığı
    Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

Log Yönetimi ve İzleme

Log Formatlarını Anlamak

Apache’nin ürettiği loglar, sorun giderme ve güvenlik izleme için birincil kaynağınızdır.

# Gerçek zamanlı access log izleme
sudo tail -f /var/log/apache2/access.log

# Sadece hataları izle
sudo tail -f /var/log/apache2/error.log

# Belirli bir IP adresinden gelen istekleri filtrele
sudo grep "192.168.1.100" /var/log/apache2/access.log

# En çok istek yapan IP adreslerini listele
sudo awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

# 500 hatalarını say
sudo grep " 500 " /var/log/apache2/access.log | wc -l

Özel log formatı tanımlamak için apache2.conf dosyasına şunları ekleyebilirsiniz:

# JSON formatında log
LogFormat "{ "time":"%t", "remoteIP":"%a", "host":"%V", "request":"%U", "query":"%q", "method":"%m", "status":"%>s", "userAgent":"%{User-agent}i", "referer":"%{Referer}i" }" json_combined

# Bir virtual host için JSON log kullan
CustomLog ${APACHE_LOG_DIR}/site1-access.json json_combined

JSON formatındaki loglar, Elasticsearch veya Graylog gibi log yönetim sistemlerine aktarmak için çok daha uygundur.

Performans Optimizasyonu

MPM Seçimi

Apache üç farklı Multi-Processing Module ile çalışabilir:

  • prefork: Her istek için ayrı process, PHP modülüyle uyumlu ancak kaynak tüketimi yüksek
  • worker: Thread tabanlı, daha az bellek kullanır
  • event: Worker’ın geliştirilmiş versiyonu, KeepAlive bağlantılarını daha verimli yönetir

PHP-FPM kullanıyorsanız event MPM tercih edin:

# Mevcut MPM'i kontrol et
apache2ctl -V | grep MPM

# event MPM'e geç
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

sudo systemctl restart apache2

Sıkıştırma ve Önbellekleme

# Gerekli modülleri etkinleştir
sudo a2enmod deflate
sudo a2enmod expires
sudo a2enmod cache

sudo nano /etc/apache2/conf-available/performance.conf
# GZIP sıkıştırma
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css text/javascript
    AddOutputFilterByType DEFLATE application/javascript application/json
    AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>

# Tarayıcı önbellekleme
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType text/html "access plus 1 day"
</IfModule>
sudo a2enconf performance
sudo systemctl reload apache2

Sorun Giderme

Sysadmin hayatında Apache ile ilgili en sık karşılaşılan sorunlar ve çözümleri şunlardır:

  • Apache başlamıyor: sudo journalctl -xe | grep apache2 ve sudo apache2ctl configtest komutlarıyla hata sebebini bulun
  • 403 Forbidden hatası: Dizin izinlerini kontrol edin, www-data kullanıcısının okuma iznine sahip olduğundan emin olun
  • 404 Not Found: DocumentRoot yolunun doğruluğunu ve mod_rewrite yapılandırmasını kontrol edin
  • Port çakışması: sudo ss -tlnp | grep :80 komutuyla 80 portunu başka bir servisin kullanıp kullanmadığını kontrol edin
  • SSL sertifika hatası: sudo certbot certificates ile sertifika geçerlilik tarihini kontrol edin
# Tüm Apache yapılandırmasını test et
sudo apache2ctl configtest

# Yüklü modülleri listele
sudo apache2ctl -M

# Apache'nin dinlediği portları göster
sudo apache2ctl -S

Sonuç

Apache’yi kurmak birkaç dakika sürer ama doğru yapılandırmak, ince ayarlar yapmak ve güvenli hâle getirmek ciddi bir emek ister. Bu rehberde temel kurulumdan virtual host yapılandırmasına, SSL sertifikasından performans optimizasyonuna kadar geniş bir konu yelpazesini ele aldık.

Üretim ortamında Apache kullanıyorsanız aklınızda şunlar bulunsun: Her yapılandırma değişikliğinden önce configtest çalıştırın, log dosyalarını düzenli takip edin, modülleri ihtiyaç duymadığınız sürece etkinleştirmeyin ve SSL yapılandırmanızı SSL Labs üzerinden düzenli aralıklarla test edin.

Apache, kurumsal dünyada uzun yıllar daha varlığını koruyacak. Bu temelleri sağlam atarsanız ilerleyen konularda mod_security ile web application firewall kurma, Apache ile PHP-FPM entegrasyonu ve yük dengeleme gibi konulara geçişiniz çok daha kolay olacaktır.

Yorum yapın