PHP-FPM nedir | PHP-FPM kurulumu ve ayarları
PHP-FPM, önceden başlatılmış worker süreçlerinin bir web sunucusunun ilettiği PHP isteklerini alıp işlediği bir FastCGI süreç yöneticisidir. Bu rehber, Apache'nin çalıştığı bir AlmaLinux 9 sunucusunda kurulu olup olmadığını ve site hesabına göre havuz ile soket ayarlarını kontrol eder, ardından yapılandırma testini ve durum kontrolünü gerçek çıktılarla gösterir.
Apache, PHP'yi mod_php ile doğrudan da çalıştırabilir, ancak PHP-FPM'e devrederseniz web sunucusu ile PHP birbirinden ayrılır. Nginx PHP'yi doğrudan çalıştıramaz, bu yüzden istekleri PHP-FPM gibi bir FastCGI sürecine iletir. Bu nedenle tek bir PHP-FPM hem Apache'ye hem de Nginx'e bağlanabilir. Aşağıdaki havuz ayarları ve soket yapısı, PHP-FPM'i Nginx ile bağladığınızda da olduğu gibi geçerlidir.
1️⃣ PHP-FPM nedir: CGI ile FastCGI arasındaki fark
CGI (Common Gateway Interface), bir web sunucusunun dinamik içerik üretmek için harici bir programı çalıştırdığı standart yöntemdir ve istek geldikçe programı her seferinde yeniden başlatır. Her istek için süreç oluşturup silmenin maliyeti birikir, bu yüzden erişim arttıkça sunucu yanıtı yavaşlar.
FastCGI bu maliyeti ortadan kaldırmak için programı önceden başlatıp istekleri art arda işler. Bu, bilgisayarı her kullanışta açıp kapatmakla zaten açık duran bir bilgisayarı hemen kullanmak arasındaki farktır. PHP-FPM (FastCGI Process Manager), PHP'yi FastCGI ile çalıştıran yöneticidir ve PHP 5.3.3 sürümünden beri PHP'nin içinde yer alır.
PHP-FPM, worker grubu olan her havuz için belirlenen sayıda worker'ı önceden başlatır; boştaki bir worker web sunucusunun soket üzerinden ilettiği isteği alır, işler ve bir sonrakini bekler. Görsel ve CSS gibi statik dosyalara web sunucusu doğrudan yanıt verir, yalnızca PHP dosyaları PHP-FPM'e geçer. Farklı olan tek şey web sunucusunun isteği sokete iletme yöntemidir: Apache mod_proxy_fcgi modülünü, Nginx fastcgi_pass ayarını kullanır.
2️⃣ PHP-FPM kurulumu: paketi kontrol etme ve dnf ile kurma
PHP'yi RHEL ailesinden bir sunucuda dnf ile kurduysanız php-fpm paketi de birlikte kurulmuştur. Önce rpm ile kurulu olup olmadığını kontrol edin. PHP kurulum adımları şuradakiyle aynıdır: Rocky Linux'ta APM kurulumu.
rpm -qa | grep php-fpmphp-fpm-8.3.36-1.module_php.8.3.el9.remi.x86_64Çıktı boşsa kurulu değildir; dnf ile kurun.
dnf -y install php-fpmKurulum bitince aynı rpm komutuyla paket adının görüntülenip görüntülenmediğini yeniden kontrol edin.
3️⃣ PHP-FPM ayarları: www.conf havuzu, soket ve statik ile dinamik mod
Yapılandırma dosyası ikidir: genel ayar [/etc/php-fpm.conf] ve havuz ayarı [/etc/php-fpm.d/www.conf]. Varsayılan havuz www.conf içinde önce bakılacak satırlar listen ve pm'dir, kurulumdan hemen sonraki değerler şöyledir.
grep -E '^(listen|pm) ' /etc/php-fpm.d/www.conflisten = /run/php-fpm/www.sock
pm = dynamiclisten, web sunucusunun isteği ilettiği yerdir ve 8.3 sürümünün varsayılan değeri Unix soketi [/run/php-fpm/www.sock]'tır. Eski sürümlerin varsayılan değeri olan [127.0.0.1:9000], istekleri TCP portundan alır. Aynı sunucu içinde soket, port bağlantısı adımından geçmediği için daha hafiftir ve listen.owner ile listen.group sayesinde erişimi dosya izinleri gibi kısıtlayabilirsiniz.
🔲 Statik ve dinamik mod ayarı
pm, worker'ların başlatılma biçimidir ve static, dynamic, ondemand değerlerinden biri girilir. Statik mod, pm.max_children'a yazılan sayıda worker'ı her zaman çalışır tutar; aşağıdaki ayar 100 worker'ı korur.
pm = static
pm.max_children = 100Dinamik mod varsayılandır ve worker sayısı istek miktarına göre artıp azalır. Aşağıdaki ayar başlangıçta 12 worker başlatır, boştaki worker sayısını 6 ile 18 arasında tutar ve en fazla 120'ye kadar çıkarır.
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18ondemand modu worker'ları yalnızca istek geldiğinde başlatır ve pm.process_idle_timeout süresi geçince sonlandırır; bu yüzden erişimi az olan sitelere uyar, erişimi sık olan sitelere uymaz.
Üç mod, worker'ları başlatma zamanı ve artıp azalma biçimi bakımından birbirinden farklıdır.
| Mod | Worker'ların başlatılma biçimi | Uygun siteler |
|---|---|---|
| static (statik) | pm.max_children'a yazılan sayıda worker'ı her zaman çalışır tutar | Erişimi sık olan siteler |
| dynamic (dinamik) | Varsayılan · istek miktarına göre pm.start_servers, pm.min_spare_servers ve pm.max_spare_servers sınırları içinde artıp azalır | Erişim miktarı inip çıkan siteler |
| ondemand | Yalnızca istek geldiğinde başlatır, pm.process_idle_timeout süresi geçince sonlandırır | Erişimi az olan siteler |
max_children, sunucu belleğinin bir worker'ın kullandığı belleğe bölünmesiyle belirlenir. [max_children] sınırına ulaşıldığı uyarıları birikse bile hemen yükseltmeyin, önce günlüklerden worker'ları dolduran istekleri ayıklayın.
Bellek ve yükleme sınırı, PHP'nin genel ayarı olan php.ini'de belirlenir ve işlettiğiniz siteye göre worker sayısıyla birlikte ayarlanır.
memory_limit = 1024M
post_max_size = 128M
upload_max_filesize = 128MBu üç değer, tek bir PHP betiğinin kullanabileceği bellek sınırı ile bir seferde yüklenebilecek dosya boyutudur ve değiştirdikten sonra PHP-FPM'i yeniden başlatmadan uygulanmaz.
🔲 Site hesabına göre havuz ayarı
Birden fazla site varsa tek bir www.conf'u paylaşmayın; hesap başına bir havuz dosyası oluşturup çalıştırma hesabını ve soketi ayırın. Bir sitenin PHP'si başka hesabın dosyalarını okuyamaz ve worker sayısı site başına belirlenir.
vi /etc/php-fpm.d/siteuser.confDosyaya havuz adı, çalıştırma hesabı, soket yolu ve worker sayısı yazılır.
[siteuser]
user = siteuser
group = nobody
listen = /run/php-fpm/siteuser.sock
listen.owner = siteuser
listen.group = nobody
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
chdir = /home/siteuser/wwwlisten.owner ve listen.group soket dosyasının sahibi ve grubudur; PHP-FPM başlarken soketi bu değerlerle oluşturur. Web sunucusu nobody hesabıyla çalışıyorsa listen.group'a nobody, apache hesabıyla çalışıyorsa apache yazın ki web sunucusu soketi açabilsin.
listen.owner = siteuser
listen.group = nobody
listen.mode = 0660Bu üç satır her havuz dosyasında bulunur ve değerleri değiştirdikten sonra soketin yeni izinlerle yeniden oluşturulması için yeniden başlatmak gerekir.
🔲 slowlog ayarı
slowlog, request_slowlog_timeout değerinden uzun süren isteklerin çalıştığı yeri kaydeden dosyadır; değer 0 ise kayıt yapılmaz. Yavaş isteklerin nedenini ararken 3s gibi saniye cinsinden bir değer vererek açın.
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 0Kaydedilen dosyada yavaş isteğin betik yolu ve o sırada çalışan işlev kalır; böylece hangi eklentinin ya da kodun zaman aldığını görebilirsiniz.
4️⃣ Apache bağlantısı: VirtualHost ayarı ve soket izinleri
Apache, PHP dosyası isteklerini mod_proxy_fcgi modülüyle havuzun soketine iletir. VirtualHost içindeki FilesMatch'e bir SetHandler satırı eklenir ve her site için o hesabın soketi yazılır.
# Site hesabı başına bir VirtualHost · SetHandler'a o hesabın soketi yazılır (SetHandler yerine ProxyPassMatch ile de bağlanabilir)
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/siteuser/www
<Directory /home/siteuser/www>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/siteuser.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>DocumentRoot ve Directory o hesabın web kök dizinidir; Options içindeki -Indexes, klasör listesinin tarayıcıda görünmesini engeller.
🔲 Soket izinlerini ayarlama
Havuz başlayınca soket listen.owner, listen.group ve listen.mode değerleriyle oluşturulur ve izinlerin doğru olup olmadığını ls ile kontrol edersiniz.
ls -l /run/php-fpm/toplam 4
srw-rw---- 1 siteuser_a nobody 0 Eki 22 23:34 siteuser_a.sock
-rw-r--r-- 1 root root 7 Eki 26 03:00 php-fpm.pid
srw-rw---- 1 siteuser_b nobody 0 Eki 22 23:34 siteuser_b.sock
srw-rw----+ 1 root root 0 Eki 22 23:34 www.sockİzinler uyuşmaz ve web sunucusu soketi açamazsa ziyaretçiler 503 hatası alır; yeniden başlatmadan hemen düzeltmek için chown ve chmod ile sahibi ve izinleri belirleyin.
Kullanıcı ile grubu iki nokta ile ayıran şimdiki sözdizimidir.
chown siteuser:nobody /run/php-fpm/siteuser.sockSahibi değiştirdikten sonra izinleri 660'a ayarlayın.
chmod 660 /run/php-fpm/siteuser.sockKullanıcı ile grubu nokta ile ayıran eski sözdizimidir ve AlmaLinux 9'daki chown'da da olduğu gibi çalışır.
chown siteuser.nobody /run/php-fpm/siteuser.sockSahibi değiştirdikten sonra izinleri 660'a ayarlayın.
chmod 660 /run/php-fpm/siteuser.sockİki sözdiziminin sonucu aynıdır; hangisini kullanırsanız kullanın soketin sahibi siteuser, grubu nobody olur.
🔲 Nginx bağlantısı: fastcgi_pass ayarı
Nginx, server bloğu içindeki PHP dosyaları için location bölümünde fastcgi_pass ile istekleri aynı havuzun soketine iletir.
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/siteuser.sock;
}Nginx nginx hesabıyla çalışıyorsa soketi açabilmesi için havuz dosyasındaki listen.group'a nginx yazılmalıdır.
5️⃣ Yapılandırma testi ve yeniden başlatma: php-fpm -t ve systemctl
Ayarları değiştirdikten sonra hemen yeniden başlatmayın; önce php-fpm -t ile sözdizimi kontrolü yapın. Havuz dosyasında yazım hatası varsa yeniden başlatmada PHP-FPM'in tamamı durur ve tüm siteler 503 alır.
php-fpm -t[26-Oct-2026 17:33:45] NOTICE: configuration file /etc/php-fpm.conf test is successfulKontrolü geçerse yapılandırma dosyası yoluyla birlikte [test is successful] mesajı görüntülenir, ardından değişikliği PHP-FPM'e uygularsınız. Soket yolu ya da listen.owner gibi soketin yeniden oluşturulmasını gerektiren değişiklikler restart ile uygulanır. Çalışan bir sunucuda yalnızca worker sayısı gibi değerleri değiştirdiyseniz reload ile uygulayın.
systemctl restart php-fpmVirtualHost'u değiştirdiyseniz Apache'yi de yeniden başlatın.
systemctl restart httpdSunucu yeniden açıldığında otomatik başlaması için enable ile kaydedin.
systemctl enable php-fpmKayıtlı olup olmadığını is-enabled ile kontrol edin.
systemctl is-enabled php-fpmenabledstatus ile her havuz için worker'ların çalışıp çalışmadığını kontrol edin.
systemctl status php-fpm● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled)
Active: active (running) since x
Process: 3934033 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 1333314 (php-fpm)
Status: "Processes active: 4, idle: 21, Requests: x, slow: 0, Traffic: x"
Tasks: x
Memory: x
CPU: x
CGroup: /system.slice/php-fpm.service
├─ 41920 "php-fpm: pool siteuser_a"
├─ 94143 "php-fpm: pool siteuser_b"
├─1333314 "php-fpm: master process (/etc/php-fpm.conf)"
├─3934078 "php-fpm: pool www"
└─4009016 "php-fpm: pool siteuser_a"
Eki 26 03:00:01 server.example.com systemd[1]: Reloading The PHP FastCGI Process Manager...
Eki 26 03:00:01 server.example.com systemd[1]: Reloaded The PHP FastCGI Process Manager.Status satırındaki active ve idle, şu anda istek işleyen worker'lar ile boştaki worker'lardır; CGroup ise worker'ları havuz adına göre listeler. Çıktıdaki ana makine adı ve havuz adları örnek değerlerle değiştirilmiştir.
🔢 SSS & önerilen içerikler
Önbellek
Önbellek: tanımı ve önbelleğe almanın kullanıldığı tüm alanlar
Önbelleğe isabet eden isteklerin PHP-FPM worker'ına hiç ulaşmadığı yapıyı alanlara göre açıklar.
Önbellek sunucusu
Apache ve Nginx'e Varnish Cache kurulumu ve ayarları
PHP isteklerinin kendisini azaltmak için web sunucusunun önüne önbellek sunucusu koyma adımlarıdır.
Linux
15 kategoride Linux komutları
Bu yazıda kullanılan rpm, grep ve systemctl dahil komutları 15 kategoriye ayıran tablodur.
ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.