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.