Należy korzystać z PHP-FPM.
Na serwerze można skonfigurować kilka sposobów serwowania skryptów PHP. Tradycyjna (i okropna) metoda polega na używaniu modułu serwera Apache mod_php. Moduł ten wiąże PHP z samym serwerem Apache, który niestety bardzo źle zarządza tym narzędziem. Przez to, gdy tylko witryna zdobędzie trochę większy ruch, zaczną się problemy z pamięcią.
Dlatego też wielką popularność zdobywają nowe metody: mod_fastcgi i mod_fcgid. Każda z nich polega na utrzymywaniu pewnej liczby działających procesów PHP, a Apache wysyła żądania do tych interfejsów z prośbą o wykonanie skryptów PHP w jego imieniu. Jako że biblioteki te ograniczają liczbę aktywnych procesów PHP, następuje redukcja zużycia pamięci bez negatywnego wpływu na wydajność.
Grupa inteligentnych osób poszła nawet o krok dalej i stworzyła implementację fastcgi specjalnie przystosowaną do jak najlepszej współpracy z PHP. Nazwali swój wynalazek PHP-FPM i stał się on już de facto standardowym rozwiązaniem.
W Apache wprowadzono też nową metodę współpracy z PHP-FPM: mod_proxy_fcgi. Niestety wersja Apache dostępna w systemie Ubuntu 14.04 ma pewne problemy z tym modułem, np. nie ma możliwości korzystania z połączeń gniazdowych, a także występują problemy z mod_rewrite oraz stronami 404 i podobnymi.
Poniższy przykład dotyczy serwera Apache 2.4.7, ale PHP-FPM działa też z innymi serwerami internetowymi, np. Nginx.
Instalowanie PHP-FPM i serwera Apache
W Ubuntu 14.04 PHP-FPM i Apache można zainstalować za pomocą poniższych poleceń terminala:
sudo apt-get install apache2-mpm-event libapache2-mod-fastcgi php5-fpm sudo a2enmod actions alias fastcgi
Zwróć uwagę na konieczność użycia apache2-mpm-event
(lub apache2-mpm-worker
), a nie apache2-mpm-prefork
ani apache2-mpm-threaded
.
Następnie należy skonfigurować hosta wirtualnego Apache tak, aby przekazywał żądania PHP do procesu PHP-FPM. Wpisz zatem poniższy kod w pliku konfiguracyjnym serwera Apache (w Ubuntu 14.04 domyślny plik konfiguracyjny to /etc/apache2/sites-available/000-default.conf).
<Directory />
Require all granted
</Directory>
<VirtualHost *:80>
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 120 -pass-header Authorization
<FilesMatch "\.php$">
SetHandler php5-fcgi
</FilesMatch>
</VirtualHost>
Na koniec zrestartuj serwer Apache i proces FPM:
sudo service apache2 restart && sudo service php5-fpm restart
Pułapki
- Zastąpienie dyrektywy
SetHandler
dyrektywąAddHandler
może być ryzykowne z punktu widzenia bezpieczeństwa. DyrektywaAddHandler
wykonuje kod PHP znajdujący się w plikach mających ciąg znaków .php gdziekolwiek w nazwie. Jeśli więc użytkownik wyśle na serwer plik niszczyciel.php.gif za pomocą formularza ze strony, to możesz przeżyć niemiłe zaskoczenie.