В линукс-системах файл конфига Nginx находится в папке /etc/nginx/nginx.conf, у FreeBSD в папке /usr/local/etc/nginx/nginx.conf.
Если Nginx выполняет работу нагружающую процессор (например SSL или gzipping или просто движок тяжелый типа Битрекса), то оптимально установить эту директиву worker_processes в значение, равное количеству ядер процессора. Выигрыш при большем значении вы получите только в случае обработки очень большого количества статики.
У небольших сайтов это впс-ка с 1, 2 или 4 ядерным процессором.
Директива worker_connections устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024 до 4096. По стандарту стоит 1024 из расчета, что задача выполняется за менее 0.001 с. Но если у вас много "легких" задач, как обращение к файлам или сервер работает на php-fpm, то можно выставить и больше. Итоговое число рабочих процессов будет зависеть от значения worker_processes, в нашем случае 8000.
Есть еще директива worker_rlimit_nofile. Данная директива определяет количество файловых дескрипторов из расчет по два дескриптора (на открытие и закрытие) для каждого файла один для соединения с клиентом, а второй — для открытия статического файла. То есть значение worker_connections умножаем worker_processes и на два.
Если вы не работаете с логами, то логирование можно отключить.
Правильное отключение логирования доступа и ошибок.
Как вариант, если логи нужно, можно их облегчить, включив буфер.
Для обработки подключений в Nginx поддерживает несколько методов, самым эффективным для Linux является метод epoll, у Freebsd - kqueue.
Для того, чтобы Nginx пытался принять максимальное количество подключений, необходимо включить директиву multi_accept. Но опять же, это актуально только для высоко посещаемых сайтов (свыше 10000 хостов). Малопосещаемым, наоборот, большое количество подключений может навредить, например, в случае ддос атаки сервер попросту зависнет и без kvm его будет не перезагрузить.
Если у вас много работы с файлами (например, включен файловый кэш), то полезным будет кэшировать дескрипторы файлов и директорий.
Сэкономить трафик и ускорить отдачу поможет включение сжатия. Правда увеличится нагрузка на процессор - помониторьте нагрузку процессора после включения данной опции.
Директива Keepalive позволяет избежать необходимости повторного создания соединения между клиентом и сервером (дословный перевод "держать живым").
Много проблем могут создать медленные (тупящие) клиенты. Медленная передача тела запроса от клиента к серверу и неожиданное закрытие клиентом соединений могут создать большое количество лишних соединений на сервере. По этому принципу работают медленные ддос-атаки.
Полный конфиг.
Если Nginx выполняет работу нагружающую процессор (например SSL или gzipping или просто движок тяжелый типа Битрекса), то оптимально установить эту директиву worker_processes в значение, равное количеству ядер процессора. Выигрыш при большем значении вы получите только в случае обработки очень большого количества статики.
У небольших сайтов это впс-ка с 1, 2 или 4 ядерным процессором.
Код:
worker_processes 2;
# worker_processes auto; # в новой версии Nginx можно установить автоматическую настройку
Код:
worker_connections 4000;
Код:
worker_rlimit_nofile 16000;
Правильное отключение логирования доступа и ошибок.
Код:
error_log /dev/null crit;
access_log off;
Код:
access_log /var/log/nginx/access.log main buffer=16k;
Код:
use epoll; # если у вас Linux (Debian, Centos и др.)
# use kqueue;
Код:
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_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;
}