PHP-FPM ile PHP Performans Optimizasyonu: Ayar, İzleme ve En İyi Uygulamalar
PHP-FPM ile PHP Performans Optimizasyonu: Ayar, İzleme ve En İyi Uygulamalar
Son Güncelleme: Mart 2026
PHP-FPM (FastCGI Process Manager - HızlıCGI Süreç Yöneticisi) ile PHP uygulamalarınızın performansını artırmak, bellek kullanımını kontrol etmek ve istekleri daha verimli yönetmek mümkündür. Bu rehberde PHP-FPM ayarları, pm türleri, izleme yöntemleri ve pratik optimizasyon senaryoları adım adım ele alınacaktır.
İçindekiler
- PHP-FPM Nedir?
- PHP-FPM Temel Ayarları ve Parametreleri
- PM Modları ve Kullanım Örnekleri
- pm.max_children Hesaplama Örnekleri
- Unix Socket vs TCP: Hangisi Seçilmeli?
- İzleme, Loglama ve Sorun Giderme
- Özet Tablo: Ayar Karşılaştırmaları
- Sıkça Sorulan Sorular
- Sonuç
PHP-FPM Nedir?
PHP-FPM, PHP için bir process manager (süreç yöneticisi) olup, web sunucularından (ör. Nginx veya Apache) gelen PHP isteklerini yönetir. PHP-FPM, pool (havuz) kavramı ile istekleri izole eder, bellek ve işlemci (CPU) kaynaklarını kontrol eder ve daha stabil bir çalışmayı sağlar.
Temel faydalar:
- Performans: Kalıcı PHP süreçleri ile her istek için PHP yorumlayıcısını yeniden başlatma ihtiyacını azaltır.
- İzolasyon: Farklı uygulamalar için ayrı pool tanımlanabilir.
- Ölçeklenebilirlik: pm ayarları ile eşzamanlı istek kapasitesi ayarlanabilir.
PHP-FPM Temel Ayarları ve Parametreleri
PHP-FPM konfigürasyon dosyaları genellikle /etc/php/*/fpm/pool.d/ veya /etc/php-fpm.d/ dizinlerinde bulunur. Her pool için ayrı bir .conf dosyası oluşturulur. En önemli parametreler:
- pm: Süreç yönetim modu (static, dynamic, ondemand).
- pm.max_children: Havuzdaki maksimum PHP çocuk süreci sayısı.
- pm.start_servers: (dynamic) Başlangıçta açılacak süreç sayısı.
- pm.min_spare_servers: (dynamic) Minimum boş (idle) süreç sayısı.
- pm.max_spare_servers: (dynamic) Maksimum boş süreç sayısı.
- pm.max_requests: Bir süreç tarafından işlenecek maksimum istek sayısı (memory leak önlemi için önemlidir).
- request_terminate_timeout: Uzun süren istekleri sonlandırma süresi.
- listen: PHP-FPM dinleme adresi (unix socket veya ip:port).
PM Modları ve Kullanım Örnekleri
pm parametresi üç farklı moda sahiptir. Hangi modun ne zaman tercih edileceğine dair kısa açıklamalar:
- static: Sabit sayıda süreç her zaman çalışır. Bellek tahmini kolaydır; yüksek trafikli, öngörülebilir yüklerde tercih edilir.
- dynamic: Süreç sayısı yük durumuna göre artıp azalır. Genel amaçlı siteler için uygundur.
- ondemand: İstek geldiğinde süreç oluşturur, belirli süre idle kalırsa kapatır. Bellek kısıtlı paylaşımlı ortamlarda avantajlıdır.
pm.max_children Hesaplama Örnekleri
En kritik ayarlardan biri pm.max_children değeridir. Basit bir hesaplama yöntemi:
- Toplam kullanılabilir bellek: Sunucunuzda PHP için ayırabileceğiniz bellek miktarını belirleyin (ör. 8 GB = 8192 MB).
- Sunucu işletim sistemi ve diğer servisler için ayırma: Sistem ve diğer servisler için bellek çıkarın (ör. 2 GB = 2048 MB).
- PHP başına ortalama bellek kullanımı: Bir PHP-FPM sürecinin ortalama bellek kullanımını ölçün (ör. 60 MB).
- Hesaplama: floor((kalan_bellek_MB) / (ortalama_process_MB))
Örnek hesap:
- Toplam bellek: 8192 MB
- Sistem için ayrılan: 2048 MB
- Kalan PHP için: 6144 MB
- Ortalama process: 60 MB
- pm.max_children: floor(6144 / 60) = 102
Bu hesaplamaya göre pm.max_children=102 makul bir başlangıç noktasıdır. Ancak gerçek trafik koşullarında pm.max_requests ve request_terminate_timeout ile birlikte test edilmelidir.
Unix Socket vs TCP: Hangisi Seçilmeli?
PHP-FPM ile web sunucusu arasındaki bağlantı ya unix socket (ör. /run/php/php8.1-fpm.sock) ya da TCP (127.0.0.1:9000) üzerinden gerçekleşir. Karar verirken dikkat edilecek noktalar:
- Unix Socket: Genellikle daha hızlı ve düşük gecikme sağlar; aynı sunucuda çalışan Nginx/Apache için tercih edilir.
- TCP: Eğer PHP-FPM başka bir sunucuda (ör. ayrı bir VPS veya Kiralık Sunucu) çalışıyorsa veya yük dengeleme (load balancing) senaryosu varsa TCP tercih edilebilir.
Özet Tablo: Ayar Karşılaştırmaları
| Parametre | Kısa Açıklama | Önerilen Senaryo |
|---|---|---|
| pm=max_children | Maksimum PHP süreç sayısı | Yüksek trafikli web uygulamaları; bellek hesaplaması ile belirlenir |
| pm=start_servers | Başlangıçta çalışacak süreç sayısı (dynamic) | Düşük gecikme istenen uygulamalar |
| pm=ondemand | Süreçler talep üzerine oluşturulur | Bellek kısıtlı paylaşımlı hosting |
| pm.max_requests | Her sürecin işleyebileceği istek adedi | Memory leak riskine karşı koruma |
| listen (socket/tcp) | PHP-FPM dinleme adresi | Aynı sunucu: unix socket; uzak sunucu: tcp |
İzleme, Loglama ve Sorun Giderme
Performans sorunlarını tespit etmek için düzenli izleme gereklidir. Önerilen yöntemler:
- Top/htop/ps: Anlık süreç ve bellek kullanımı için temel araçlar.
- systemctl & journalctl: PHP-FPM servis durumu ve hata kayıtları (ör. journalctl -u php8.1-fpm).
- PHP-FPM slowlog: Uzun süren istekleri kaydetmek için pool konfigürasyonunda slowlog ve request_slowlog_timeout tanımlayın.
- Log dosyası yolları: Dağıtıma göre değişir; yaygın yerler /var/log/php-fpm.log veya /var/log/php8.1-fpm.log olabilir.
- Apm ve izleme: New Relic, Datadog veya açık kaynak Prometheus + Grafana ile metrik toplayın.
Örnek sorun giderme adımları:
- CPU veya bellek spike varsa: Hangi PHP süreçlerinin yüksek bellek kullandığını ps veya top ile tespit edin.
- Slowlog kayıtları: Uzun süren isteklerin kaynak kodunu inceleyin (ör. yavaş SQL sorguları, dış servis çağrıları).
- pm.max_requests arttırma/azaltma: Memory leak (bellek sızıntısı) şüphesinde pm.max_requests değeri ile süreç yenilenmesini sağlayın.
- Graceful reload: Konfig değişikliklerinden sonra systemctl reload phpX.Y-fpm komutu kullanarak kesinti minimize edilir; tam restart gerekiyorsa systemctl restart kullanın.
Pratik Senaryolar ve Örnek Tuning Örnekleri
Aşağıda birkaç yaygın sunucu senaryosu için başlangıç ayarları ve notlar yer almaktadır. Her örnek varsayımsal değerler içerir ve canlı ortamda test edilmelidir.
- Senaryo: Paylaşılan hosting (bellek kısıtlı): pm=ondemand, pm.max_children=20, pm.process_idle_timeout=10s, pm.max_requests=500 — avantaj: düşük bellek kullanım, dezavantaj: ilk isteklerde gecikme olabilir.
- Senaryo: Orta ölçekli VPS (4 GB RAM): pm=dynamic, pm.start_servers=4, pm.min_spare_servers=2, pm.max_spare_servers=6, pm.max_children≈50 (ortalama process 60 MB kabul edilerek hesaplanmalı), pm.max_requests=1000.
- Senaryo: Yüksek trafikli uygulama (8+ GB RAM): pm=static, pm.max_children=150 (hesaplanmış bellek doğrultusunda), pm.max_requests=2000, listen = unix:/run/php/php8.1-fpm.sock, request_terminate_timeout=30s.
Not: Bu örneklerde opcache (opcode cache) ile birlikte kullanıldığında bellek kullanım profili değişir; opcache ile birlikte script yükleme maliyeti azalır ve ortalama süreç bellek kullanımı düşebilir.
Corelux Hizmetlerine Yönlendirme
PHP-FPM optimizasyonu ve testleri için kaynak sunucu gereksinimi ya da taşıma ihtiyaçlarınız varsa Corelux'un sunduğu hizmetleri inceleyebilirsiniz:
- Türkiye VPS Sunucu — Hızlı test ve containerless uygulama deployları için uygundur.
- Türkiye VDS Sunucu — İzole kaynak ve yüksek erişilebilirlik gerektiren uygulamalar için.
- Kiralık Sunucu — Tam donanım kontrolü ve yüksek bellek gereksinimleri için.
- SSL Sertifikası — TLS/HTTPS optimizasyonu ve güvenli bağlantı için.
- Yedekleme Hizmeti — Konfig değişikliklerinden önce snapshot (anlık görüntü) almak için.
Sıkça Sorulan Sorular
pm.max_children nasıl hesaplanır?
pm.max_children hesaplaması için: kalan_bellek_MB / ortalama_php_process_MB formülünü kullanın. Kalan belleği belirlerken sistem ve diğer servisler için rezerv bırakmayı unutmayın.
pm=ondemand performansı düşürür mü?
pm=ondemand bellek tasarrufu sağlar ancak soğuk başlangıç (cold start) nedeniyle ilk istekte gecikme olabilir. Düşük trafik ve bellek sınırlı ortamlar için uygundur.
Unix socket kullanmalı mıyım yoksa TCP mi?
Aynı sunucu içindeyse unix socket genellikle daha hızlıdır. Eğer PHP-FPM farklı bir sunucuda çalışacaksa veya yük dengeleyici üzerinden erişiliyorsa TCP tercih edin.
pm.max_requests neden önemli?
pm.max_requests bellek sızıntılarına (memory leak) karşı prosesleri belli istekten sonra yeniden başlatarak sistemi stabil tutar. Uzun süreli çalışan süreçlerde tavsiye edilir.
Değişikliklerden sonra nasıl uygulama yapmalıyım?
Konfigürasyon değişikliğinden sonra önce systemctl reload php-fpm (dağıtıma göre phpX.Y-fpm) ile graceful reload deneyin. Sorun olursa tam restart yapın. Canlı trafiğe müdahale ederken yedek almayı unutmayın.
Sonuç
Doğru PHP-FPM ayarları, sunucunuzun kaynak kullanımını dengeleyerek uygulama performansını ve kararlılığını önemli ölçüde artırır. Başlangıçta bellek tahmini ve gerçek trafik testleri ile pm.max_children, pm modu ve pm.max_requests gibi değerleri belirleyin. İleri seviye izleme için Prometheus + Grafana gibi çözümler önerilir.
Corelux olarak, test, taşıma veya yüksek performanslı altyapı ihtiyaçlarınız için Türkiye VPS Sunucu, Türkiye VDS Sunucu veya Kiralık Sunucu çözümlerimizi değerlendirebilirsiniz. Konfigürasyon değişikliklerinden önce Yedekleme Hizmeti kullanarak geri dönüş planı oluşturmanızı öneririz.
Eğer özel bir senaryonuz varsa, gerekli bellek ve işlemci değerlerinizi paylaşın; size özel bir başlangıç konfigürasyonu hazırlayalım.
Yazar
Boran BAR