===== Настройка веб-сервера на базе стека 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** могут помочь ссылки:
* [[http://wordpress.stackexchange.com/questions/42098/what-are-php-extensions-and-libraries-wp-needs-and-or-uses|WordPress Development- What are PHP extensions and libraries WP needs and/or uses?]]
* [[http://www.ulduzsoft.com/2012/01/247/|UlduzSoft - Switching to WordPress]]
Для определения нужных модулей php для **phpBB3** может помочь ссылка: [[https://www.phpbb.com/community/docs/INSTALL.html|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**:
;
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 секунд:
;
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 имеет множество параметров. Здесь приведены фрагментарные выдержки из этого файла только для тех параметров которые может потребоваться поменять в зависимости от потребностей ваших сайтов:
;
; Раскомментировать и перевести в 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.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)
Чтобы определиться с тем, какой тип сокета выбрать можно поизучать всяческие дебаты по этому поводу, например:
* [[http://unix.stackexchange.com/questions/91774/performance-of-unix-sockets-vs-tcp-ports|unix.stackexchange.com - Performance of unix sockets vs TCP ports]]
* [[http://stackoverflow.com/questions/257433/postgresql-unix-domain-sockets-vs-tcp-sockets/257479#257479|stackoverflow.com - PostgreSQL UNIX domain sockets vs TCP sockets]]
Я остановил свой выбор на 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** (отображены только изменённые или добавленные параметры конфига)
[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**
(отображены только изменённые или добавленные параметры конфига). В целом параметры аналогичны вышеприведённому примеру и этот пример приведён лишь для того, что бы были понятны отличия для настройки пулов под разные сайты.
[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**.
\\
\\
==== Дополнительные источники информации ====
* [[http://help.ubuntu.ru/wiki/php5|help.ubuntu.ru - PHP 5]]
* [[http://pektop.net/2013/09/sovety-po-nastrojke-i-optimizacii-nginx-i-php-fpm/|Советы по настройке и оптимизации Nginx и PHP-FPM]]
* [[https://www.digitalocean.com/community/tutorials/how-to-host-multiple-websites-securely-with-nginx-and-php-fpm-on-ubuntu-14-04|DigitalOcean Community - How To Host Multiple Websites Securely With Nginx And Php-fpm On Ubuntu 14.04]]
----
{{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 28.03.2016 17:02
{{tag>Linux Ubuntu "Ubuntu 14.04" "14.04 LTS" "Ubuntu Server" "web server" LEMP FastCGI PHP PHP5 PHP-FPM Nginx Wordpress phpBB phpBB3 socket unix-socket }}
~~DISCUSSION~~