Önce Ölçün: Ayar Yapmadan Önceki Değerleri Kaydedin
Performans ayarı, ölçmeden yapılırsa tahmine dönüşür. Değişikliklerden önce sayfanızın ilk bayt süresini (TTFB) not alın:
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s Toplam: %{time_total}s\n" https://alanadiniz.com/Komutu birkaç kez çalıştırıp ortalamasını alın. Her adımdan sonra aynı ölçümü tekrarlayarak hangi ayarın ne kadar kazandırdığını görebilirsiniz.
PHP-FPM Süreç Sayısını RAM'e Göre Hesaplayın
En sık yapılan hata, pm.max_children değerini sunucunun belleğinden bağımsız belirlemektir. Önce bir PHP sürecinin ortalama ne kadar bellek kullandığını bulun (örnek PHP 8.3 içindir):
ps --no-headers -o rss -C php-fpm8.3 | awk '{s+=$1} END {print s/NR/1024 " MB"}'Formül basittir: pm.max_children = PHP'ye ayırabileceğiniz RAM ÷ ortalama süreç boyutu. Örneğin 8 GB RAM'li bir VDS'te veritabanı ve işletim sistemi için 3 GB ayırıp PHP'ye 5 GB bırakırsanız ve süreç başına 80 MB ölçtüyseniz yaklaşık 60 süreç tanımlayabilirsiniz.
# /etc/php/8.3/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 60
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 20
pm.max_requests = 500OPcache'i Etkinleştirin ve Boyutlandırın
OPcache, derlenmiş PHP kodunu bellekte tutarak her istekte yeniden derlemeyi önler. Varsayılan bellek değeri büyük WordPress veya Laravel projeleri için genellikle yetersizdir:
# /etc/php/8.3/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=60sudo systemctl restart php8.3-fpmNginx: Sıkıştırma, Tarayıcı Önbelleği ve FastCGI Microcaching
Statik dosyalar için uzun tarayıcı önbelleği ve metin dosyaları için gzip sıkıştırma, sunucuya gelen istek sayısını ve aktarılan veriyi azaltır:
# server { ... } bloğu içinde
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
location ~* \.(css|js|webp|avif|png|jpg|svg|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}Dinamik sayfalarda birkaç saniyelik FastCGI önbelleği (microcaching), ani trafik artışlarında PHP'nin yükünü önemli ölçüde azaltır. Giriş yapmış kullanıcılar ve sepet sayfaları önbellekten muaf tutulmalıdır:
# http { ... } bloğu içinde
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHPCACHE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# server { ... } bloğu içinde
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($http_cookie ~* "wordpress_logged_in|woocommerce_items_in_cart") { set $skip_cache 1; }
# location ~ \.php$ { ... } bloğu içinde
fastcgi_cache PHPCACHE;
fastcgi_cache_valid 200 301 302 10s;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;sudo nginx -t && sudo systemctl reload nginxMariaDB: InnoDB Buffer Pool ve Yavaş Sorgu Günlüğü
Veritabanının sık kullanılan verileri bellekte tutabilmesi için innodb_buffer_pool_size değeri kritik önemdedir. Web ve veritabanı aynı VDS'teyse RAM'in yaklaşık %25-40'ı, yalnızca veritabanı çalıştıran sunucularda %50-70'i iyi bir başlangıçtır:
# /etc/mysql/mariadb.conf.d/50-server.cnf ([mysqld] bölümü)
innodb_buffer_pool_size = 2G
slow_query_log = 1
slow_query_log_file = /var/log/mysql/yavas-sorgular.log
long_query_time = 1Yavaş sorgu günlüğü, 1 saniyeden uzun süren sorguları kaydeder. Bu sorgulara uygun indeks eklemek çoğu zaman donanım yükseltmesinden daha fazla hız kazandırır.
Donanım Tarafı: Ne Zaman Paket Yükseltmelisiniz?
- Ayarlardan sonra CPU kullanımı yoğun saatlerde sürekli %80'in üzerindeyse
- Sunucu swap kullanmaya başladıysa (
free -hçıktısında Swap satırı doluyorsa) - Disk bekleme süresi (iowait) yüksekse ve veritabanı büyüdüyse
Bu durumlarda VDS paketinizi IP adresiniz değişmeden bir üst pakete yükseltebilirsiniz. WordPress siteleri için sunucu yönetimiyle uğraşmak istemiyorsanız LiteSpeed ve Redis hazır gelen WordPress hosting paketleri de bir seçenektir.