PHP-FPM nedir | PHP-FPM kurulumu ve ayarları

Test ortamı RHEL ailesiAlmaLinux 9.8Apache 2.4 + PHP-FPM 8.3root hesabı2026-10-26 tarihinde kontrol edildi

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.

🧩 CGI ve PHP-FPM isteği nasıl işler
Açıklama diyagramı
⚙️ PHP çalıştırma
🌐 Web sunucusu
🌐 ApacheNginx
📨 İstek 1 · index.php📨 İstek 2 · wp-login.php📨 İstek 3 · index.php
Statik dosyalara (görsel, CSS) web sunucusu doğrudan yanıt verir
Her istekte çalışırFastCGI · soket→
🧱 CGI süreçleri
İstek 1Yeni süreç → işleme → sonlanma
İstek 2Yeni süreç → işleme → sonlanma
İstek 3Yeni süreç → işleme → sonlanma
İşlem bitince süreç de kaybolur · sonraki istek yeniden başlar
🧰 PHP-FPM havuzu [siteuser]
Worker 1İstek 1
Worker 2İstek 2
Worker 3İstek 3
Worker 4bekleme
Worker 5bekleme
Önceden başlatılmış worker'lar isteği alır, bitince bir sonrakini bekler
Apache PHP'yi CGI ile çalıştırdığında her istekte yeni bir PHP süreci başlatır ve işlem bitince sonlandırır, bu yüzden istekler arttıkça süreç oluşturma maliyeti birikir.
Nginx'in CGI programlarını doğrudan çalıştıran bir modülü yoktur, bu yüzden bu birleşim kullanılmaz; PHP, FastCGI ile PHP-FPM'e iletilir.
Apache, PHP isteklerini mod_proxy_fcgi ile sokete iletir ve önceden başlatılmış bir PHP-FPM worker'ı isteği alıp işler, sonra bir sonrakini bekler.
Nginx, istekleri fastcgi_pass ile aynı sokete iletir, bu yüzden web sunucusu farklı olsa da PHP-FPM havuzu tek ve aynıdı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-fpm
php-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-fpm

Kurulum 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.conf
listen = /run/php-fpm/www.sock
pm = dynamic

listen, 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 = 100

Dinamik 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 = 18

ondemand 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.

ModWorker'ların başlatılma biçimiUygun siteler
static (statik)pm.max_children'a yazılan sayıda worker'ı her zaman çalışır tutarEriş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ırErişim miktarı inip çıkan siteler
ondemandYalnızca istek geldiğinde başlatır, pm.process_idle_timeout süresi geçince sonlandırırEriş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 = 128M

Bu üç 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.conf

Dosyaya 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/www

listen.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 = 0660

Bu üç 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 = 0

Kaydedilen 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.sock

Sahibi değiştirdikten sonra izinleri 660'a ayarlayın.

chmod 660 /run/php-fpm/siteuser.sock

Kullanı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.sock

Sahibi 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 successful

Kontrolü 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-fpm

VirtualHost'u değiştirdiyseniz Apache'yi de yeniden başlatın.

systemctl restart httpd

Sunucu yeniden açıldığında otomatik başlaması için enable ile kaydedin.

systemctl enable php-fpm

Kayıtlı olup olmadığını is-enabled ile kontrol edin.

systemctl is-enabled php-fpm
enabled

status 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

mod_php, PHP'yi Apache sürecinin içinde çalıştırdığı için kurulumu basittir, ancak her Apache worker'ında PHP yüklenir; bu çok bellek harcar ve çalıştırma hesabını siteye göre ayırmayı zorlaştırır. PHP-FPM, PHP'yi ayrı süreçlere ayırdığı için her site kendi hesabına ve worker sayısına sahip olabilir; bu yüzden birden fazla site barındıran ya da Nginx kullanan sunucularda PHP-FPM kullanılır.

systemctl reload php-fpm, ana sürece USR2 sinyali göndererek ayarları yeniden okutur ve worker'ları değiştirir. process_control_timeout belirtirseniz, işlediği isteği bitiren worker'dan başlanarak değiştirilir (resmi belgelere göre). restart tüm worker'ları bir anda indirip yeniden kaldırdığı için o andaki istekler kesilebilir; bu yüzden çalışan bir sunucuda önce reload kullanın.

RHEL ailesinde varsayılan günlük [/var/log/php-fpm/error.log]'dur ve worker yetersizliği uyarıları (seems busy · max_children) ile havuzların başlama ve durma kayıtları burada kalır. Havuz başına php_admin_value[error_log] ile belirttiğiniz dosyaya o sitenin PHP kodundaki hatalar ayrıca kaydedilir. Varsayılan havuz [/var/log/php-fpm/www-error.log] dosyasına yazar.

ℹ️ 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İnsan olduğunuzu kanıtlayın: 1   +   2   =