Тонкая настройка Nginx
September 7, 2015
По большому счету даже при стандартных настройках Nginx весьма не плохо справляется с входящей нагрузкой. Тем не менее иногда имеет смысл его подтюнить, с целью достижения лучшей производительности.
Основная конфигурация с комментариями
# Всего соединений = worker_processes x worker_connections
# Определяет количество рабочих процессов.
# Его лучше устанавливать в auto в новых версиях.
worker_processes auto;
events {
# Директива use устанавливает метод выбора соединений.
# Для разных операционных систем нужно использовать разные методы.
# linux: use epoll
# freebsd: use kqueue
# По умолчанию, выбирается наиболее эффективный метод самостоятельно.
use epoll;
# Устанавливает максимальное количество соединений одного рабочего процесса.
# Следует выбирать значения от 1024 до 4096.
worker_connections 1024;
# Будет принимать максимально возможное количество соединений
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Основной лог лучше отключить для экономии дисковых операций,
# а лог ошибок лучше перевести в режим логирования только критических ситуаций.
access_log off;
error_log /var/log/nginx/error.log crit;
# Будет ждать 30 секунд перед закрытием keepalive соединения
keepalive_timeout 30;
# Максимальное количество keepalive запросов от одного клиента
keepalive_requests 100;
# В этом случае сервер не будет принимать запросы размером более 1Мб
client_max_body_size 1m;
# Будет ждать 10 секунд тело запроса от клиента, после чего сбросит соединение
client_body_timeout 10;
# Если клиент перестал читать отвечать, Nginx будет сбрасывать соединение с ним
reset_timedout_connection on;
# Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение
send_timeout 2;
# Метод отправки данных sendfile более эффективен, чем стандартный метод read+write
sendfile on;
# Будет отправлять заголовки и и начало файла в одном пакете
tcp_nodelay on;
tcp_nopush on;
# Файлы более 10Мб Nginx будет читать с диска минуя операционный кеш
directio 10m;
# Ограничиваем скорость отдачи до 196Кб/с
limit_rate 196K;
# Ограничение скорости отдачи будет накладываться после 1Мб
limit_rate_after 1m;
# Обязательно нужно использовать сжатие, это значительно уменьшит трафик.
gzip on;
# Будет сжимать все файлы с перечисленными типами
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
# Определяет максимальное количество файлов, информация о которых будет содержаться в кеше
open_file_cache max=200000 inactive=20s;
# Определяет через какое время информация будет удалена из кеша
open_file_cache_valid 30s;
# Будет кешировать информацию о тех файлах, которые были использованы хотя бы 2 раза
open_file_cache_min_uses 2;
# Будет кешировать информацию об отсутствующих файлах
open_file_cache_errors on;
}
Кеширование
Основная задача - разбить на кеширующий и не кеширующий сервер. Ниже приведен пример с настройками по каждому из них.
http {
...
# Во-первых, убедимся что есть директория: /var/cache/nginx
# Устанавливаем размер кеша в 32Мб, сохранять его будем в папку /var/cache/nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:32m;
# Nginx позволяет кешировать ответы от fastcgi
# Установим максимальный размер кеша в 100Мб, сохранять его будем в папку /var/cache/fpm
fastcgi_cache_path /var/cache/fpm levels=1:2 keys_zone=fcgi:100m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
...
}
# fastcgi_pass сервер (без кеширования)
server {
listen 81;
location / {
# fpm, etc...
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_cache fcgi;
# кешируем только 200 OK н а60 минут
fastcgi_cache_valid 200 60m;
}
}
# основной сервер (кеширующий)
server {
listen 80;
location / {
# не кешируем если есть cookies
if ($http_cookie ~* ".+" ) {
set $do_not_cache 1;
}
proxy_cache_bypass $do_not_cache;
proxy_pass http://127.0.0.1:81/;
proxy_cache all;
# кешируем ошибки на 1 минуту
proxy_cache_valid 404 502 503 1m;
proxy_cache_valid any 1h;
}
}