Содержание
Настройки NGINX
Основные параметры конфигурации
Первым запускается «мастер» процесс /usr/sbin/nginx, который открывает необходимые порты и запускает количество worker_processes, указанное в конфигурации от имени пользователя, который указан там же. Кроме того, он записывает свой PID в файл /var/run/nginx.pid:
# ps aux | grep "nginx: master" | grep -v grep root 7599 0.0 0.0 47488 556 ? Ss 13:47 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
# cat /var/run/nginx.pid 7599
Таким образом, «ветвь процессов» NGINX выглядит как: master_process > worker_processes * N, где N — количество worker_processes в конфигурации:
# ps aux | grep nginx | grep -v grep root 7599 0.0 0.0 47488 556 ? Ss 13:47 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 7601 0.0 0.2 48700 2632 ? S 13:47 0:05 nginx: worker process
# cat /etc/nginx/nginx.conf | grep worker
worker_processes 1;
worker_connections 1024;
Worker-ы не являются multi-threaded процессами, поэтому они не могут перераспределять потоки, обрабатывающие подключения по разным процессорам.
worker_processes можно установить либо по количеству ядер/процессоров, либо в auto — тогда NGINX попытается сам определить оптимальное значение:
worker_processes auto;
worker_connection — количество соединений, которые будут обрабатывать worker_processes (т.е. max_connection для вашего NGINX будет worker_connections * worker_processes):
Так же учитываются соединения с «локальными» ресурсами — например, PHP-FPM или Apache HTTP.
По соображениям безопасности — можно отключить server_tokens:
server_tokens off;
В таком случае — NGINX не будет передавать свою версию в сообщениях об ошибках и в поле “Server” заголовка ответа.
client_max_body_size — если у вас возникает ошибка “Request Entity Too Large” (413) — увеличьте значение client_max_body_size, т.к. по умолчанию оно только 1 МБ:
client_max_body_size 20m;
Для ускорения загрузки файлов — можно увеличить client_body_buffer_size (по-умолчанию 16KB в х64):
client_body_buffer_size 128k;
Подробнее — тут>>>.
Кеширование статических файлов браузерами
Что бы браузеры хранили файлы в своём кеше, вместо загрузки их с сервера каждый раз, можно передать HTTP-заголовок Expires:
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
Подробнее — тут>>>.
Запрет доступа к файлам
Что бы запретить доступ к файлам, начинающимся с точки — добавьте:
location ~ /. {
deny all;
}
Например, что бы запретить доступ к .htaccess и .htpasswd:
location ~ /.ht {
deny all;
}
Запретить доступ к файлам php в каталогах uploads и files:
location ~* /(?:uploads|files)/.*.php$ {
deny all;
}
Настройки для PHP-FPM
Перезапуск потоков
emergency_restart_threshold — указывает количество процессов-потомков (или «дочерних процессов», кому как нравится) PHP-FPM, которые в случае получения сигналов SIGSEGV или SIGBUS за промежуток времени, заданный в emergency_restart_interval вызовут перезагрузку PHP-FPM.
Например:
emergency_restart_threshold = 10 emergency_restart_interval = 1m
Если 10 дочерних процессов PHP-FPM в течении 1 минуты получат ошибку SIGSEGV (Segmentation fault) или SIGBUS (Bus error) — то PHP-FPM будет перезапущен.
По-умолчанию отключено.
process_control_timeout — задаёт интервал в секундах, в течении которого потомки ждут ответа от PHP-FPM-мастера. Если ответа не будет — процесс будет пересоздан. По-умолчанию отключено:
process_control_timeout = 10
Эти настройки необходимо добавлять в основной файл настроек PHP-FPM , в CentOS это /etc/php-fpm.conf.
Настройки PHP-FPM Process Manager (pm)
Сам PM (pm) может запускаться по-разному:
static— фиксированное число дочерних процессов (pm.max_children).ondemand— число процессов, порождающихся по требованию (когда появляются запросы, в отличии от опцииdynamic, когда стартует определенное количество процессов, равноеpm.start_servers, вместе с запуском службы.- dynamic — динамически изменяющееся число дочерних процессов, задается на основании следующих директив:
pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
Например:
pm dynamic
pm.start_servers — количество дочерних процессов, которые будет создавать PM при старте PHP-FMP (только если pm dynamic);
pm.min_spare_servers — количество процессов, которые должны оставаться в idle, как «запасные», ожидая задач на выполнение, если количество меньше — будут созданы новые;
pm.max_spare_servers — наоборот, максимальное количество процессов, которые должны оставаться в idle,если количество больше — некоторые потомки будут уничтожены;
pm.max_requests — количество запросов процесса, после которого он будет пересоздан, полезно для предотвращения утечек памяти (memory-leak);
pm.max_children — максимальное количество процессов-потомков, которое будет создано PM.
Оптимальное значение для max_children приблизительно можно подсчитать так:
запустить NGINX; выполнить обращение к самой «тяжёлой» странице PHP; открыть top или посмотреть в ps количество занятой RSS памяти, например:
# while true; do curl http://rtfm.co.ua &> /dev/null; sleep 1; done
теперь — получаем значение занятой памяти:
# ps aux | grep -E 'rtfm.*php-fpm' | head -n 1 | awk '{print $6}'
54796
53 МБ на один процесс.
Далее, предположим вы готовы выделить под PHP-скрипты 1 гигабайт памяти, тогда:
1024 МБ / 53 МБ = 19 pm.max_children.
Это, конечно, очень неточное решение.
К примеру, реально занятая память PHP-FPM процессами на самом деле будет меньше, например из данных ps_mem:
571.4 MiB + 8.1 MiB = 579.5 MiB php-fpm (23)
Т.е. 25 МБ в среднем на каждый.
Некоторые полезные опции PHP-FPM
security.limit_extensions — ограничение типов файлов (по расширению), которые будут обрабатываться PHP-FPM.
Значение по-умолчанию — .php.
chroot и chdir — «корневая» директория для php-скриптов, и директория, с которой будут начинать выполнение скрипты. Хорошо описаны тут>>>.
Использование unix-сокетов вместо TCP-портов — хорошо описано тут>>>, но не забудьте добавить listen.owner, listen.group и listen.mode.
Указать отдельный лог-файл для ошибок PHP:
php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on
Записывать «медленные запросы» PHP можно указав лог в строке:
slowlog = /var/log/nginx/rtfm.co.ua-slow.log
А задать время, по истечении которого запрос будет считать «медленным» — с помощью:
request_slowlog_timeout = 5
Убить процесс, который выполняется больше 300 секунд:
request_terminate_timeout = 300s
Надеюсь, будет время добавить отдельный пост по настройке производительности и безопасности NGINX/PHP-FPM.
Ссылки по теме:
http://php.net
http://codex.wordpress.org
http://wiki.nginx.org/Main
http://www.if-not-true-then-false.com
https://stephentanner.com
http://help.ubuntu.ru
http://ae.koroglu.org
http://myjeeva.com
