Administrare server open source

Platforma de hosting cu software liber, gratuit, open source.

Comentariile sunt închise pentru PHP rulat ca FastCGI in FreeBSD

Spuneam in articolul despre optimizarea Apache despre PHP rulat ca FastCGI. Pe langa consumul mai mic de RAM, care l-am mentionat, rularea PHP ca FastCGI are cateva avantaje. Inainte de a vedea cum punem totul in functiune, sa vedem care sunt acestea.

  • Conexiuni persistente – Spre deosebire de CGI, care a fost inlocuit cu succes de mod_php in cazul utilizarii PHP, FastCGI permite conexiuni persistente. Asta inseamna ca mai multe pagini pot fi interpretate de o singura instanta deschisa, ceea ce reduce mult consumul de resurse.
  • Suport suEXEC – Folosind FastCGI scripturile pot fi rulate folosind suEXEC, deci fiecare script va fi interpretat de un utilizator specificat in VirtualHost nu de un utilizator general (ex. nobody).
  • Flexibilitate – FastCGI foloseste un wrapper pentru interpretarea scripturilor, wrapper care poate fi diferit pentru fiecare VirtualHost in parte. Astfel putem limita un anumit VirtualHost la un anumit numar de procese concurente, putem impune limite de memorie, CPU etc.

Avantajele ar fi mai multe, dar cele prezentate sunt suficiente pentru a va face o imagine generala despre ce ofera in plus FastCGI fata de CGI sau mod_php.

Exista mai multe modalitati de implementare a rularii PHP ca FastCGI. Pe FreeBSD metoda preferata este utilizarea mod_fcgid. Pentru asta trebuie sa instalam din porturi www/mod_fcgid si apoi sa recompilam lang/php5 pentru a adauga suportul pentru FastCGI.

Instalare mod_fcgid

La instalare mod_fcgid nu are niciun fel de optiuni de care trebuie sa tinem cont. Trebuie doar instalat:

[root@lamp ~]# cd /usr/ports/www/mod_fcgid/
[root@lamp /usr/ports/www/mod_fcgid]# make install clean
===>  Extracting for mod_fcgid-2.3.4
=> MD5 Checksum OK for mod_fcgid-2.3.4.tar.gz.
=> SHA256 Checksum OK for mod_fcgid-2.3.4.tar.gz.
===>  Patching for mod_fcgid-2.3.4
===>  Applying FreeBSD patches for mod_fcgid-2.3.4
===>   mod_fcgid-2.3.4 depends on file: /usr/local/sbin/apxs - found
===>  Configuring for mod_fcgid-2.3.4
Configuring mod_fcgid for APXS in /usr/local/sbin/apxs
...............................................
[root@lamp /usr/ports/www/mod_fcgid]#

Dupa ce s-a instalat putem trece la pasul urmator.

Recompilare PHP

Dupa ce am instalat mod_fcgid trebuie sa instalam in PHP suportul pentru FastCGI. Pentru a face asta intram in directorul „/usr/ports/lang/php5” si rulam „make config” pentru a adauga suport CGI si FastCGI iar apoi recompilam PHP.

[root@lamp /usr/ports/www/mod_fcgid]# cd /usr/ports/lang/php5
[root@lamp /usr/ports/lang/php5]# make config

PHP FastCGI

Urmatorul pas e sa recompilam PHP iar apoi sa verificam daca suportul FastCGI a fost inclus corect:

[root@lamp /usr/ports/lang/php5]# make install clean
===>  Found saved configuration for php5-5.2.12
===>  Extracting for php5-5.2.12
=> MD5 Checksum OK for php-5.2.12.tar.bz2.
=> SHA256 Checksum OK for php-5.2.12.tar.bz2.
=> MD5 Checksum OK for suhosin-patch-5.2.11-0.9.7.patch.gz.
=> SHA256 Checksum OK for suhosin-patch-5.2.11-0.9.7.patch.gz.
..............................................................
[root@lamp /usr/ports/lang/php5]# php-cgi -i | grep fcgi
<h2><a name="module_cgi-fcgi">cgi-fcgi</a></h2>
[root@lamp /usr/ports/lang/php5]#

Incarcare mod_fcgid in Apache

Acum ca exista suport FastCGI in PHP trebuie sa incarcam in Apache modulul mod_fcgid, daca nu a fost adaugat deja la instalarea mod_fcgid. Pentru asta deschidem fisierul httpd.conf si adaugam urmatoarea linie:

LoadModule fcgid_module libexec/apache22/mod_fcgid.so

Pentru ca totul sa fie complet functional, mai avem de creat un handler pentru FastCGI care sa il asociem cu fisierele .php. Crearea handlerului se face adaugand in httpd.conf urmatoarele linii:

<ifmodule fcgid_module>
    AddHandler fcgid-script .fcgi
    <files ~(\.php)>
        SetHandler fcgid-script
    </files>
    FCGIWrapper /usr/local/bin/php-cgi .php
</ifmodule>

E important ca pe DocumentRoot din VirtualHost sa avem setat Options ExecCGI. In caz contrar fisierele .php nu vor putea fi interpretate.

Optional, in VirtualHost, putem personaliza modul in care FastCGI va fi rulat pentru a impune diverse limitari. Un exemplu este urmatorul:

<virtualhost 89.36.197.228:80>
    ServerName lamp.ro
    ServerAlias www.lamp.ro
    DocumentRoot /home/lamp/public_html
    DirectoryIndex index.php
 
    SuexecUserGroup lamp lamp
 
    <directory /home/lamp/public_html>
        Options Indexes IncludesNOEXEC FollowSymLinks ExecCGI
        AddHandler fcgid-script .php
        FcgidWrapper /home/lamp/fastcgi-bin/php .php
        Order allow,deny
        Allow from all
    </directory>
</virtualhost>

In cazul de mai sus ii spunem serverului Apache prin directiva SuexecUserGroup ca scripturile vor fi rulate de utilizatorul lamp, nu de nobody cum se intampla in cazul mod_php.

Prin directiva FcgidWrapper setam un wrapper pentru interpretarea codului, un wrapper care poate impune diverse limitari. In cazul de fata wrapperul arata asa:

#!/bin/sh
ulimit -t 60
ulimit -c 0
ulimit -u 32
umask 022
export PHPRC=/home/lamp
export SCRIPT_FILENAME=$1
exec /usr/local/bin/php-cgi

Cu ajutorul wrapperului am setat timpul maxim de executie a scriptului, numarul maxim de procese si dimensiunea pentru coredump. In mod similar, folosind comanda ulimit, putem impune alte limite de rulare pentru a ne asigura ca scripturile care folosesc acest interpretor nu vor consuma foarte multe resurse si implicit nu vor destabiliza serverul.

Dupa ce am facut toate acest modificari putem restarta serverul Apache iar mai departe toate scripturile .php vor fi rulate ca FastCGI.

Apache

Comments are closed.