Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-php5-and-php-fpm-for-nginx

Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 4. Установка и настройка PHP и PHP-FPM

В этой части мы произведём установку пакетов PHP5 и его модулей необходимых для работы наших сайтов. В качестве альтернативы веб-серверу Apache будет использован пакет PHP-FPM (PHP-FastCGI Process Manager).


Установка PHP и PHP-FPM

Установим PHP5 и PHP-FPM через который Nginx будет работать с php-скриптами. Вместе с установкой php нам потребуется установка ряда дополнительных пакетов, которые являются модулями расширения php. Набор необходимых расширений php будет зависеть от требований движков сайтов и используемых вместе с ними всевозможных плагинов. Так, например, для определения нужных модулей php для Wordpress могут помочь ссылки:

Для определения нужных модулей php для phpBB3 может помочь ссылка: phpbb community docs - phpBB 3.1.x Install

Итак, мы определились с набором модулей php, и теперь выполняем их установку вместе с основным пакетом php5 и пакетом php5-fpm:

sudo apt-get update
sudo apt-get install php5 php5-fpm php-pear php5-mysql \
 php5-gd php5-imagick php5-curl php5-xmlrpc php5-mcrypt php5-json


Глобальные параметры сервисов PHP-FPM

Настроим глобальные параметры сервисов php-fpm.

Откроем основной файл настроек php-fpm - php-fpm.conf

sudo nano /etc/php5/fpm/php-fpm.conf

Убедимся в том, что в файле раскомментирована строка подключения конфигурационных файлов из подкаталога pool.d:

/etc/php5/fpm/php-fpm.conf
;
include=/etc/php5/fpm/pool.d/*.conf
;

Это гарантирует запуск отдельных пулов php-fpm, которые мы в дальнейшем сделаем. Подразумевается, что под каждый отдельный сайт мы будем использовать свой пул с отдельным сокетом и пользователем/группой имеющими право записи в этот сокет. Это позволит нам разграничить сайты между собой с точки зрения безопасности и даст возможность видеть какой сайт какую нагрузку оказывает на систему, так как каждый отдельный пул php-fpm будет работать в виде отдельного процесса.

Настройки параметров emergency_restart_threshold, emergency_restart_interval и process_control_timeout по умолчанию выключены, но можно встретить рекомендации их включения. Ниже приведённый пример означает, что если 10 дочерних процессов php-fpm завершатся с помощью SIGSEGV или SIGBUS, то php-fpm перезагрузится через 1 минуту, а дочерним процессам установлен лимит времени реакции на сигнал от мастера в 10 секунд:

/etc/php5/fpm/php-fpm.conf
;
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
;

Прочие параметры файла php-fpm.conf в большинстве случаев можно оставить в конфигурации по умолчанию.

Для вступления изменённых параметров в силу перезапустим службу php5-fpm:

sudo service php5-fpm restart


Глобальные параметры PHP для всех пулов PHP-FPM

Одной из приятных особенностей php-fpm является то, что каждый отдельный пул может использовать собственные кастомизированные настройки конфигурации php (php.ini). То есть, как я понял, по умолчанию все пулы используют общий файл настроек /etc/php5/fpm/php.ini, но настройки этого файла при необходимости могут быть переопределены индивидуальными настройками в конфигурационном файле любого из пулов.

Отредактируем глобальные параметры php для всех пулов php-fpm:

sudo nano /etc/php5/fpm/php.ini

Сам по себе файл php.ini имеет множество параметров. Здесь приведены фрагментарные выдержки из этого файла только для тех параметров которые может потребоваться поменять в зависимости от потребностей ваших сайтов:

/etc/php5/fpm/php.ini
;
; Раскомментировать и перевести в 0
; Для устранения опасности неправильно трактования (и возникающей уязвимости) 
; запросов вида "/image.gif/foo.php"
;
cgi.fix_pathinfo=0

; Если требуется загрузка/выгрузка больших файлов, то нужно увеличить лимиты
; Например до 256MB 
; Значения по умолчанию: 8M для post_max_size и 2M для upload_max_filesize
;
post_max_size = 256M
upload_max_filesize = 256M

; Запретить использование короткой формы записи тегов, т.е. <?, а не <?php.
; Значение по умолчанию: On
;
short_open_tag = Off

; Отключен показ ошибок. Может быть полезен лишь при отладке скриптов 
; и понижает безопасность системы в продуктивных средах
; Значение по умолчанию: On для первого и Off для второго
;
display_errors = Off
display_startap_errors = Off

; Отключить запись последней произошедшей ошибки в переменную $php_errormsg
; Значение по умолчанию: Off
;
track_errors = Off

Прочие параметры файла php.ini в большинстве случаев можно оставить в конфигурации по умолчанию.

Для вступления изменённых параметров в силу перезапустим службу php5-fpm:

sudo service php5-fpm restart


Подключение модулей PHP

Посмотреть какие модули php будут загружаться можно в каталоге /etc/php5/fpm/conf.d Доступные для загрузки модули можно найти в каталоге /etc/php5/mods-available/ Большинство модулей подключаются автоматически при установке. Пример подключения модуля вручную

sudo ln -s /etc/php5/mods-available/mcrypt.ini /etc/php5/fpm/conf.d/20-mcrypt.ini

Для вступления изменённых параметров в силу перезапустим службу php5-fpm:

sudo service php5-fpm restart


Настройка пулов PHP-FPM

Дефолтный пул в файле sudo nano /etc/php5/fpm/pool.d/www.conf. Если планируется запуск всего одного сайта, то можно ограничиться настройкой файла www.conf. В нашем случае сайтов планируется к использованию несколько. Создадим отдельные пулы под разные сайты скопировав их из дефолтного, затем удалим дефолтный:

sudo cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/php-fpm-pool-root.conf 
sudo cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/php-fpm-pool-blog.conf
sudo cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/php-fpm-pool-forum.conf
sudo cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/php-fpm-pool-wiki.conf
sudo rm /etc/php5/fpm/pool.d/www.conf

Перед настройкой пулов нужно определиться с выбором типа сокета для работы пулов. Есть два варианта:

  • Unix-сокет (по умолчанию /var/run/php5-fpm.sock)
  • TCP-сокет (по умолчанию 127.0.0.1:9000)

Чтобы определиться с тем, какой тип сокета выбрать можно поизучать всяческие дебаты по этому поводу, например:

Я остановил свой выбор на Unix-сокете, так как по полученной информации пришёл к выводу, что в рамках локальной системы он несколько более производителен, чем TCP-сокет.

Для того, чтобы каждый отдельный сайт использовал свой сокет, создадим в системе пользователей, которые будут управлять данным сокетом и включим их в одноимённую группу:

sudo groupadd www-pool-root
sudo useradd -g www-pool-root www-pool-root

sudo groupadd www-pool-blog
sudo useradd -g www-pool-blog www-pool-blog

sudo groupadd www-pool-forum
sudo useradd -g www-pool-forum www-pool-forum

sudo groupadd www-pool-wiki
sudo useradd -g www-pool-wiki www-pool-wiki

Пример конфигурационного файла пула под один из сайтов (блог Wordpress) /etc/php5/fpm/pool.d/php-fpm-pool-blog.conf (отображены только изменённые или добавленные параметры конфига)

/etc/php5/fpm/pool.d/php-fpm-pool-blog.conf
[php-fpm-pool-blog]
 
# Пользователь запуска пула
user = www-pool-blog
 
# Группа запуска пула			
group = www-pool-blog
 
# Расположение сокета			
listen = /var/run/php5-fpm-blog.sock
 
# Очередь клиентских подключений
listen.backlog = 65535
 
# Права назначаемые на файл сокета	
listen.owner = www-pool-blog
 
# Права назначаемые на файл сокета 
# Должна быть указана основная группа пользователя, 
# от имени которого стартует nginx
listen.group = www-data
 
# Права назначаемые на файл сокета
listen.mode = 0660
 
# Очередь запросов для каждого дочернего процесса внутри пула.
# Помогает предотвратить утечки памяти при использовании сторонних библиотек.
# По умолчанию 0, то есть неограничено.
pm.max_requests = 500
 
# Ограничение выполнения файлов по расширению имени
security.limit_extensions = .php
 
# Переопределение глобальных параметров PHP. 
# Запрет вызова запуска Linux-команд и функции PHP allow_url_fopen
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off

Все прочие параметры, касающиеся тюнинга производительности пула оставляем в значениях по умолчанию. Помимо указанных параметров, при необходимости, можно изменять глобальные параметры php.ini в разных конфигурационных файлах пулов php-fpm (в приведённом выше примере это два последних параметра).

Пример конфигурационного файла пула под другой сайт (форум phpBB) /etc/php5/fpm/pool.d/php-fpm-pool-forum.conf (отображены только изменённые или добавленные параметры конфига). В целом параметры аналогичны вышеприведённому примеру и этот пример приведён лишь для того, что бы были понятны отличия для настройки пулов под разные сайты.

/etc/php5/fpm/pool.d/php-fpm-pool-forum.conf
[php-fpm-pool-forum]
user = www-pool-forum
group = www-pool-forum
listen = /var/run/php5-fpm-forum.sock
listen.backlog = 65535
listen.owner = www-pool-forum
listen.group = www-data
listen.mode = 0660
pm.max_requests = 500
security.limit_extensions = .php
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off

При таких настройках пулов, в группу вида www-data должен будет входить пользователь, от имени которого будет работать nginx, и более того, эта группа должна являться основной для этого пользователя.

После редактирования конфигурационных файлов пулов, для вступления изменений в силу, перезагрузим php-fpm:

sudo service php5-fpm restart

Служба должна перезапуститься без ошибок, а в каталоге /var/run должны появиться файлы сокетов с правильно назначенными правами доступа:

$ ls -la /var/run/php5-*.sock

srw-rw---- 1 www-pool-blog  www-data 0 Mar 23 16:38 /var/run/php5-fpm-blog.sock
srw-rw---- 1 www-pool-forum www-data 0 Mar 23 16:38 /var/run/php5-fpm-forum.sock
srw-rw---- 1 www-pool-root  www-data 0 Mar 23 16:38 /var/run/php5-fpm-root.sock
srw-rw---- 1 www-pool-wiki  www-data 0 Mar 23 16:38 /var/run/php5-fpm-wiki.sock

Как видим, сокеты созданы и теперь можно переходить к установке и настройке nginx.

Дополнительные источники информации

Обсуждение

GordanGordan, 23.02.2018 15:31
У меня не появляются файлы с сокетов

В конфиг файлах я указал путь /run/php5/php5-fpm-blog.sock

В каталоге /var не было каталога /run был только каталог ~run поэтому я указал другой пусть и создал в /run/php5 но опять же ничего не появилось.

Подскажите в чём может быть дело.
Алексей МаксимовАлексей Максимов, 07.12.2019 19:08
Чтобы понять в чём проблема, нужно смотреть лог службы php5-fpm. На имеющейся у меня сейчас под руками системе Debian 9 каталог /var/run фактически является линком на /run, поэтому теоретически нет разницы в том, какой каталог указывать в конфигурации.
Ваш комментарий:
 
unix-linux/ubuntu/ubuntu-14-04-lts-trusty-tahr/how-to-install-lemp-web-server-on-ubuntu-14-04/setup-php5-and-php-fpm-for-nginx.txt · Последнее изменение: 28.03.2016 19:38 — Алексей Максимов

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki