Пошаговые руководства, шпаргалки, полезные ссылки...
БлогФорумАвторы
Полезные Online-сервисы
Перечень Бесплатного ПО
Подписка на RSS-канал
Это старая версия документа!
В этой части мы произведём установку пакетов PHP5 и его модулей необходимых для работы наших сайтов. В качестве альтернативы веб-серверу Apache будет использован пакет PHP-FPM (PHP-FastCGI Process Manager).
Установим 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.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-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. ; Значение по умолчанию: On ; short_open_tag = Off ; Отключен показ ошибок. Может быть полезен лишь при отладке скриптов ; и понижает безопасность системы в продуктивных средах ; Значение по умолчанию: On для первого и Off для второго ; display_errors = Off display_startap_errors = Off ; Отключить запись последней произошедшей ошибки в переменную $php_errormsg ; Значение по умолчанию: Off ; track_errors = Off
Прочие параметры файла php.ini в большинстве случаев можно оставить в конфигурации по умолчанию.
Посмотреть какие модули 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
Дефолтный пул в файле 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
Перед настройкой пулов нужно определиться с выбором типа сокета для работы пулов. Есть два варианта:
Чтобы определиться с темВыбираем юникс-сокет
http://unix.stackexchange.com/questions/91774/performance-of-unix-sockets-vs-tcp-ports http://stackoverflow.com/questions/257433/postgresql-unix-domain-sockets-vs-tcp-sockets/257479#257479
Для того, чтобы каждый отдельный сайт использовал свой сокет создадим в системе пользователей, которые будут упралять данным сокетом
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
Пример конфига пула /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 # Права назначаемые на файл сокета listen.group = www-data # Права назначаемые на файл сокета (должна быть указана основная группа пользователя от имени которого стартует nginx) listen.mode = 0660 # Права назначаемые на файл сокета pm.max_requests = 500 # Очередь запросов для каждого дочернего процесса внутри пула. Помогает предотвратить утечек памяти при использовании подгружаемых сторонних библиотек. По умолчанию 0, то есть неограничено. security.limit_extensions = .php # Ограничим выполнение файлов по расширению имени php_admin_value[disable_functions] = exec,passthru,shell_exec,system # Переопределение глобальных параметров PHP. Запретим вызов запуска Linux-команд php_admin_flag[allow_url_fopen] = off # Запрещаем функцию PHP allow_url_fopen
Все прочие параметры, касающиеся тюнинга производительности пула оставляем в значениях по умолчанию. Помимо указанных параметров, при необходимости, можно изменять глобальные параметры php.ini в разных конфигурационных файлах пулов php-fpm.
Пример конфига пула /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
Служба должна перезапутситься без ошибок, а в каталоге /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
http://help.ubuntu.ru/wiki/php5 https://easyengine.io/tutorials/php/fpm-sysctl-tweaking/ PHP-FPM: Socket vs TCP/IP and sysctl tweaking http://pektop.net/2013/09/sovety-po-nastrojke-i-optimizacii-nginx-i-php-fpm/ https://www.digitalocean.com/community/tutorials/how-to-host-multiple-websites-securely-with-nginx-and-php-fpm-on-ubuntu-14-04