Caddy ile WordPress Kurulumu ve Optimizasyonu

WordPress hosting söz konusu olduğunda çoğu sistem yöneticisi hala Apache veya Nginx’e yönelir. Oysa Caddy, otomatik HTTPS, sade konfigürasyon yapısı ve modern HTTP/3 desteğiyle bu alanda ciddi bir alternatif sunuyor. Bu yazıda Caddy üzerinde performanslı, güvenli ve production-ready bir WordPress kurulumu nasıl yapılır, bunu adım adım ele alacağız.

Neden Caddy ve WordPress?

Nginx ile WordPress kurmak için genellikle onlarca satır konfigürasyon yazmanız, Let’s Encrypt için ayrıca Certbot kurmanız ve manuel olarak yenileme işlemlerini yönetmeniz gerekir. Caddy bu süreçlerin büyük kısmını otomatize eder.

Caddy’nin WordPress için öne çıkan avantajları şunlar:

  • Otomatik TLS: Let’s Encrypt veya ZeroSSL üzerinden sertifika alımı ve yenilenmesi tamamen otomatik
  • HTTP/3 desteği: QUIC protokolü sayesinde özellikle mobil kullanıcılarda ciddi performans artışı
  • Sade Caddyfile sözdizimi: Nginx’in karmaşık location bloklarına gerek yok
  • Gzip/Zstd sıkıştırma: Tek satırla aktif edilebiliyor
  • PHP-FPM entegrasyonu: Temiz ve anlaşılır bir şekilde konfigüre ediliyor

Sistem Hazırlığı

Ubuntu 22.04 LTS üzerinde çalışacağız. Önce sistemi güncelleyip gerekli paketleri kuralım.

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget unzip software-properties-common

PHP-FPM Kurulumu

WordPress için PHP 8.2 kullanacağız. Ondrej PPA’sını ekleyerek güncel versiyonu kuralım.

sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstring 
  php8.2-curl php8.2-zip php8.2-gd php8.2-intl php8.2-bcmath 
  php8.2-imagick php8.2-opcache php8.2-redis

PHP-FPM konfigürasyonunu WordPress için optimize edelim. /etc/php/8.2/fpm/pool.d/wordpress.conf dosyasını oluşturun:

sudo nano /etc/php/8.2/fpm/pool.d/wordpress.conf
[wordpress]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm-wordpress.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 300
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php/wordpress-error.log

Log dizinini oluşturup FPM’i yeniden başlatalım:

sudo mkdir -p /var/log/php
sudo chown www-data:www-data /var/log/php
sudo systemctl restart php8.2-fpm

MariaDB Kurulumu

sudo apt install -y mariadb-server
sudo mysql_secure_installation

WordPress için veritabanı ve kullanıcı oluşturalım:

sudo mysql -u root -p
CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'G3rCektenG4venliSifre!';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Caddy Kurulumu

Caddy’yi resmi deposundan kuralım. Bu yöntem otomatik güncellemeler için daha sağlıklı.

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | 
  sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | 
  sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Kurulumun başarılı olduğunu doğrulayalım:

caddy version
sudo systemctl status caddy

WordPress Dosyalarının Kurulumu

WordPress’i web root dizinine indirelim:

sudo mkdir -p /var/www/wordpress
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo cp -r wordpress/* /var/www/wordpress/
sudo chown -R www-data:www-data /var/www/wordpress
sudo find /var/www/wordpress -type d -exec chmod 755 {} ;
sudo find /var/www/wordpress -type f -exec chmod 644 {} ;

wp-config.php dosyasını oluşturalım:

sudo cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
sudo nano /var/www/wordpress/wp-config.php

Veritabanı bilgilerini güncelleyin ve WordPress güvenlik anahtarlarını [WordPress secret key generator](https://api.wordpress.org/secret-key/1.1/salt/) üzerinden alıp ekleyin.

Caddyfile Konfigürasyonu

İşte Caddy’nin gerçek gücünün ortaya çıktığı yer burası. /etc/caddy/Caddyfile dosyasını düzenleyelim:

sudo nano /etc/caddy/Caddyfile
{
    email [email protected]
    admin off

    servers {
        protocols h1 h2 h3
    }
}

siteniz.com, www.siteniz.com {
    root * /var/www/wordpress
    
    # Gzip ve Zstd sıkıştırma
    encode zstd gzip

    # PHP dosyaları için FastCGI
    php_fastcgi unix//run/php/php8.2-fpm-wordpress.sock

    # WordPress için gerekli dosya sunumu
    file_server

    # WordPress pretty permalink desteği
    @notStatic {
        not file
        not path /wp-admin/*
    }
    rewrite @notStatic /index.php?{query}

    # Güvenlik başlıkları
    header {
        X-Content-Type-Options nosniff
        X-Frame-Options SAMEORIGIN
        X-XSS-Protection "1; mode=block"
        Referrer-Policy strict-origin-when-cross-origin
        Permissions-Policy "camera=(), microphone=(), geolocation=()"
        -Server
    }

    # XML-RPC engelleme (brute force koruması)
    @xmlrpc path /xmlrpc.php
    respond @xmlrpc 403

    # Hassas dosyalara erişimi engelle
    @sensitive {
        path *.sql *.bak *.log /wp-config.php /.git/*
    }
    respond @sensitive 403

    # wp-content/uploads dizinine PHP çalıştırmayı engelle
    @uploadsPhp {
        path /wp-content/uploads/*.php
    }
    respond @uploadsPhp 403

    # Statik dosyalar için cache header
    @static {
        path *.css *.js *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2
    }
    header @static Cache-Control "public, max-age=31536000, immutable"

    log {
        output file /var/log/caddy/wordpress-access.log {
            roll_size 100mb
            roll_keep 7
        }
        format json
    }
}

Konfigürasyonu test edip Caddy’yi yeniden başlatalım:

sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

OPcache Optimizasyonu

PHP OPcache doğru yapılandırılmazsa WordPress performansı ciddi şekilde düşer. /etc/php/8.2/fpm/conf.d/10-opcache.ini dosyasını düzenleyin:

sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.save_comments=1
opcache.jit=1255
opcache.jit_buffer_size=128M

Redis ile Object Cache

WordPress veritabanı sorgularını azaltmak için Redis object cache kurulumu yapalım. Bu özellikle yüksek trafikli sitelerde büyük fark yaratır.

sudo apt install -y redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server

Redis konfigürasyonunda bellek limitini ayarlayalım:

sudo nano /etc/redis/redis.conf

Şu satırları bulup güncelleyin veya ekleyin:

  • maxmemory 256mb: Redis’in kullanabileceği maksimum bellek
  • maxmemory-policy allkeys-lru: Bellek dolduğunda en az kullanılan anahtarları sil
  • bind 127.0.0.1: Sadece localhost’tan bağlantı kabul et
sudo systemctl restart redis-server

WordPress tarafında Redis’i aktif etmek için WP-CLI ile Redis Object Cache eklentisini kurun ya da wp-content dizinine doğrudan object-cache.php dosyasını koyabilirsiniz. WP-CLI yolunu tercih edelim:

cd /var/www/wordpress
sudo -u www-data wp plugin install redis-cache --activate
sudo -u www-data wp redis enable

wp-config.php dosyasına Redis bağlantı bilgisini ekleyin:

sudo nano /var/www/wordpress/wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
define('WP_CACHE', true);

Caddy ile Statik Dosya Önbellekleme

Caddy’de disk tabanlı bir sayfa önbellekleme mekanizması kurmak istiyorsanız, caddy-cache modülünü veya daha pratik bir yaklaşım olarak WordPress tarafında bir önbellekleme eklentisi kullanabilirsiniz. Ancak Caddy’nin kendi konfigürasyonunda statik dosya ve browser cache yönetimini zaten yukarıdaki Caddyfile’da hallettik.

Nginx’te gördüğünüz fastcgi_cache gibi bir sunucu tarafı sayfa önbelleklemesi için Caddy’nin xcaddy ile derlenmesi gerekiyor. Production’da daha pratik yaklaşım, WP Rocket veya W3 Total Cache gibi bir eklentiyle disk üzerine statik HTML üretmek ve Caddy’nin bu dosyaları direkt sunmasını sağlamaktır.

W3 Total Cache için disk enhanced modunda Caddyfile’a şu bloğu ekleyin:

# W3 Total Cache disk enhanced entegrasyonu
@w3tc_cached {
    not method POST
    not header Cookie *comment_author*
    not header Cookie *wordpress_logged_in*
    not header Cookie *wp-postpass*
    file /wp-content/cache/page_enhanced/{host}{path}/_index.html
}
rewrite @w3tc_cached /wp-content/cache/page_enhanced/{host}{path}/_index.html

Güvenlik Sertleştirmesi

wp-login.php Brute Force Koruması

Caddy’de rate limiting için rate_limit direktifi kullanılabilir, ancak bu bir modül gerektirir. Basit bir IP bazlı sınırlama için Fail2ban’ı devreye alabiliriz.

sudo apt install -y fail2ban
sudo nano /etc/fail2ban/filter.d/caddy-wordpress.conf
[Definition]
failregex = ^.*"remote_ip":"<HOST>".*"uri":"/wp-login.php".*"status":200.*$
            ^.*"remote_ip":"<HOST>".*"uri":"/wp-login.php".*"status":302.*$
ignoreregex =
sudo nano /etc/fail2ban/jail.d/caddy-wordpress.conf
[caddy-wordpress]
enabled = true
port = http,https
filter = caddy-wordpress
logpath = /var/log/caddy/wordpress-access.log
maxretry = 5
findtime = 300
bantime = 3600
sudo systemctl restart fail2ban

MariaDB Performans Ayarları

Yüksek trafikli WordPress siteleri için MariaDB’yi de optimize etmek gerekiyor. /etc/mysql/mariadb.conf.d/50-server.cnf dosyasına aşağıdaki ayarları ekleyin:

[mysqld]
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
query_cache_type = 0
query_cache_size = 0
max_connections = 150
thread_cache_size = 16
tmp_table_size = 64M
max_heap_table_size = 64M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
sudo systemctl restart mariadb

Performans Testi ve İzleme

Kurulumun düzgün çalıştığını doğrulamak için birkaç araç kullanalım:

# HTTP/3 desteğini kontrol et
curl -I --http3 https://siteniz.com

# PHP-FPM socket durumu
sudo systemctl status php8.2-fpm

# Redis bağlantısını test et
redis-cli ping

# Caddy loglarını canlı izle
sudo journalctl -u caddy -f

# WordPress veritabanı bağlantısını test et (WP-CLI ile)
sudo -u www-data wp db check --path=/var/www/wordpress

Caddy’nin kendi admin API’si üzerinden anlık metrik almak için:

# Admin arayüzü açıksa (production'da kapalı tutun)
curl http://localhost:2019/metrics

Otomatik Yedekleme

WordPress için basit bir yedekleme scripti hazırlayalım:

sudo nano /usr/local/bin/wp-backup.sh
#!/bin/bash

BACKUP_DIR="/backups/wordpress"
DATE=$(date +%Y%m%d_%H%M%S)
WP_DIR="/var/www/wordpress"
DB_NAME="wordpress_db"
DB_USER="wp_user"
DB_PASS="G3rCektenG4venliSifre!"

mkdir -p "$BACKUP_DIR"

# Veritabanı yedeği
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | 
  gzip > "$BACKUP_DIR/db_$DATE.sql.gz"

# Dosya yedeği (uploads dizini)
tar czf "$BACKUP_DIR/uploads_$DATE.tar.gz" 
  "$WP_DIR/wp-content/uploads/"

# 7 günden eski yedekleri sil
find "$BACKUP_DIR" -name "*.gz" -mtime +7 -delete

echo "Yedekleme tamamlandi: $DATE"
sudo chmod +x /usr/local/bin/wp-backup.sh
sudo crontab -e

Crontab’a şunu ekleyin:

0 3 * * * /usr/local/bin/wp-backup.sh >> /var/log/wp-backup.log 2>&1

Yaygın Sorunlar ve Çözümleri

404 hatası permalink’lerde: Caddyfile’daki @notStatic matcher’ın doğru tanımlandığından emin olun. file_server direktifi php_fastcgi‘dan önce gelmemeli.

PHP socket bağlantı hatası: FPM pool konfigürasyonunda tanımladığınız socket yolunun Caddyfile’daki yolla birebir eşleştiğini kontrol edin.

Uploads dizinine yazma hatası: sudo chown -R www-data:www-data /var/www/wordpress/wp-content komutunu çalıştırın.

Redis bağlanamıyor: PHP-FPM pool’unun www-data kullanıcısıyla çalıştığını ve Redis’in 127.0.0.1:6379’da dinlediğini doğrulayın.

Sertifika alınamıyor: Sunucunuzun 80 ve 443 portlarının dışarıdan erişilebilir olduğundan ve domain’in sunucu IP’sine doğru çözümlendiğinden emin olun.

Sonuç

Caddy ile WordPress kurulumu, başlangıçta Nginx veya Apache’ye kıyasla daha az yaygın görünse de pratikte çok daha temiz bir deneyim sunuyor. Otomatik TLS yönetimi, HTTP/3 desteği ve sade Caddyfile sözdizimi sayesinde bir WordPress sunucusunu production’a almak için gereken konfigürasyon miktarı ciddi ölçüde azalıyor.

PHP-FPM pool optimizasyonu, Redis object cache, OPcache ayarları ve MariaDB performans tweaks’leri bir araya geldiğinde ortalama trafikli bir WordPress sitesi için oldukça sağlam bir altyapı elde etmiş oluyorsunuz. Fail2ban entegrasyonu ve hassas dosya erişim engellemeleriyle güvenlik katmanını da makul bir seviyeye taşıdık.

Caddy’nin plugin ekosistemi Nginx kadar geniş olmasa da temel web sunucusu işlevleri için fazlasıyla yeterli. Eğer birden fazla WordPress sitesi yönetiyorsanız, Caddy’nin her site için otomatik sertifika yönetimi yapması iş yükünüzü gerçekten azaltacaktır. Ölçek büyüdükçe PHP-FPM pm.max_children değerini ve MariaDB innodb_buffer_pool_size değerini sunucunuzun RAM’ine göre yeniden hesaplamayı unutmayın.

Yorum yapın