Настройки для повышения производительности nginx

Почти два года назад запустил один из своих проектов на связке nginx+PHP-fpm, и теперь решил поделиться некоторыми настройками, позволяющими получить выигрыш в скорости работы.

Обработка статики


location ~* \.(css|js|gif|jpg|jpeg|png|ico|svg|ttf|otf|eot|woff|woff2)$ {
        expires 30d;
        access_log off;
    }
При этом nginx сам подберет подходящий заголовок (Expires для запросов по HTTP/1.0 и Cache-Control: max-age для HTTP/1.1). Директива 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-сервера. Менять их без необходимости и понимания того, что и зачем вы делаете, не имеет смысла.