PHP-FPM + Nginx

В один прекрасный день было решено отказаться от бекенда в роли которого выступал Apache2 с mod_php. Проблемы с зависанием скриптов, отсутствие возможности нормального дебага, плюс ко всему какой-то скрипт начал валить весь apache. Решено было опробовать php5-fpm, единственное что теряем, это .htaccess
Пакет ставится из репозитория:
apt-get install php5-fpm
После чего необходимо настроить пулы, которые позволяют задать настройки пхп, логи, порты, сокеты, пользователя и много другое.
Пулы лежат в /etc/php5/fpm/pool.d, сразу после установки там есть www.conf. На основе его можно составить свой, конфиг хорошо документирован.
/etc/php5/fpm/pool.d/example.com
; Название пула
[example.com]  
; Пользователь и группа для процесса
user = www-data 
group = www-data 
; Сокет, для каждого пула свой
listen = /var/run/php5-fpm-example.com.sock
; Пользователь и группа для сокета
listen.owner = www-data
listen.group = www-data 
; Режим создания дочерних процессов:
;       static   -       фиксированное число процессов (pm.max_children)
;       dynamic  -       процессы будут создаваться динамически в зависимости от нагрузки.
;                        всегда будет существовать хоть один процесс.
;                        pm.max_children - максимальное число процессов;
;                        pm.start_servers - количество процессов создаваемых при старте;
;                        pm.min_spare_servers - минимальное число простаивающих процессов;
;                        pm.max_spare_servers - максимальное число простаивающих процессов.
;       ondemand -       дочерние процессы не создаются при запуске, а только при обработке
;                        входящих соединений:
;                        pm.max_children - максимальное число процессов;
;                        pm.process_idle_timeout - время в секундах после чего простаивающий процесс будет удалён.
;                        pm.max_requests - количество обработаных запросов, после которых процессы php-fpm будут перезагружены
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 10s
pm.max_requests = 500
; Перенаправлять вывод процесса в лог
catch_workers_output = yes
; Если скрипт выполняется больше указанного времени, писать отладочную инфу в slowlog
request_slowlog_timeout = 3
; Убивать все что выполняется больше указанного времени
request_terminate_timeout = 15
; Логи
access.log = /var/log/fpm-php/$pool.access.log
; Лог-файл для медленных запросов
slowlog = /var/log/fpm-php/$pool.log.slow
; С помощью директивы php_admin_value можно изменять глобальные настройки php
php_admin_value[memory_limit] = 100M
После надо создать каталог для логов и запустить php5-fpm
mkdir /var/log/fpm-php && /etc/init.d/php5-fpm start
Смотрим сокеты:
netstat -lx
где:
l — listening
x — unix
Должен появиться наш php5-fpm-example.com.sock
Далее следует установка и настройка nginx Я nginx беру с официальной репы
Загрузка и добавление ключа
wget -O - http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
Добавить в /etc/apt/sources.list
deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx
И установить
apt-get update
apt-get install nginx

Далее приведу минимальный конфиг
/etc/nginx/conf.d/example.com.conf
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    location / {
        index  index.php;
    }
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php5-fpm-example.com.sock;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        }
}