Оптимальная настройка NGINX
В стандартной конфигурации Nginx может работать при очень больших нагрузках. Тем не менее, эффективность его работы можно значительно повысить, настроив его параметры должным образом.
Оптимизация параметров
Обработка соединений
Максимальное количество соединений, которые Nginx может обслуживать одновременно определяются произведением двух параметров:
1 | Всего соединений = worker_processes x worker_connections |
Определяем количество рабочих процессов. Значение лучше устанавливать в auto
в новых версиях.
1 | worker_processes auto; |
Устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024
до 4096
.
1 | worker_connections 1024; |
Директива use
устанавливает метод выбора соединений. Для разных операционных систем нужно использовать разные методы.
Linux
1 | use epoll |
Freebsd
1 | use kqueue |
По умолчанию, Nginx постарается выбрать наиболее эффективный метод самостоятельно.
Обработка запросов
Будем принимать максимально возможное количество соединений
1 | multi_accept on; |
Метод отправки данных sendfile
более эффективен, чем стандартный метод read+write
1 | sendfile on; |
Будем отправлять заголовки и начало файла в одном пакете
1 | tcp_nodelay on; |
Информация о файлах
Nginx умеет кешировать информацию о файлах, с которыми ему приходится работать (например, css стили или картинки). Если к таким файлам происходит много обращений, кеширование может значительно ускорить этот процесс.
Определяем максимальное количество файлов, информация о которых будет содержаться в кеше
1 | open_file_cache max=200000 inactive=20s; |
Определяет через какое время информация будет удалена из кеша
1 | open_file_cache_valid 30s; |
Будем кешировать информацию о тех файлах, которые были использованы хотя бы 2 раза
1 | open_file_cache_min_uses 2; |
Будем кешировать информацию об отсутствующих файлах
1 | open_file_cache_errors on; |
Логирование
Основной лог лучше отключить для экономии дисковых операций, а лог ошибок лучше перевести в режим логирования только критических ситуаций.
1 | access_log off; |
Сжатие Gzip
Обязательно нужно использовать сжатие, это значительно уменьшит трафик. Проверить, включено ли сжатие, можно с помощью Gzip checker
.
Будем сжимать все файлы с перечисленными типами
1 | gzip on; |
Обработка клиентов
Keepalive соединения позволяют избежать необходимости повторного создания соединения между клиентом и сервером.
Будем ждать 30 секунд перед закрытием keepalive-соединения
1 | keepalive_timeout = 30; |
Максимальное количество keepalive запросов от одного клиента
1 | keepalive_requests 100; |
Много проблем могут создать медленные (тупящие) клиенты. Медленная передача тела запроса от клиента к серверу и неожиданное закрытие клиентом соединений могут создать большое количество лишних соединений на сервере.
Если клиент перестал отвечать, Nginx будет сбрасывать соединение с ним
1 | reset_timedout_connection on; |
Будем ждать 10 секунд тело запроса от клиента, после чего сбросим соединение
1 | client_body_timeout 10; |
Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение
1 | send_timeout 2; |
Ограничивайем отправку больших запросов на сервер (например, загрузку больших файлов), если это не предусмотрено сайтом.
В этом случае сервер не будет принимать запросы размером более 1Мб
1 | client_max_body_size 1m; |
После правки настроек необходимо выполнить перезагрузку:
1 | nginx -s reload |
Окончательный конфигурационный файл
1 | worker_processes auto; |
Самым большим эффектом на посетителей окажет включение сжатия gzip.