Настройки для повышения производительности nginx
Почти два года назад запустил один из своих проектов на связке nginx+PHP-fpm, и теперь решил поделиться некоторыми настройками, позволяющими получить выигрыш в скорости работы.
включение сжатия
указываем типы файлов, для которых оно используется. Здесь перечислены типы для HTML, CSS, JavaScript, SVG и шрифтов TTF и OTF.
ответы с длиной меньше указанной сжиматься не будут (экономия от сжатия получается слишком незначительной и не оправдывает затрат на него)
добавление заголовка Vary: Accept-Encoding, который указывает, что ответы сервера на запросы с поддержкой GZIP и без нее различаются. (Имеет смысл в тех случаях, когда есть клиенты с подключением через proxy, у которых не поддерживается GZIP-сжатие).
разрешает сжатие для запросов, сделанных через proxy
степень сжатия. Имеет смысл поэкспериментировать в диапазоне 6—8, чтобы найти оптимальное соотношение нагрузки на сеть и процессор.
использование SSL-тикетов для более быстрого возобновления SSL-сессии при повторном подключении того же клиента.
время, в течение которого можно возобновить SSL-сессию
кеш для хранения параметров сессий: shared — означает разделяемый между всеми рабочими процессами nginx, SSL — имя кеша, 10m — объем.
включает использование OSCP stapling, что позволяет ускорить установку SSL-сессии за счет того, что подтверждение, что сертификат не был отозван, отправляется сразу же, клиенту не нужно делать отдельный запрос.
включает проверку корректности OSCP-ответа перед ее отправкой серверу.
Если ssl_stapling_verify включен, то необходимо также добавить директиву ssl_trusted_certificate путь_к_файлу_сертификата, в которой указать путь к корневому сертификату (он приходит при заказе сертификата вместе с основным файлом и обычно называется certificate_ca.crt).
если в логе ошибок часто встречается сообщение an upstream response is buffered to a temporary file, имеет смысл увеличить сначала размер буфера до значения, при котором в нем будет умещаться большинство HTML-страниц сайта полностью, либо увеличить количество буферов, если с сервером устанавливается много одновременных соединений.
кеширование дескрипторов открытых файлов. Может дать небольшой прирост к производительности на выделенных серверах, где стоит небольшое количество сайтов за счет того, что исчезнет необходимость каждый раз открывать часто используемые файлы заново.
Уменьшает число системных вызовов gettimeofday(), делая их не чаще, чем раз в указанный промежуток времени. Это позволяет снизить нагрузку на процессор в обмен на снижение точности, с которой будет фиксироваться время событий в логах.
Читает файлы, размер которых превышает указанный, без использования кеширования на уровне файловой системы. Это позволяет при обращении к большому файлу (что случается достаточно редко) не вытеснять из файлового кеша более мелкие, но часто используемые.
Также есть еще ряд настроек, например, worker_processes, use, sendfile, tcp_nopush, tcp_nodelay, для которых в современных версиях nginx значения по умолчанию оптимальны для типичных сценариев использования Web-сервера. Менять их без необходимости и понимания того, что и зачем вы делаете, не имеет смысла.
Обработка статики
location ~* \.(css|js|gif|jpg|jpeg|png|ico|svg|ttf|otf|eot|woff|woff2)$ {При этом nginx сам подберет подходящий заголовок (Expires для запросов по HTTP/1.0 и Cache-Control: max-age для HTTP/1.1). Директива access_log off отключает запись логов для статических файлов указанных типов, что снижает нагрузку на жесткий диск. (Внимание: перед ее использованием продумайте, точно ли в вашем случае это уместно с точки зрения безопасности.)
expires 30d;
access_log off;
}
Сжатие GZIP
gzip on;
включение сжатия
gzip_types text/html text/plain text/css application/x-javascript text/javascript application/javascript image/svg+xml application/x-font-ttf application/x-font-opentype application/vnd.ms-fontobject application/xml+rss text/plain;
указываем типы файлов, для которых оно используется. Здесь перечислены типы для HTML, CSS, JavaScript, SVG и шрифтов TTF и OTF.
gzip_min_length 512;
ответы с длиной меньше указанной сжиматься не будут (экономия от сжатия получается слишком незначительной и не оправдывает затрат на него)
gzip_vary on;
добавление заголовка Vary: Accept-Encoding, который указывает, что ответы сервера на запросы с поддержкой GZIP и без нее различаются. (Имеет смысл в тех случаях, когда есть клиенты с подключением через proxy, у которых не поддерживается GZIP-сжатие).
gzip_proxied any;
разрешает сжатие для запросов, сделанных через proxy
gzip_comp_level 6;
степень сжатия. Имеет смысл поэкспериментировать в диапазоне 6—8, чтобы найти оптимальное соотношение нагрузки на сеть и процессор.
Оптимизация SSL/TLS
ssl_session_tickets on;
использование SSL-тикетов для более быстрого возобновления SSL-сессии при повторном подключении того же клиента.
ssl_session_timeout 12h;
время, в течение которого можно возобновить SSL-сессию
ssl_session_cache shared:SSL:10m;
кеш для хранения параметров сессий: shared — означает разделяемый между всеми рабочими процессами nginx, SSL — имя кеша, 10m — объем.
ssl_stapling on;
включает использование OSCP stapling, что позволяет ускорить установку SSL-сессии за счет того, что подтверждение, что сертификат не был отозван, отправляется сразу же, клиенту не нужно делать отдельный запрос.
ssl_stapling_verify on;
включает проверку корректности OSCP-ответа перед ее отправкой серверу.
Если ssl_stapling_verify включен, то необходимо также добавить директиву ssl_trusted_certificate путь_к_файлу_сертификата, в которой указать путь к корневому сертификату (он приходит при заказе сертификата вместе с основным файлом и обычно называется certificate_ca.crt).
Прочие настройки
proxy_buffers 32 64k;
если в логе ошибок часто встречается сообщение an upstream response is buffered to a temporary file, имеет смысл увеличить сначала размер буфера до значения, при котором в нем будет умещаться большинство HTML-страниц сайта полностью, либо увеличить количество буферов, если с сервером устанавливается много одновременных соединений.
open_file_cache max=2000 inactive=30s;
кеширование дескрипторов открытых файлов. Может дать небольшой прирост к производительности на выделенных серверах, где стоит небольшое количество сайтов за счет того, что исчезнет необходимость каждый раз открывать часто используемые файлы заново.
timer_resolution 200ms;
Уменьшает число системных вызовов gettimeofday(), делая их не чаще, чем раз в указанный промежуток времени. Это позволяет снизить нагрузку на процессор в обмен на снижение точности, с которой будет фиксироваться время событий в логах.
directio 4m;
Читает файлы, размер которых превышает указанный, без использования кеширования на уровне файловой системы. Это позволяет при обращении к большому файлу (что случается достаточно редко) не вытеснять из файлового кеша более мелкие, но часто используемые.
Также есть еще ряд настроек, например, worker_processes, use, sendfile, tcp_nopush, tcp_nodelay, для которых в современных версиях nginx значения по умолчанию оптимальны для типичных сценариев использования Web-сервера. Менять их без необходимости и понимания того, что и зачем вы делаете, не имеет смысла.
https://mozilla.github.io/server-side-tls/ssl-config-generator/