Оптимизация nginx

Как известно, nginx очень продуктивный веб-сервер, но всё же его тоже можно ускорить. Я облазил интернет и решил все советы собрать в одном месте.

Поехали. Для начало нужно открыть конфиг nginx, ну, это и так должно бить понято. В debian он обычно в /etc/nginx/nginx.conf, в freebsd — /usr/local/etc/nginx/nginx.conf

Оптимизация


Я уже, наверное, задолбал теорией, так что давайте приступим к практике.

Обработка соединений


Максимальное количество соединений, которые Nginx может обслуживать одновременно, определяются произведением двух параметров:

Всего соединений = worker_processes x worker_connections



01cd184d431acc7c85fae6c99f8e3b5e

worker_processes auto; 



Nginx и сам может посчитать и поверьте, сделает это лучше. Рекомендую ставить в auto в последних версиях.

worker_connections 1024;



Устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024 до 4096.

А use нам поможет выбрать тип соединения. В linux — epoll, freebsd — kqueue

use epoll;



f57f327f6ee432f5c38183ecaad26227

Если не укажем — nginx сам подумает. Умница! А вы говорите нет штучного интелекта.

Обработка запросов

 

multi_accept on; #nginx будет обрабатывать максимальное количество соединений
sendfile on; #Метод отправки данных sendfile более эффективен, чем стандартный метод read+write
# Nginx будет отправлять заголовки и начало файла в одном пакете:
tcp_nodelay on; 
tcp_nopush on;



Без этого никак.

Файлы

 

directio 10m;



Эта опция будет читать файлы, больше 10 мб, минуя операционный кеш, поскольку для больших файлов он малоэффективен.

Cache-Control

 

location ~* ^.+\.(js|css)$ {
    expires max;
}



Этот код будет кешировать js, css -файлы навечно. Но по скольку они время от времени изменяются, нужно делать так:

<link rel="stylesheet" href="/styles.v2.css" type="text/css" />
<script  src="/scripts.v2.js"></script>



Для удобства сделать rewrite на script.js/style.css и заливать файлы так, а если есть изменения — просто заменить цифру после v.
С неизменяемой статикой всё значительно проще:

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
    }



Информация о файлах


Nginx умеет кешировать информацию о файлах, с которыми ему приходится работать (например, css стили или картинки). Если к таким файлам происходит много обращений, кеширование может значительно ускорить этот процесс.

open_file_cache max=200000 inactive=20s;



Определяет максимальное количество файлов, информация о которых будет содержаться в кеше.

open_file_cache_valid 30s;



Определяет через какое время информация будет удалена из кеша:

open_file_cache_min_uses 2;



Nginx будет кешировать информацию о файлах, которые были использованы хотя бы 2 раза.

open_file_cache_errors on;



Nginx будет кешировать информацию об отсутствующих файлах:

limit_rate

 

limit_rate 200K; #отдавать файлы со скоростью 200 кб/сек



Эта опция работает только в рамках одного запроса, а не клиента. Если вы хотите поставить ограничение на клиента, следует использовать переменную:

set $limit_rate 196K;



В Nginx также есть возможность установить порог отдачи, после которой ограничение войдет в силу. Также имеет смысл для потокового медиа (в этом случае первая указанная часть будет отдаваться без ограничений):

limit_rate_after 1m; #Ограничение скорости отдачи будет накладываться после 1Мб



Логи

 

access_log /dev/null; #нам логи не нужны
error_log /var/log/nginx/error.log; #а вот ошибки нужно знать!



Сжатия gzip

 

gzip on;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;



Для text/html не нужно, поскольку nginx для него сжимает автоматически.

Обработка клиентов

 

keepalive

 

keepalive_timeout = 30;
keepalive_requests 100; #максимально от одного клиента



Тут, думаю, всё ясно.

Ограничения и отключения

 

reset_timedout_connection on;#Если клиент перестал читать, отвечать nginx сбрасывает соединение с ним
client_body_timeout 10;#nginx будет ждать 10 секунд тело запроса от клиента, после чего сбросит соединение
send_timeout 2; #Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение
client_max_body_size  1m; #больше одного мегабайта запрос - ни-ни, хотя нужно на стороне приложения ограничивать



С этим нужно быть очень осторожным.

The end! Надеюсь, этот пост будет вам полезен.