Meerdere PHP versies op CentOS 7

  • by Johan
  • 07/03/2019
  • 0 Comments

Apache is al jaren de driver voor PHP (op mijn machines en setups) en dat wil ik zo behouden.
Ik maak nog steeds geen gebruik van CPANEL of Plesk. Deze tools zorgen ervoor dat je heel wat instellingen kan aanpassen tbv NGINX en Apache (en firewall en backup), maar ik vind het zo overkill en enorm lomp om te gebruiken dat ik het nog steeds handmatig codeer.

In tijden van Yaml files vind ik the good old fashioned config files nog steeds het snelst (aan te passen en te lezen).

Een reverse proxy kennen we ondertussen ook al goed. Maar hier gaan we nog een level dieper.

Het eerste component is een NGINX webserver, daarachter staat via een reverse proxy een Apache die via een proxy PHP zal uitvoeren.

We hebben gekozen voor FastCGI Process Manager (voor PHP) of kortweg FPM.

Dit laat ons het volgende toe (de belangrijkste).

  • Herstarten op een gecontroleerde (gracefull) manier
  • Mogelijkheid om proces meerdere keren te starten onder verschillende gebruikers en zelfs met aparte php.ini configuraties
  • stdout en stderr logs
  • versnelde upload ondersteuning
  • Aparte log voor ‘slowlog’ (pagina’s die heel traag gaan)

Installatie op CentOS 7

We gaan gebruik maken van de Remi repo

cd /tmp
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
subscription-manager repos --enable=rhel-7-server-optional-rpms

We kiezen voor PHP versie 7.3 en enkele veel gebruikte extra’s

yum install php73 -y
yum install php73-php-fpm -y
yum install php73-php-runtime -y
yum install php73-php-mysqlnd -y
yum install php73-php-common -y
yum install php73-php-json -y
yum install php73-php-mbstring -y
yum install php73-php-pecl-zip -y
yum install php73-php-pdo -y
yum install php73-php-xml -y
yum install php73-php-cli -y
yum install php73-php-gd -y
yum install php73-php-soap -y

Uiteraard kan dit op 1 lijn geschreven worden. yum install php73 php73-php-fpm ….. -y

Het starten van het proces

systemctl restart php70-php-fpm

Wanneer niks aangepast wordt dan zal dit wellicht draaien onder de gebruiker/groep apache:apache.
Dit kan echter allemaal aangepast worden in de configuratie bestand(en).

Standaard wordt er één configuratie bestand voorzien die www.conf is genoemd. Open dit en kijk eens naar de verschillende settings

vi /etc/opt/remi/php70/php-fpm.d/www.conf

Hierin zie je o.a. de user en group. PHP settings kan je ook hier aanpassen (overrulen) via php_value[php.ini setting] = waarde

user = www-data
group = www-data
php_value[short_open_tag] = On 

Maar er is veel meer, want als je kijkt naar /etc/opt/remi/php70/php-fpm.conf dan zie je deze regel

include=/etc/opt/remi/php70/php-fpm.d/*.conf

Dit betekent dus dat je meerdere configuratie bestanden kan zetten in de php-fpm.d folder
Belangrijk in de verschillende configuraties is de section (header) zie bv de www.conf file

; pool name ('www' here)
[www]

Voor de config van een ander bestand moet je www vervangen door iets anders.

Ook heel belangrijk is de ‘listen’ setting.
Ieder proces zal je straks vanuit Apache willen aanspreken. Stel een soort van strategie op welke poorten je gaat gebruiken voor welke configuratie.
Een eenvoudige setup kan bv zijn
poort 9070 voor PHP versie 7.0
poort 9071 voor PHP versie 7.1

poort 9060 voor PHP 7.0 speciale config voor gebruiker www-data

listen = 127.0.0.1:9060

Koppeling naar Apache

In je VirtualHost (in Apache) gaan we de .php pagina’s doorsturen naar het gewenste proces. bv het bovenstaande voorbeeld verder volgend. Indien we PHP 7.0 wensen te gebruiken met die speciale config:

<VirtualHost>
....
  <FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9060"
  </FilesMatch>

Herstart je apache, en kijk of dit is gelukt. Maak desnoods een php pagina met <?php phpinfo(); om te zien welke versie er geladen werd.

Je kan ook vanuit NGinx FPM runnen, waardoor je Apache kan over slaan. Ik doe dit niet.

Tags: , ,

Leave a Reply

Your email address will not be published. Required fields are marked *