Nginx ve PHP-FPM Entegrasyonu Nasıl Yapılır?
Nginx ve PHP-FPM konfigürasyonu ile web sitenizin performansını zirveye taşıyın. Adım adım kurulum, optimizasyon ve sorun giderme rehberi ile sunucunuzu hızlandırın.
Günümüz web dünyasında hız ve performans, kullanıcı deneyiminin ve arama motoru optimizasyonunun (SEO) en kritik bileşenleri haline gelmiştir. Özellikle dinamik içerik sunan PHP tabanlı web sitelerinde, sunucu kaynaklarının verimli kullanılması büyük önem taşır. Geçmişte sıkça kullanılan Apache ve mod_php ikilisi, yüksek trafik altında hantal kalması sebebiyle yerini daha modern çözümlere bırakmıştır. İşte tam bu noktada, olay güdümlü (event-driven) mimarisiyle öne çıkan Nginx ve PHP dosyalarını yüksek performansla işleyen PHP-FPM (FastCGI Process Manager) devreye girmektedir. Bu rehberde, Nginx ve PHP-FPM entegrasyonunu sıfırdan ele alacak, performans optimizasyonlarını inceleyecek ve gerçek dünya senaryolarıyla sisteminizi nasıl daha kararlı hale getirebileceğinizi öğreneceğiz.
Web sunucusu mimarisini optimize etmek, sadece sayfaların hızlı yüklenmesini sağlamaz; aynı zamanda sunucu maliyetlerinizi de ciddi oranda düşürür. Çünkü doğru yapılandırılmış bir Nginx ve PHP-FPM ikilisi, aynı donanım üzerinde çok daha fazla eşzamanlı isteği (concurrent request) karşılayabilir. Ancak, bu iki güçlü teknolojinin bir arada uyum içinde çalışabilmesi için doğru konfigürasyon adımlarının takip edilmesi şarttır. Hazırsanız, modern web mimarisinin kalbi sayılan bu entegrasyon sürecini tüm detaylarıyla incelemeye başlayalım.
Nginx ve PHP-FPM Teknolojilerinin Çalışma Mantığı Nedir?
Nginx, hafif yapısı ve asenkron çalışma modeli sayesinde statik dosyaları (HTML, CSS, JS, görseller) inanılmaz bir hızla sunabilen bir web sunucusudur. Ancak Nginx, Apache’nin aksine, PHP kodlarını doğrudan kendi bünyesinde işleyemez. Bu nedenle, PHP isteklerini işleyebilecek harici bir işlemciye ihtiyaç duyar. İşte bu noktada PHP-FPM, Nginx ile PHP kodları arasında bir köprü görevi üstlenir. PHP-FPM, PHP scriptlerini çalıştırmak için arka planda sürekli hazır bekleyen bir işlem havuzu (process pool) yönetir.
Nginx ve PHP-FPM arasındaki iletişim temel olarak iki farklı yöntemle gerçekleştirilir: Unix Soketleri (Unix Sockets) ve TCP/IP Soketleri (TCP Sockets). Hangi yöntemin seçileceği, sunucu mimarinize ve performans beklentilerinize göre değişiklik gösterir. Bu iki yöntemin karşılaştırmasını aşağıdaki tabloda detaylıca görebilirsiniz:
| Özellik | Unix Soket (Unix Domain Socket) | TCP/IP Soket (Network Socket) |
|---|---|---|
| Çalışma Alanı | Aynı fiziksel sunucu içinde | Farklı sunucular arasında veya yerelde |
| Performans | Çok yüksek (Daha az overhead) | Yüksek (Ağ protokolü yükü var) |
| Güvenlik | Dosya izinleri ile kolayca kısıtlanabilir | Güvenlik duvarı (Firewall) yapılandırması gerektirir |
| Ölçeklenebilirlik | Sadece tek sunucuda sınırlıdır | Yatayda kolayca ölçeklenebilir |
Özellikle tek bir sunucu üzerinde çalışıyorsanız, Unix soketlerini kullanmak ağ protokollerinin getirdiği ek yükü ortadan kaldırdığı için performans açısından çok daha avantajlıdır. Ancak, web sunucunuz ile PHP-FPM sunucunuz fiziksel olarak farklı makinelerde konumlandırılmışsa, TCP/IP soketlerini kullanmak zorunlu hale gelecektir. Bu nedenle, konfigürasyon yaparken altyapı gereksinimlerinizi doğru analiz etmeniz kritik önem taşır.
Ubuntu ve Debian Sistemlerde Nginx ve PHP-FPM Nasıl Kurulur?
Kurulum işlemine başlamadan önce, sunucumuzdaki paket listelerini güncellememiz ve mevcut paketleri en son sürümlerine yükseltmemiz gerekir. Bu işlem, hem güvenlik açıklarını kapatmak hem de uyumluluk sorunlarını önlemek adına ilk adım olarak kabul edilmelidir. Terminal üzerinden aşağıdaki komutları sırasıyla çalıştırarak süreci başlatabiliriz:
sudo apt update
sudo apt upgrade -y
Güncelleme işlemi tamamlandıktan sonra, Nginx web sunucusunu sistemimize kurabiliriz. Ubuntu ve Debian depolarında Nginx’in kararlı sürümleri varsayılan olarak yer almaktadır. Kurulum için şu komutu uyguluyoruz:
sudo apt install nginx -y
Nginx kurulumunun ardından, PHP ve PHP-FPM paketlerini kurmamız gerekmektedir. Güncel projelerin gereksinimlerini karşılamak adına PHP 8.2 sürümünü kuracağız. Bununla birlikte, modern web uygulamalarının (WordPress, Laravel vb.) sıklıkla ihtiyaç duyduğu bazı temel PHP eklentilerini de kurmak akıllıca olacaktır. Aşağıdaki komut yardımıyla PHP-FPM ve gerekli modülleri tek seferde kurabilirsiniz:
sudo apt install php8.2-fpm php8.2-cli php8.2-common php8.2-mysql php8.2-xml php8.2-curl php8.2-mbstring php8.2-zip -y
Kurulum tamamlandıktan sonra, her iki servisin de arka planda sorunsuz bir şekilde çalıştığından ve sistem başlangıcında otomatik olarak başlatılacağından emin olmalıyız. Servis durumlarını kontrol etmek ve etkinleştirmek için şu komutları kullanabiliriz:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm
Sonuç olarak, temel bileşenlerimiz artık sunucumuzda aktif durumdadır. Ancak, bu servislerin birbiriyle konuşabilmesi ve gelen istekleri doğru şekilde yönlendirebilmesi için konfigürasyon dosyalarında bazı düzenlemeler yapmamız gerekmektedir.
Performans İçin PHP-FPM Havuz Ayarları Nasıl Yapılandırılır?
PHP-FPM, istekleri işlemek için “havuz” (pool) adı verilen yapılar kullanır. Varsayılan havuz konfigürasyon dosyası genellikle /etc/php/8.2/fpm/pool.d/www.conf dizininde bulunur. Bu dosyayı düzenleyerek, sunucumuzun donanım kaynaklarına (özellikle RAM miktarına) uygun optimizasyonları yapabiliriz. İlk olarak, yapılandırma dosyamızı bir metin editörü ile açalım:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Bu dosya içerisinde, PHP-FPM’in süreç yönetim modelini belirleyen pm (process manager) direktifini göreceksiniz. Varsayılan olarak dynamic olarak ayarlanan bu değeri, yüksek trafikli ve sadece PHP uygulamalarına ayrılmış sunucularda static olarak değiştirmek performansı artırabilir. Ancak, paylaşımlı veya düşük kaynaklı sunucularda dynamic veya ondemand modelleri daha güvenlidir. Biz bu rehberde dinamik yapıyı optimize edeceğiz. Dosya içerisindeki kritik parametreleri şu şekilde güncelleyebilirsiniz:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
Bu parametrelerin ne anlama geldiğini bilmek, doğru ayarları yapabilmeniz açısından son derece önemlidir. Örneğin, pm.max_children değeri, aynı anda oluşturulabilecek maksimum PHP sürecini ifade eder. Her bir PHP sürecinin ortalama 30-40 MB RAM tükettiğini varsayarsak, 2 GB boş RAM’e sahip bir sunucuda bu değeri güvenle 50 civarında tutabiliriz. Formül basitçe şu şekildedir: (Toplam Kullanılabilir RAM – Sistem Kaynakları) / Ortalama PHP Süreç Boyutu.
Ek olarak, pm.max_requests parametresi de oldukça kritiktir. PHP süreçleri zamanla bellek sızıntısına (memory leak) yol açabilir. Bu parametre yardımıyla, belirlenen istek sayısına (örneğin 500) ulaşan her bir sürecin otomatik olarak sonlandırılıp yeniden başlatılmasını sağlayarak bellek şişmelerinin önüne geçebiliriz. Ayarları yaptıktan sonra dosyayı kaydedip çıkın ve PHP-FPM servisini yeniden başlatın:
sudo systemctl restart php8.2-fpm
Nginx Sunucu Bloğu PHP-FPM İle Nasıl Bağlanır?
PHP-FPM tarafındaki hazırlıklarımızı tamamladıktan sonra, şimdi Nginx’e gelen PHP isteklerini bu havuz yapısına nasıl yönlendireceğini söylememiz gerekiyor. Bunun için Nginx’in sunucu bloklarını (Server Blocks) yapılandıracağız. Varsayılan konfigürasyon dosyasını düzenlemek yerine, sitemiz için temiz bir yapılandırma dosyası oluşturalım:
sudo nano /etc/nginx/sites-available/web-sitem.conf
Açılan boş dosyaya, hem güvenliği hem de yüksek performansı gözeten aşağıdaki örnek sunucu bloğu konfigürasyonunu ekleyin:
server {
listen 80;
server_name web-sitem.local;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_read_timeout 150;
}
location ~ /\.ht {
deny all;
}
}
Bu konfigürasyonda dikkat edilmesi gereken en önemli yer fastcgi_pass satırıdır. Burada PHP-FPM’in dinlediği Unix soket yolunu tam olarak belirtmeliyiz. Eğer PHP-FPM sürümünüz farklıysa (örneğin PHP 8.1 veya 8.3), bu yolu kendi sürümünüze göre güncellemeyi unutmamalısınız. Ayrıca, try_files direktifi sayesinde, gelen isteklerin öncelikle fiziksel bir dosya olup olmadığı kontrol edilir; eğer dosya yoksa istek güvenli bir şekilde ana PHP dosyasına (genellikle index.php) yönlendirilir. Bu yapı, modern PHP framework’lerinin (Laravel, Symfony) ve CMS’lerin (WordPress) yönlendirme mekanizmaları için hayati önem taşır.
Oluşturduğumuz bu yeni konfigürasyon dosyasını aktif hale getirmek için sites-enabled dizinine bir sembolik bağ (symlink) oluşturmamız gerekir. Sonrasında ise Nginx konfigürasyonunda herhangi bir yazım hatası olup olmadığını test etmeliyiz:
sudo ln -s /etc/nginx/sites-available/web-sitem.conf /etc/nginx/sites-enabled/
sudo nginx -t
Eğer test sonucu başarılı (syntax is ok / test is successful) dönerse, değişikliklerin devreye girmesi için Nginx servisini yeniden yükleyebiliriz:
sudo systemctl reload nginx
Entegrasyonun Test Edilmesi ve Doğrulanması
Yaptığımız tüm bu ayarların sorunsuz çalıştığını doğrulamak için web dizinimizde basit bir PHP test dosyası oluşturabiliriz. Varsayılan web kök dizini olan /var/www/html klasöründe info.php adında bir dosya oluşturalım:
sudo nano /var/www/html/info.php
Dosyanın içerisine sadece aşağıdaki PHP kodunu ekleyin ve kaydedip kapatın:
<?php
phpinfo();
?>
Şimdi tarayıcınızı açarak sunucunuzun IP adresini veya tanımladığınız alan adını yazıp bu dosyaya erişmeyi deneyin (örneğin: http://web-sitem.local/info.php). Karşınıza PHP’nin sürümünü, aktif modüllerini ve en önemlisi “Server API” kısmında FPM/FastCGI yazdığını gösteren detaylı bir sayfa çıkmalıdır. Bu sayfayı görüyorsanız, entegrasyon başarıyla tamamlanmış demektir.
Güvenlik Uyarısı: Test işleminiz bittikten sonra bu info.php dosyasını sunucunuzdan kesinlikle silmelisiniz. Çünkü bu dosya, kötü niyetli kişilerin sunucunuzun donanımı, PHP yapılandırması ve yüklü modülleri hakkında detaylı bilgi edinmesine yol açarak ciddi bir güvenlik riski oluşturur. Dosyayı silmek için şu komutu kullanabilirsiniz:
sudo rm /var/www/html/info.php
Yüksek Trafikli Bir E-Ticaret Sitesinde PHP-FPM Optimizasyonu: Vaka Analizi
Konfigürasyonun teorik kısmını tamamladık, ancak gerçek hayatta karşılaşabileceğimiz senaryoları analiz etmek, konunun pekişmesi açısından son derece değerlidir. Bu bölümde, büyük bir kampanya döneminde çökme noktasına gelen hayali bir e-ticaret sitesinin kurtarılma hikayesini inceleyeceğiz.
Arka Plan ve Sorun: Müşterimiz, 8 vCPU ve 16 GB RAM’e sahip bir bulut sunucu üzerinde Magento tabanlı bir e-ticaret sitesi işletiyordu. Kara Cuma (Black Friday) kampanyasının başladığı ilk dakikalarda, sitede aşırı yavaşlama meydana geldi ve ardından kullanıcılar “502 Bad Gateway” ve “504 Gateway Timeout” hatalarıyla karşılaşmaya başladı. Sunucu kaynakları incelendiğinde işlemci kullanımının %100’e ulaştığı, ancak RAM kullanımının henüz %40 seviyelerinde olduğu görüldü.
Teşhis: Yapılan detaylı log incelemelerinde, Nginx hata loglarında "upstream sent too big header while reading response header from upstream" ve PHP-FPM loglarında "server reached pm.max_children setting, consider raising it" uyarıları tespit edildi. Varsayılan ayarlarda bırakılan PHP-FPM havuzundaki pm.max_children değeri sadece 20 olarak yapılandırılmıştı. Bu durum, aynı anda sadece 20 PHP isteğinin işlenebilmesine, geri kalan yüzlerce kullanıcının ise kuyrukta bekleyerek zaman aşımına uğramasına neden oluyordu.
Çözüm Adımları:
- İlk olarak, sunucunun 16 GB RAM kapasitesi göz önünde bulundurularak PHP-FPM süreç limitleri yeniden hesaplandı. Her bir Magento PHP sürecinin yaklaşık 80 MB RAM tükettiği belirlendi.
- İşletim sistemi ve Nginx için 4 GB pay bırakılarak, kalan 12 GB RAM tamamen PHP-FPM’e ayrıldı. Bu doğrultuda yeni limit:
12288 MB / 80 MB = 153olarak hesaplandı. Güvenlik marjı bırakılarakpm.max_childrendeğeri 130’a yükseltildi. - Nginx tarafındaki tampon bellek (buffer) boyutları artırılarak büyük header verilerinin kesintiye uğraması engellendi.
Nginx konfigürasyonuna eklenen tampon bellek ayarları şu şekilde güncellendi:
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
Sonuç: Yapılan bu optimizasyonların ardından PHP-FPM ve Nginx servisleri yeniden başlatıldı. Sunucu, kampanya süresince anlık 1500 aktif kullanıcıyı hiçbir kesinti yaşamadan, ortalama 1.2 saniyelik sayfa açılış hızıyla başarıyla asiste etti. Bu vaka analizi bizlere, varsayılan ayarların yüksek trafik altında yetersiz kalacağını ve sunucu kaynaklarına uygun dinamik hesaplamaların yapılması gerektiğini açıkça göstermektedir.
Nginx ve PHP-FPM Sorun Giderme ve Sıkça Sorulan Sorular
Sistem yöneticilerinin Nginx ve PHP-FPM entegrasyonu sırasında en sık karşılaştığı sorunları ve bunların pratik çözümlerini aşağıda bir araya getirdik.
1. “502 Bad Gateway” hatası alıyorum, ne yapmalıyım?
Bu hata, Nginx’in PHP-FPM ile iletişim kuramadığını gösterir. İlk olarak PHP-FPM servisinin çalışıp çalışmadığını kontrol edin (sudo systemctl status php8.2-fpm). Eğer servis çalışıyorsa, Nginx konfigürasyonundaki fastcgi_pass yolunun, PHP-FPM havuz dosyasındaki (www.conf) listen parametresi ile birebir eşleştiğinden emin olun. Soket dosyasının izinlerini de kontrol etmeniz gerekebilir.
2. “504 Gateway Timeout” hatasının sebebi nedir?
PHP scriptinin, Nginx’in bekleme süresinden daha uzun sürdüğünü ifade eder. Bu sorunu çözmek için hem PHP yapılandırmasındaki (php.ini) max_execution_time değerini hem de Nginx sunucu bloğundaki fastcgi_read_timeout değerini artırmanız gerekir. Örneğin, her iki değeri de 150 saniyeye ayarlayarak uzun süren veritabanı işlemlerinin yarıda kalmasını önleyebilirsiniz.
3. Unix soketi mi yoksa TCP/IP soketi mi tercih edilmeli?
Eğer Nginx ve PHP-FPM aynı sunucu üzerinde barınıyorsa, kesinlikle Unix soketi (.sock dosyası) tercih edilmelidir. Unix soketleri, TCP/IP protokolünün getirdiği ağ paketleme ve yönlendirme yüklerini bypass ederek doğrudan bellek üzerinden haberleşme sağlar. Bu da yaklaşık %5 ila %10 arasında bir performans artışı sunar.
4. PHP-FPM loglarını nasıl takip edebilirim?
Hataları anlık olarak izlemek, sorunların kaynağını bulmak için en etkili yöntemdir. Nginx hata logları için /var/log/nginx/error.log, PHP-FPM hata logları için ise genellikle /var/log/php8.2-fpm.log dosyasını terminalden takip edebilirsiniz. Canlı takip için şu komutu kullanabilirsiniz:
tail -f /var/log/nginx/error.log /var/log/php8.2-fpm.log
Sonuç olarak, Nginx ve PHP-FPM ikilisini doğru bir şekilde yapılandırmak, modern web uygulamalarınızın kararlı, hızlı ve güvenli çalışmasının anahtarıdır. Bu rehberdeki adımları uygulayarak sunucunuzun performansını optimize edebilir ve yüksek trafikli dönemleri sorunsuz bir şekilde atlatabilirsiniz.