От стабильной и быстрой работы сервера зависит судьба сайта. Его медленная работа и частые падения способны отпугнуть как посетителей, так и поисковые системы. Последние ещё и понизят рейтинг тормозящего сайта в результатах поиска и он окажется не в топ-10, а, скажем, в топ-100 по всем запросам.
Использование связки nginx и php-fpm для обслуживания сайтов позволяет увеличить скорость их работы, а также стабильность системы в целом. К тому же, отказавшись от использования apache, мы несколько упрощаем систему и даже защищаем её. Ведь если нет apache, то злоумышленник не сможет использовать, например, файл .htaccess для своих целей.
Связку nginx+php-fpm настраивать довольно легко и она поддерживается многими популярными CMS: WordPress, MODX, DLE, различными фреймворками. Всё это способно работать и без громоздкого apache.
При установке веб-сервера, не обойтись без создания пользователей. В идеале, для каждого сайта должен быть создан отдельный юзер. Так мы сможем защитить другие сайты, если один из пользователей будет взломан. Примеры в этой статье написаны с учётом того, что пользователей вы создали по инструкции.
Для начала установим базовые модули: php-fpm, mysql, curl, GD. Всё остальное — по индивидуальной необходимости.
# aptitude install nginx php5-fpm php5-mysqlnd php5-curl php5-gd
Конфигурационные файлы располагаются в каталоге /etc/php5/fpm/.
Содержание статьи:
- 1 Настраиваем php-пул для обслуживания запросов
- 2 Обработка php скриптов посредством nginx
Настраиваем php-пул для обслуживания запросов
Изначально в php-fpm есть только один пул по имени www. Мы будем использовать его в качестве основы для других пулов.
Откроем конфигурационный файл /etc/php5/fpm/pool.d/www.conf, рассмотрим некоторые переменные и подберём для них значения.
Первая переменная — это имя пула. Оно заключается в квадратные скобки и не может совпадать с именем любого существующего в системе пользователя.
[www]
Далее указываем имя пользователя и его группу, в чьём домашнем каталоге располагается сайт.
user = username group = www-data
Указываем, что пул должен работать в качестве unix-сокета. Переменная $pool будет заменена на имя.
listen = /var/run/php-$pool.sock
Определяем использование статического режима, при котором во время запуска fpm создаётся определённое количество процессов пула. Они обслуживают все поступающие запросы.
pm = static
Почему именно такой выбор? :) Это самый экономный вариант. Каждый процесс пула будет занимать объём оперативной памяти, выделенный переменной memory_limit плюс несколько мегабайт на подключённые модули, кэш и т.п. При статичном варианте все запросы будут обрабатываться только созданными процессами, а новые порождаться (и занимать драгоценную память) не будут. В итоге получим фиксированное потребление памяти.
Указываем необходимое количество процессов, обслуживающих запросы. Подбирается в зависимости от загруженности.
pm.max_children = 3
Следующие параметры рекомендую добавить в конец конфигурационного файла пула.
Каталог для размещения временных файлов:
php_admin_value[upload_tmp_dir] = "/var/www/username/tmp"
Каталог для хранения файлов сессий:
php_admin_value[session.save_path] = "/var/www/username/sessions"
По соображениям безопасности, доступ к этим каталогам должен быть только у пользователя, с правами которого запускается пул php-fpm. Также не следует использовать один каталог и для хранения файлов сессий, и для временных файлов.
Ограничение памяти для выполнения скриптов следует подбирать, исходя из требований сайта. Для начала:
php_admin_value[memory_limit] = 50M
Укажите обязательный параметр, который устраняет уязвимость:
php_admin_value[cgi.fix_pathinfo] = 0
Переменные sendmail_path и open_basedir не указываются специально. Они будут переданы в качестве параметров fast-cgi в конфигурационном файле nginx. Таким образом, для каждого конкретного сайта можно определить свою настройку. :)
После того, как все необходимые параметры прописаны, следует перезагрузить конфигурацию php-fpm командой:
# service php5-fpm reload
Обработка php скриптов посредством nginx
Остаётся настроить nginx для работы с php-fpm. Готовый конфиг
server { server_name example.com; listen 80; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; charset utf-8; index index.php; root /var/www location / { try_files $uri $uri/ /index.php$args; } location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/run/php-www.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com"; fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/"; } }
example.com заменяем на свой домен.
Описание параметров:
try_files $uri =404;
отобразит ошибку 404 в браузере пользователя, вместо сообщения no input file specified, в случае, когда данная ошибка имеет место.
fastcgi_pass
— путь к сокету php-fpm.
fastcgi_pass unix:/run/php-www.sock;
Следующая переменная устанавливает путь к sendmail и параметр, указывающий адрес электропочты администратора сайта. Замените mail@example.com на что-то своё.
fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com";
Перечисляем каталоги для open_basedir: каталог с сайтом, каталог для сохранения временных файлов, каталог для файлов сессий.
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";
Если требуется передать несколько параметров, до делать это следует так:
fastcgi_param PHP_ADMIN_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.comnopen_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";
Как можно заметить, параметры разделяются при помощи переноса строки: n.
Сохраняем все проделанные изменения и перезапускаем nginx.
# service nginx reload