Takip et

CentOS 8 Üzerinde Apache ve PHP-FPM Kullanarak Tek Sunucuda Birden Fazla PHP Sürümü Çalıştırma

CentOS 8 Üzerinde Apache ve PHP-FPM Kullanarak Tek Sunucuda Birden Fazla PHP Sürümü Çalıştırma Giriş Modern web geliştirme dünyasında, fa

CentOS 8 Üzerinde Apache ve PHP-FPM Kullanarak Tek Sunucuda Birden Fazla PHP Sürümü Çalıştırma

Giriş

Modern web geliştirme dünyasında, farklı projelerin farklı PHP sürümlerine ihtiyaç duyması sık karşılaşılan bir durumdur. Bir web sunucusu üzerinde eski bir PHP sürümüyle çalışan bir uygulama bulunurken, aynı sunucuda geliştirilen yeni bir projenin en güncel PHP sürümünü gerektirmesi veya farklı PHP versiyonlarında testler yapma ihtiyacı doğabilir. Bu durum, sunucu yöneticileri ve geliştiriciler için önemli bir zorluk teşkil eder. Geleneksel olarak, tek bir sunucuda birden fazla PHP sürümünü sorunsuz bir şekilde çalıştırmak karmaşık konfigürasyonlar ve potansiyel çakışmalar anlamına gelebilirdi. Ancak, Apache HTTP Sunucusu ve PHP-FPM (FastCGI Process Manager) kombinasyonu sayesinde bu sorun, izole edilmiş ve yönetilebilir bir şekilde çözülebilir.

Bu makalede, CentOS 8 işletim sistemi üzerinde Apache ve PHP-FPM kullanarak tek bir sunucuda birden fazla PHP sürümünü nasıl çalıştıracağınızı adım adım detaylı bir şekilde açıklayacağız. Bu kurulum, her web sitesinin veya uygulamanın kendi PHP sürümünü kullanmasına olanak tanıyarak hem esneklik hem de istikrar sağlar. Makale boyunca, gerekli bileşenlerin kurulumundan sanal host konfigürasyonlarına, sık karşılaşılan sorunların giderilmesinden en iyi uygulamalara kadar geniş bir yelpazede bilgi sunulacaktır. Amacımız, CentOS 8 üzerinde çoklu PHP ortamı kurmak isteyen sistem yöneticileri ve geliştiriciler için kapsamlı ve anlaşılır bir rehber sunmaktır.

Ön Koşullar

Bu rehbere başlamadan önce aşağıdaki ön koşulların yerine getirildiğinden emin olun:

  • CentOS 8 veya Stream kurulu, güncel bir sunucu.
  • Root erişimi veya sudo yetkilerine sahip bir kullanıcı.
  • Temel Linux komut satırı bilgisi.
  • Apache HTTP Sunucusu (httpd) kurulu ve çalışır durumda olmalıdır.
  • Sunucunun güvenlik duvarında (firewall) HTTP (80) ve HTTPS (443) portları açık olmalıdır.

Bu ön koşullar sağlandığında, çoklu PHP kurulumuna güvenle başlayabiliriz.

Bileşenleri Anlamak: Apache, PHP-FPM ve mod_proxy_fcgi

Çoklu PHP sürümü ortamını kurarken kullandığımız ana bileşenleri ve bunların rollerini anlamak, yapılandırma sürecini daha iyi kavramamızı sağlayacaktır.

Apache HTTP Sunucusu

Apache, internetin en yaygın kullanılan açık kaynaklı web sunucularından biridir. Gelen HTTP isteklerini karşılar, web sayfalarını ve dosyaları kullanıcılara sunar. PHP ile çalışırken, Apache gelen PHP isteklerini işlemek için harici bir PHP yorumlayıcısına ihtiyaç duyar. Geleneksel olarak mod_php modülü kullanılırdı, ancak bu modül, aynı anda birden fazla PHP sürümünü çalıştırmak için uygun değildir ve performans sorunlarına yol açabilir. Bu nedenle, PHP-FPM ile birlikte Apache kullanmak daha modern ve esnek bir yaklaşımdır.

PHP-FPM (FastCGI Process Manager)

PHP-FPM, PHP yorumlayıcısı için bir FastCGI uygulamasıdır. FastCGI, web sunucusu ile harici programlar (bu durumda PHP) arasında iletişimi sağlayan bir protokoldür. PHP-FPM, her PHP sürümü için ayrı ayrı çalıştırılabilen ve kendi konfigürasyonuna sahip olabilen “havuzlar” (pools) oluşturur. Her havuz, belirli bir PHP sürümünü ve onun ayarlarını kullanarak PHP betiklerini işlemek için bir grup PHP işlemcisini yönetir. Bu sayede, farklı web siteleri veya uygulamalar, farklı PHP-FPM havuzlarına yönlendirilerek kendi PHP sürümlerini ve ayarlarını kullanabilirler. PHP-FPM, performansı artırır, kaynak yönetimini kolaylaştırır ve süreç izolasyonu sağlar.

mod_proxy_fcgi

mod_proxy_fcgi, Apache’nin bir modülüdür ve FastCGI protokolü üzerinden gelen PHP isteklerini PHP-FPM’e iletmek için kullanılır. Bu modül, Apache’nin bir proxy görevi görmesini sağlar; yani gelen bir PHP isteğini doğrudan kendisi işlemez, bunun yerine isteği belirli bir PHP-FPM havuzuna (genellikle bir Unix soketi veya TCP portu üzerinden) yönlendirir. Bu, Apache’nin PHP yorumlama yükünden kurtulmasını ve sadece istekleri doğru PHP-FPM servisine yönlendirme işini yapmasını sağlar.

Bu üç bileşen bir araya geldiğinde, Apache gelen web isteklerini alır, PHP betiklerini içeren istekleri mod_proxy_fcgi aracılığıyla uygun PHP-FPM havuzuna yönlendirir ve PHP-FPM havuzu da betiği ilgili PHP sürümüyle işleyip sonucu Apache’ye geri gönderir.

İlk Kurulum: Apache ve Temel PHP

Çoklu PHP ortamını kurmaya başlamadan önce, Apache web sunucusunu kurup temel bir PHP sürümünü ayarlayalım. Eğer sunucunuzda Apache zaten kuruluysa bu adımı atlayabilirsiniz.

Apache HTTP Sunucusunu Kurma

CentOS 8 üzerinde Apache’yi kurmak oldukça basittir:

sudo dnf install httpd -y

Kurulum tamamlandıktan sonra Apache servisini başlatın ve sistem başlangıcında otomatik olarak başlaması için etkinleştirin:

sudo systemctl start httpd
sudo systemctl enable httpd

Güvenlik duvarı ayarlarınızı kontrol edin ve HTTP (80) ile HTTPS (443) portlarının açık olduğundan emin olun:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Tarayıcınızdan sunucunuzun IP adresine veya alan adına giderek Apache’nin çalıştığını doğrulayabilirsiniz. “CentOS Linux Test Page” görmelisiniz.

Varsayılan PHP Sürümünü Kurma (İsteğe Bağlı)

Bu adım, çoklu PHP kurulumu için zorunlu değildir ancak genel bir PHP-FPM kurulumunun nasıl yapıldığını göstermek açısından faydalıdır. CentOS 8’in AppStream deposu, varsayılan olarak birkaç PHP sürümü sunar. Örneğin, PHP 7.2, 7.3, 7.4.
Mevcut PHP modüllerini listeleyin:

sudo dnf module list php

Örneğin, PHP 7.4’ü etkinleştirelim:

sudo dnf module enable php:7.4 -y

PHP-FPM ve bazı yaygın eklentileri kuralım:

sudo dnf install php-fpm php-cli php-mysqlnd php-gd php-opcache php-xml php-mbstring -y

PHP-FPM servisini başlatın ve etkinleştirin:

sudo systemctl start php-fpm
sudo systemctl enable php-fpm

Şimdi, Apache’nin bu PHP-FPM servisiyle nasıl konuşacağını yapılandırmamız gerekiyor. Apache’nin mod_proxy_fcgi modülü varsayılan olarak yüklü olmalıdır. Apache’nin ana yapılandırma dosyası (/etc/httpd/conf/httpd.conf) veya /etc/httpd/conf.d/ altındaki bir dosya içinde PHP betiklerini FastCGI aracılığıyla işlemeye yönelik bir kural eklememiz gerekir.

Örneğin, /etc/httpd/conf.d/php.conf adında yeni bir dosya oluşturabiliriz (eğer yoksa):

sudo nano /etc/httpd/conf.d/php.conf

İçine aşağıdaki içeriği ekleyin:


    SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"

Bu konfigürasyon, .php uzantılı tüm dosyaların isteğini /run/php-fpm/www.sock Unix soketi üzerinden çalışan PHP-FPM servisine yönlendirir. Bu soket, varsayılan PHP-FPM kurulumu tarafından kullanılır.
Değişiklikleri kaydettikten sonra Apache’yi yeniden başlatın:

sudo systemctl restart httpd

Şimdi /var/www/html/info.php adında bir dosya oluşturarak PHP’nin çalıştığını test edebilirsiniz:

sudo nano /var/www/html/info.php

İçeriği:

Tarayıcınızdan http://sunucu_ipadresi/info.php adresine gittiğinizde PHP bilgilerini görmelisiniz. Bu, temel PHP-FPM kurulumunun başarılı olduğunu gösterir.

Remi Deposunu Kullanarak Birden Fazla PHP Sürümü Kurulumu

CentOS 8’in varsayılan depoları belirli PHP sürümlerini sunsa da, Remi deposu daha geniş bir yelpazede, güncel ve iyi bakılan PHP sürümlerini ve eklentilerini sunar. Bu, farklı PHP versiyonlarını aynı sunucuda çalıştırmak için en iyi yaklaşımdır.

Remi Deposunu Eklemek

Öncelikle EPEL (Extra Packages for Enterprise Linux) deposunu kurmanız gerekebilir, çünkü Remi deposu EPEL’e bağımlıdır:

sudo dnf install epel-release -y

Şimdi Remi deposunu kurun:

sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y

Depoları güncelleyin:

sudo dnf update -y

Mevcut PHP Modüllerini Yönetmek

Remi deposunu etkinleştirdikten sonra, dnf module komutu ile Remi’den gelen PHP sürümlerini görebilirsiniz. Eğer daha önce AppStream’den bir PHP modülü etkinleştirdiyseniz (yukarıdaki “Varsayılan PHP Sürümünü Kurma” adımı gibi), bunu sıfırlamanız önerilir, böylece Remi’den istediğiniz sürümleri seçebilirsiniz:

sudo dnf module reset php -y

Şimdi Remi’den gelen tüm PHP modüllerini listeleyelim:

sudo dnf module list php

Bu komutun çıktısı, Remi deposundan gelen PHP 7.4, 8.0, 8.1, 8.2, 8.3 gibi farklı sürümleri gösterecektir.

Birden Fazla PHP Sürümü Kurma

Her bir PHP sürümünü ayrı ayrı kuracağız. Remi deposundaki paket adlandırma konvansiyonu, her PHP sürümü için benzersiz paket adları kullanır (örn. php80-php-fpm, php81-php-fpm). Bu, aynı anda birden fazla sürümü kurmayı mümkün kılar.

Örneğin, PHP 8.0, PHP 8.1 ve PHP 8.2’yi kuralım:

PHP 8.0 Kurulumu
sudo dnf install php80-php-fpm php80-php-cli php80-php-mysqlnd php80-php-gd php80-php-opcache php80-php-xml php80-php-mbstring -y

PHP 8.0 FPM servisini başlatın ve etkinleştirin:

sudo systemctl start php80-php-fpm
sudo systemctl enable php80-php-fpm
PHP 8.1 Kurulumu
sudo dnf install php81-php-fpm php81-php-cli php81-php-mysqlnd php81-php-gd php81-php-opcache php81-php-xml php81-php-mbstring -y

PHP 8.1 FPM servisini başlatın ve etkinleştirin:

sudo systemctl start php81-php-fpm
sudo systemctl enable php81-php-fpm
PHP 8.2 Kurulumu
sudo dnf install php82-php-fpm php82-php-cli php82-php-mysqlnd php82-php-gd php82-php-opcache php82-php-xml php82-php-mbstring -y

PHP 8.2 FPM servisini başlatın ve etkinleştirin:

sudo systemctl start php82-php-fpm
sudo systemctl enable php82-php-fpm

Artık sunucunuzda PHP 8.0, 8.1 ve 8.2 için ayrı ayrı çalışan PHP-FPM servisleri bulunmaktadır. Her bir servis, kendi php.ini dosyasına (örn. /etc/opt/remi/php80/php.ini) ve kendi FPM havuz konfigürasyonuna sahiptir.

PHP-FPM Havuzlarını Yapılandırma

Her PHP-FPM servisi, bir veya daha fazla havuz (pool) çalıştırabilir. Remi tarafından kurulan her PHP sürümü için genellikle www.conf adında varsayılan bir havuz konfigürasyonu bulunur. Bu konfigürasyon dosyaları, her PHP sürümü için ayrı dizinlerde yer alır:

  • PHP 8.0: /etc/opt/remi/php80/php-fpm.d/www.conf
  • PHP 8.1: /etc/opt/remi/php81/php-fpm.d/www.conf
  • PHP 8.2: /etc/opt/remi/php82/php-fpm.d/www.conf

Bu dosyalardaki en önemli ayar, PHP-FPM havuzunun hangi soket üzerinden dinleyeceğini belirten listen direktifidir. Remi paketleri, her sürüm için benzersiz bir Unix soket yolu kullanacak şekilde önceden yapılandırılmıştır, bu da çakışmaları önler. Örneğin:

  • PHP 8.0 için: listen = /run/php-fpm/php80-fpm.sock
  • PHP 8.1 için: listen = /run/php-fpm/php81-fpm.sock
  • PHP 8.2 için: listen = /run/php-fpm/php82-fpm.sock

Bu soket yolları, Apache’nin mod_proxy_fcgi modülü tarafından PHP isteklerini doğru PHP-FPM servisine yönlendirmek için kullanılacaktır.

Diğer önemli ayarlar şunlardır:

  • user ve group: PHP-FPM işlemlerinin hangi kullanıcı ve grup altında çalışacağını belirler. Genellikle apache veya nginx olarak ayarlanır, böylece web sunucusu ile dosya izinleri konusunda sorun yaşanmaz. Remi paketleri bunu genellikle apache olarak ayarlar.
  • pm (process manager): İşlem yöneticisi türünü belirler (örn. ondemand, dynamic, static). dynamic veya ondemand genellikle çoğu senaryo için iyi bir başlangıç noktasıdır.
  • pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers: PHP-FPM havuzundaki işlem sayısını yönetir. Bu ayarlar sunucunuzun kaynaklarına (RAM, CPU) ve beklenen yüke göre optimize edilmelidir.

Varsayılan Remi konfigürasyonları genellikle iyi bir başlangıç noktasıdır, ancak üretim ortamları için bu ayarları dikkatlice gözden geçirmeniz ve gerektiğinde optimize etmeniz önemlidir. Unix soketleri, yerel iletişim için TCP portlarına göre genellikle daha hızlı ve güvenlidir.

Apache Sanal Hostları için Çoklu PHP Sürümü Yapılandırma

Şimdi Apache’yi, her bir web sitesi veya sanal host için belirli bir PHP-FPM servisini kullanacak şekilde yapılandırmamız gerekiyor. Her sanal host için ayrı bir yapılandırma dosyası oluşturacağız.

Sanal Host Konfigürasyon Dizini Oluşturma

Apache sanal host konfigürasyonlarını düzenli tutmak için /etc/httpd/conf.d/vhosts/ gibi özel bir dizin oluşturabiliriz.

sudo mkdir -p /etc/httpd/conf.d/vhosts/

Ardından, Apache’nin bu dizindeki tüm .conf dosyalarını okumasını sağlamak için /etc/httpd/conf/httpd.conf dosyasına aşağıdaki satırı ekleyin (genellikle dosyanın sonuna):

IncludeOptional conf.d/vhosts/*.conf

Bu, /etc/httpd/conf.d/vhosts/ dizinindeki tüm .conf uzantılı dosyaların otomatik olarak Apache tarafından yüklenmesini sağlar.

Her Alan Adı için Sanal Host Oluşturma

Her bir alan adı için ayrı bir sanal host konfigürasyon dosyası ve belge kökü (document root) oluşturacağız.

Örnek 1: domain1.com (PHP 8.0 kullanacak)

Öncelikle domain1.com için belge kökünü oluşturalım:

sudo mkdir -p /var/www/domain1.com/public_html
sudo chown -R apache:apache /var/www/domain1.com
sudo chmod -R 755 /var/www/domain1.com

Şimdi sanal host konfigürasyon dosyasını oluşturalım:

sudo nano /etc/httpd/conf.d/vhosts/domain1.com.conf

İçeriği aşağıdaki gibi olacak:


    ServerName domain1.com
    ServerAlias www.domain1.com
    DocumentRoot /var/www/domain1.com/public_html

    
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    

    # PHP 8.0 için PHP isteklerini yönlendir
    
        SetHandler "proxy:unix:/run/php-fpm/php80-fpm.sock|fcgi://localhost"
    

    ErrorLog /var/log/httpd/domain1.com_error.log
    CustomLog /var/log/httpd/domain1.com_access.log combined

Bu konfigürasyonda dikkat edilmesi gereken en önemli satır SetHandler direktifidir. Bu direktif, .php uzantılı tüm dosyaların isteğini belirtilen Unix soketi (/run/php-fpm/php80-fpm.sock) üzerinden çalışan PHP 8.0 FPM servisine yönlendirir.

Örnek 2: domain2.com (PHP 8.1 kullanacak)

domain2.com için belge kökünü oluşturalım:

sudo mkdir -p /var/www/domain2.com/public_html
sudo chown -R apache:apache /var/www/domain2.com
sudo chmod -R 755 /var/www/domain2.com

Sanal host konfigürasyon dosyasını oluşturalım:

sudo nano /etc/httpd/conf.d/vhosts/domain2.com.conf

İçeriği aşağıdaki gibi olacak:


    ServerName domain2.com
    ServerAlias www.domain2.com
    DocumentRoot /var/www/domain2.com/public_html

    
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    

    # PHP 8.1 için PHP isteklerini yönlendir
    
        SetHandler "proxy:unix:/run/php-fpm/php81-fpm.sock|fcgi://localhost"
    

    ErrorLog /var/log/httpd/domain2.com_error.log
    CustomLog /var/log/httpd/domain2.com_access.log combined
Örnek 3: domain3.com (PHP 8.2 kullanacak)

domain3.com için belge kökünü oluşturalım:

sudo mkdir -p /var/www/domain3.com/public_html
sudo chown -R apache:apache /var/www/domain3.com
sudo chmod -R 755 /var/www/domain3.com

Sanal host konfigürasyon dosyasını oluşturalım:

sudo nano /etc/httpd/conf.d/vhosts/domain3.com.conf

İçeriği aşağıdaki gibi olacak:


    ServerName domain3.com
    ServerAlias www.domain3.com
    DocumentRoot /var/www/domain3.com/public_html

    
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    

    # PHP 8.2 için PHP isteklerini yönlendir
    
        SetHandler "proxy:unix:/run/php-fpm/php82-fpm.sock|fcgi://localhost"
    

    ErrorLog /var/log/httpd/domain3.com_error.log
    CustomLog /var/log/httpd/domain3.com_access.log combined

Her sanal host konfigürasyon dosyasında, ServerName ve DocumentRoot‘u kendi alan adınıza ve belge kökünüze göre ayarladığınızdan emin olun. Ayrıca, ErrorLog ve CustomLog yollarını da uygun şekilde düzenleyebilirsiniz.

Apache Konfigürasyonunu Test Etme ve Yeniden Başlatma

Tüm sanal host konfigürasyonlarını tamamladıktan sonra, Apache konfigürasyonunuzda sözdizimi hatası olup olmadığını kontrol edin:

sudo httpd -t

Eğer çıktı Syntax OK ise, Apache servisini yeniden başlatarak değişiklikleri uygulayın:

sudo systemctl restart httpd

Kurulumu Test Etme

Şimdi her alan adının doğru PHP sürümünü kullandığını doğrulamak için her belge köküne bir info.php dosyası oluşturalım.

domain1.com için (PHP 8.0):

sudo nano /var/www/domain1.com/public_html/info.php

İçeriği:

domain2.com için (PHP 8.1):

sudo nano /var/www/domain2.com/public_html/info.php

İçeriği:

domain3.com için (PHP 8.2):

sudo nano /var/www/domain3.com/public_html/info.php

İçeriği:

Şimdi tarayıcınızdan sırasıyla http://domain1.com/info.php, http://domain2.com/info.php ve http://domain3.com/info.php adreslerine gidin (bu alan adlarını /etc/hosts dosyanızda sunucunuzun IP adresine işaretlemeniz veya bir DNS kaydı oluşturmanız gerekebilir). Her bir info.php sayfasında gösterilen PHP sürümünün, o alan adı için yapılandırdığınız sürüm olduğundan emin olun.

Örneğin, http://domain1.com/info.php adresinde “PHP Version 8.0.x” görmelisiniz.
http://domain2.com/info.php adresinde “PHP Version 8.1.x” görmelisiniz.
http://domain3.com/info.php adresinde “PHP Version 8.2.x” görmelisiniz.

Eğer her şey doğru görünüyorsa, çoklu PHP sürümü kurulumunuz başarılı bir şekilde tamamlanmıştır!

Sık Karşılaşılan Sorun Giderme

Kurulum sırasında veya sonrasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:

SELinux Engellemeleri

CentOS’ta SELinux (Security-Enhanced Linux) güçlü bir güvenlik mekanizmasıdır ve bazen Apache’nin PHP-FPM soketlerine veya web sitesi dosyalarına erişmesini engelleyebilir.

  1. Apache’nin FPM soketlerine bağlanamaması: Eğer Apache hata loglarında (/var/log/httpd/error_log) proxy veya FastCGI ile ilgili bağlantı hataları görüyorsanız, SELinux’un Apache’nin harici ağ bağlantısı yapmasını engellemesi olasıdır. Bunu çözmek için:
    sudo setsebool -P httpd_can_network_connect_fpm on

    Bu komut, Apache’nin FPM soketlerine bağlanmasına izin verir.

  2. Web dizinleri için yanlış SELinux bağlamı: Eğer web sitenizde “Forbidden” hataları alıyorsanız veya PHP dosyaları işlenmiyorsa, belge kök dizinlerinizin SELinux bağlamı yanlış olabilir. Web dizinleriniz için doğru bağlamı ayarlayın:
    sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/domain1.com(/.*)?"
    sudo restorecon -Rv /var/www/domain1.com

    Bu komutları tüm belge kök dizinleriniz için tekrarlayın.

  3. Geçici olarak SELinux’u devre dışı bırakma (yalnızca sorun giderme amaçlı):
    sudo setenforce 0

    Bu komut SELinux’u geçici olarak devre dışı bırakır. Sorunu tespit ettikten sonra sudo setenforce 1 ile tekrar etkinleştirmeyi unutmayın. Üretim ortamlarında SELinux’u tamamen devre dışı bırakmak önerilmez.

Dosya İzinleri ve Sahiplik Sorunları

PHP betikleri veya web sunucusu, web sitesi dosyalarına erişemediğinde hatalar meydana gelebilir.

  • Belge kökü izinleri: Belge kökü dizinlerinin ve içindeki dosyaların web sunucusu kullanıcısı (apache) tarafından okunabilir olduğundan emin olun. Yazma izinleri yalnızca belirli dizinler (örn. yüklemeler, cache) için verilmelidir.
    sudo chown -R apache:apache /var/www/domain.com
    sudo chmod -R 755 /var/www/domain.com
  • PHP-FPM soket izinleri: PHP-FPM soketlerinin (örn. /run/php-fpm/php80-fpm.sock) web sunucusu kullanıcısı tarafından erişilebilir olduğundan emin olun. Remi paketleri genellikle bunu otomatik olarak doğru ayarlar. ls -l /run/php-fpm/ komutu ile kontrol edebilirsiniz.

Apache Sözdizimi Hataları

Apache’yi yeniden başlatırken hata alıyorsanız, konfigürasyon dosyalarınızda bir sözdizimi hatası olabilir.

sudo httpd -t

Bu komut, hatanın nerede olduğunu size söyleyecektir. Hata mesajını dikkatlice okuyun ve ilgili konfigürasyon dosyasını düzeltin.

PHP-FPM Servisleri Çalışmıyor

Eğer PHP sayfaları düzgün çalışmıyorsa ve tarayıcıda boş bir sayfa veya “502 Bad Gateway” gibi bir hata alıyorsanız, ilgili PHP-FPM servisi çalışmıyor olabilir.

sudo systemctl status php80-php-fpm

Bu komutu her PHP sürümü için çalıştırın (örn. php81-php-fpm, php82-php-fpm). Eğer servis çalışmıyorsa, sudo systemctl start php80-php-fpm ile başlatmaya çalışın ve loglarını (journalctl -xeu php80-php-fpm) kontrol ederek hatanın nedenini anlamaya çalışın.

SetHandler Yolu Yanlış

Sanal host konfigürasyonunuzdaki SetHandler direktifindeki soket yolu, PHP-FPM havuzunuzun dinlediği soket yolu ile tam olarak eşleşmelidir. Küçük bir yazım hatası bile bağlantı sorunlarına yol açabilir.

SetHandler "proxy:unix:/run/php-fpm/php80-fpm.sock|fcgi://localhost"

Bu yolun doğru olduğundan ve ilgili PHP-FPM havuzunun konfigürasyon dosyasındaki (/etc/opt/remi/php80/php-fpm.d/www.conf) listen direktifiyle aynı olduğundan emin olun.

En İyi Uygulamalar ve Dikkat Edilmesi Gerekenler

Çoklu PHP sürümü ortamınızı kurduktan sonra, güvenliği, performansı ve yönetimi sağlamak için bazı en iyi uygulamaları ve önemli noktaları göz önünde bulundurmanız faydalı olacaktır.

Güvenlik

  • PHP Sürümlerini Güncel Tutma: Kullanılan tüm PHP sürümlerini (özellikle Remi deposu aracılığıyla) düzenli olarak güncelleyin. Güvenlik açıkları genellikle yeni sürümlerde kapatılır.
  • FPM Havuzları için Farklı Kullanıcılar: Mümkünse, her PHP-FPM havuzunu farklı bir Linux kullanıcısı altında çalıştırın. Bu, bir uygulamanın güvenliğinin ihlal edilmesi durumunda diğer uygulamaların etkilenme riskini azaltır. (Remi varsayılan olarak apache kullanıcısını kullanır, bu da kabul edilebilir ancak daha yüksek izolasyon için özelleştirilebilir.)
  • open_basedir Kısıtlaması: Her PHP-FPM havuzu için open_basedir direktifini kullanarak PHP betiklerinin yalnızca kendi belge kökleri ve gerekli dizinler içinde dosyalara erişebilmesini sağlayın. Bu, dizin traversalı saldırılarını önlemeye yardımcı olur. Bu ayarı ilgili PHP sürümünün php.ini dosyasında veya FPM havuz konfigürasyonunda yapabilirsiniz.
  • disable_functions ve disable_classes: Gerekli olmayan tehlikeli PHP fonksiyonlarını ve sınıflarını devre dışı bırakın. Örneğin, exec, shell_exec, passthru, system gibi komut çalıştırma fonksiyonları çoğu web uygulaması için gerekli değildir ve kötüye kullanılabilir.
  • Apache Modüllerini Kısıtlama: Yalnızca ihtiyacınız olan Apache modüllerini etkinleştirin. Gereksiz modüller, saldırı yüzeyini artırabilir.

Performans

  • PHP-FPM Havuz Ayarlarını Optimize Etme: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers gibi PHP-FPM havuz ayarlarını sunucunuzun RAM ve CPU kapasitesine ve beklenen trafik yüküne göre ayarlayın. Yanlış ayarlar, bellek tükenmesine veya performans düşüşlerine neden olabilir.
  • Opcache Kullanımı: Tüm PHP sürümlerinde OpCache’i etkinleştirin ve doğru şekilde yapılandırın. OpCache, derlenmiş PHP kodunu bellekte önbelleğe alarak betiklerin her istekte yeniden derlenmesini önler ve performansı önemli ölçüde artırır. Remi paketleri genellikle OpCache’i otomatik olarak kurar ve etkinleştirir.
  • Apache KeepAlive: Apache’nin KeepAlive ayarlarını optimize edin. Küçük, hızlı istekler için KeepAlive‘ı etkin tutmak, bağlantı kurulum maliyetini azaltabilir.
  • Gzip Sıkıştırma: Apache’de mod_deflate kullanarak çıktı sıkıştırmayı etkinleştirin. Bu, bant genişliği kullanımını azaltır ve yükleme sürelerini hızlandırır.

Yönetim ve İzleme

  • Günlükleri İzleme: Apache hata ve erişim günlüklerini (/var/log/httpd/), ayrıca PHP-FPM hata günlüklerini düzenli olarak izleyin. Bu günlükler, sorunları tespit etmek ve performansı anlamak için kritik bilgiler içerir.
  • Kaynak Kullanımı İzleme: Sunucunuzun CPU, RAM ve disk kullanımını izleyin. Her PHP-FPM sürümü kendi kaynaklarını tüketeceğinden, kaynakların dikkatli bir şekilde yönetilmesi önemlidir. top, htop, free -h gibi komutlar veya izleme araçları kullanabilirsiniz.
  • Konfigürasyon Yönetimi: Birden fazla PHP sürümü ve sanal host ile çalışırken, konfigürasyon dosyalarını manuel olarak yönetmek karmaşık hale gelebilir. Ansible, Puppet veya Chef gibi konfigürasyon yönetim araçları kullanarak bu süreci otomatikleştirebilir ve tutarlılık sağlayabilirsiniz.
  • Yedeklemeler: Düzenli yedeklemeler alın. Konfigürasyon dosyaları, veritabanları ve web sitesi dosyaları dahil olmak üzere tüm kritik verileri yedekleyin.

Sonuç

Bu makalede, CentOS 8 üzerinde Apache ve PHP-FPM kullanarak tek bir sunucuda birden fazla PHP sürümünü nasıl çalıştıracağımızı adım adım ele aldık. Remi deposunun gücünden faydalanarak farklı PHP sürümlerini kurduk, her bir PHP sürümü için ayrı PHP-FPM servisleri yapılandırdık ve Apache sanal hostlarını bu servislere yönlendirecek şekilde ayarladık. Bu yöntem, web uygulamalarınız için yüksek esneklik, performans ve izolasyon sağlar.

Artık eski PHP sürümüne bağımlı bir uygulama ile en güncel PHP sürümünü kullanan yeni bir proje aynı sunucuda sorunsuz bir şekilde barındırılabilir. Bu kurulum, geliştirme, test ve üretim ortamları için ideal bir çözüm sunar. Unutmayın ki, her ne kadar kurulum süreci belirli adımları içerse de, sunucunuzun özel ihtiyaçlarına göre PHP-FPM havuz ayarlarını ve güvenlik önlemlerini optimize etmek kritik öneme sahiptir. Düzenli bakım, izleme ve güncellemeler, çoklu PHP ortamınızın uzun ömürlü ve güvenli olmasını sağlayacaktır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.