Тонкая настройка 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;
        }
}

Комментарии

comments powered by Disqus