• Форум посвящен самостоятельной (бесплатной) защите от ддос атак.
    Есть мануалы по настройке сервера от Ddos для сисадминов и готовые инструменты от ддос-атак для вебмастеров.

    Простое, эффективное, точное и проверенное бесплатное решение от мощных ддос-атак: PHP скрипт + Cloudflare, с панелью управления.

Ускорение Nginx с учетом возможных ддос атак

admin

admin

Администратор
Администрация
#1
В линукс-системах файл конфига Nginx находится в папке /etc/nginx/nginx.conf, у FreeBSD в папке /usr/local/etc/nginx/nginx.conf.

Если Nginx выполняет работу нагружающую процессор (например SSL или gzipping или просто движок тяжелый типа Битрекса), то оптимально установить эту директиву worker_processes в значение, равное количеству ядер процессора. Выигрыш при большем значении вы получите только в случае обработки очень большого количества статики.
У небольших сайтов это впс-ка с 1, 2 или 4 ядерным процессором.
Код:
worker_processes 2;
# worker_processes auto;  # в новой версии Nginx можно установить автоматическую настройку
Директива worker_connections устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024 до 4096. По стандарту стоит 1024 из расчета, что задача выполняется за менее 0.001 с. Но если у вас много "легких" задач, как обращение к файлам или сервер работает на php-fpm, то можно выставить и больше. Итоговое число рабочих процессов будет зависеть от значения worker_processes, в нашем случае 8000.
Код:
worker_connections 4000;
Есть еще директива worker_rlimit_nofile. Данная директива определяет количество файловых дескрипторов из расчет по два дескриптора (на открытие и закрытие) для каждого файла один для соединения с клиентом, а второй — для открытия статического файла. То есть значение worker_connections умножаем worker_processes и на два.
Код:
worker_rlimit_nofile 16000;
Если вы не работаете с логами, то логирование можно отключить.
Правильное отключение логирования доступа и ошибок.
Код:
error_log /dev/null crit;  
access_log off;
Как вариант, если логи нужно, можно их облегчить, включив буфер.
Код:
access_log /var/log/nginx/access.log main buffer=16k;
Для обработки подключений в Nginx поддерживает несколько методов, самым эффективным для Linux является метод epoll, у Freebsd - kqueue.
Код:
use epoll; # если у вас Linux (Debian, Centos и др.)
# use kqueue;
Для того, чтобы Nginx пытался принять максимальное количество подключений, необходимо включить директиву multi_accept. Но опять же, это актуально только для высоко посещаемых сайтов (свыше 10000 хостов). Малопосещаемым, наоборот, большое количество подключений может навредить, например, в случае ддос атаки сервер попросту зависнет и без kvm его будет не перезагрузить.
Код:
multi_accept on;
Если у вас много работы с файлами (например, включен файловый кэш), то полезным будет кэшировать дескрипторы файлов и директорий.
Код:
open_file_cache max=200000 inactive=20s; 
open_file_cache_valid 30s; 
open_file_cache_min_uses 2; 
open_file_cache_errors on;
Сэкономить трафик и ускорить отдачу поможет включение сжатия. Правда увеличится нагрузка на процессор - помониторьте нагрузку процессора после включения данной опции.
Код:
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;
Директива Keepalive позволяет избежать необходимости повторного создания соединения между клиентом и сервером (дословный перевод "держать живым").
Код:
keepalive_timeout 30; # держать соединение открытым 30 секунд 
keepalive_requests 100; # максимальное количество keepalive запросов от одного клиента, можно выставить поменьше при частых ддосах
Много проблем могут создать медленные (тупящие) клиенты. Медленная передача тела запроса от клиента к серверу и неожиданное закрытие клиентом соединений могут создать большое количество лишних соединений на сервере. По этому принципу работают медленные ддос-атаки.
Код:
reset_timedout_connection on; # спрос соединения при отсутствии ответа
client_body_timeout 10; # ждем 10 секунд тело запроса, после чего сбрасываем соединение
send_timeout 2; # если клиент прекратит чтение ответа, ждем 2 секунды и сбрасываем соединение
client_max_body_size  2m; # ограничение больших запросов до 2 мегабайт
Полный конфиг.
Код:
worker_processes  2;
events {
    use epoll;
    worker_connections 4000;
    worker_rlimit_nofile 16000;
}
http {
    ...
    access_log off;
    error_log /dev/null crit; 

    keepalive_timeout  30;
    keepalive_requests 100;

    client_max_body_size  2m;
    client_body_timeout 10;
    reset_timedout_connection on;
    send_timeout 2;
    sendfile on;

    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;

    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
}
 
Сверху