PHP для високонавантажених систем – php-fpm

Теперішні популярні способи використання PHP у веб-сервері Apache є недостатньо ефективними і продуктивними. Більшість хостерів все ще використовують PHP як CGI аплікацію, рідше як модуль Apache. Проте сьогодні доступний набагато продуктивніший і економніший спосіб запуску PHP-скриптів – PHP-FPM – FastCGI PHP Manager. Кілька слів про нього і правильна інсталяція в Gentoo Linux – далі.

PHP-FPM (FastCGI Process Manager) – це менеджер FastCGI процесів для PHP (сайт). Він дозволяє домогтись більшої швидкодії виконання PHP-скриптів для високонавантажених сайтів, а також значної економії ресурсів сервера. FPM це, по суті, сервер, який має в своєму розпорядженні пул процесів PHP і очікує з’єднань по протоколу FastCGI. Налаштований веб-сервер, в нашому випадку – Apache, відправляє всі запити на обслуговування PHP-файлів FPM-у, який віддає їх на обробку одному з PHP-процесів в пулі.

Таким чином досягається значна швидкодія при опрацюванні запитів на виконання PHP-скриптів, бо, на відміну від класичної схеми CGI, бінарний PHP не треба постійно запускати і ініціалізувати при кожному запиті. Також підхід додає гнучкості порівняно з “стандартним” підходом FastCGI, який, власне, дозволяє запускати CGI аплікації достатньо ефективно, але немає додаткових переваг FPM, який розроблений спеціально для PHP.

Також підхід дозволяє економити оперативну пам’ять сервера через відокремлення PHP та статичної частини контенту веб-сервера. При використанні даної технології Апач забирає досить мало ОЗУ для обробки статичних запитів, а пам’ять необхідна PHP виділяється тільки PHP-процесам, які в подальшому можуть її звільнити.

Більше інформації про FPM можна почерпнути на офіційному сайті, а також нагугливши численні статті і пости в Мережі. PHP з версії 5.3.3 має підтримку FPM “з коробки”, якшо у вас більш рання версія – її треба патчити. Тепер про інсталяцію і налаштування.

Таке враження, що всі хав-ту у Вебі зроблені для тих, хто раніше мав справу або з FastCGI підходом, або з Nginx чи іншими веб-серверами з подібною моделлю і не враховують деяких дрібних нюансів конфігурації, які є досить простими, але не є інтуїтивно-зрозумілими для тих розробників чи адміністраторів, які раніше щасливо жили з mod_php або CGI-версією PHP.

Інструкції стосуються дистрибутиву Gentoo, але з успіхом можуть бути застосовані на інших дистрибутивах.

Перш за все нам треба змерджити PHP з USE=”fpm”. В /etc/portage/package.use прописуємо:

dev-lang/php   fpm

Далі встановлюємо PHP:

emerge php

Стартуємо PHP-FPM і додаємо його в run-level за замовчуванням для автозапуску:

/etc/init.d/php-fpm start
rc-update add php-fpm default

Далі треба змерджити Апачі, для кращих результатів продуктивності/використання ресурсів Апача і не тільки – додаємо в /etc/make.conf до USE прапорець threads.

emerge apache

Насутпний – модуль Apache для підтримки FastCGI – mod_fastcgi. Для даного веб-сервера є також альтернативна реалізація – mod_fcgi, яка, проте, не підтримує необхідну для PHP-FPM директиву конфігурації.

emerge mod_fastcgi

Після інсталяції mod_fastcgi додаємо в конфігурацію даного модуля ( /etc/apache2/modules.d/20_mod_fastcgi.conf ) наступні стрічки:

FastCGIExternalServer /var/www/localhost/cgi-bin/php5-fcgi -host 127.0.0.1:9000
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /cgi-bin/php5-fcgi

Конфігурація досить специфічна (як для людини, яка раніше не мала справи з FastCGI під Apache) – /var/www/localhost/cgi-bin/php5-fcgi – це фейковий, неіснуючий обробник для скриптів, які мають передаватись до виконання по FastCGI до PHP-FPM. Сам файл обробник не повинен існувати, а от директорія, в якій він ніби-то розміщений має бути дійсною та ще й доступною з веб. Дуже хитро – довго ламав голову, що у мене не так.. 🙂

До речі, у випадку багатохостової конфігурації для кожного з хостів обов’язково повинна бути прописана директива ScriptAlias /cgi-bin/ “/var/www/localhost/cgi-bin/”, бо інакше /cgi-bin/php5-fcgi для кожного домену буде резолвитись в іншу директорію і підтримка FastCGI буде працювати тільки для localhost.

Параметр -host вказує на хост і порт нашого “зовнішнього” FastCGI-сервера – по замовчуванню PHP-FPM підвішується на localhost, порт 9000.

Для того, щоб Апачі стартував із підключеним mod_fastcgi в Gentoo в /etc/conf.d/apache2 до APACHE2_OPTS вкінці дописуємо “-D FASTCGI” – це дозволить завантажити модуль FastCGI і підключити відповідні його налаштування.

Після цих маніпуляцій можна стартувати Апач і додати його в default run-level:

/etc/init.d/apache2 start
rc-update add apache2 default

Закиньте де-небудь в веб-корінь вашого веб-серверу php-файл із phpinfo() і переконайтесь, що все працює. Вітаю – ваш PHP тепер готовий до високих навантажень. Сподіваюсь ваші скрипти також 🙂 Удачі!

Оновлено 23.01.2010: Додав зауваження щодо virtual hosts конфігурацій.

Ділись:

2 thoughts on “PHP для високонавантажених систем – php-fpm”

  1. Кльовий птсо. Кльова подача матеріалу. Українською мовою. Короче, Ваня, ти молодець!

Leave a Reply

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