Настройка worker_processes

Архитектура master и worker процессов Nginx объясняется следующим образом: «nginx имеет один master процесс и несколько worker процессов. Основная цель master процесса — прочитать и оценить конфигурацию, а также поддерживать worker процессы. Worker процессы выполняют фактическую обработку запросов. Nginx использует основанную на событиях модель и зависящие от ОС механизмы для эффективного распределения запросов между worker процессами ».

Другими словами, worker_processes сообщает вашему серверу, сколько ядер назначено, чтобы Nginx мог управлять параллельными запросами оптимизированным способом. Путь к конфигурации Nginx по умолчанию: /etc/nginx/nginx.conf

Чтобы узнать, сколько процессоров у вас на веб-сервере, выполните следующую команду.

# grep processor /proc/cpuinfo | wc –l
4

Worker_connections  сообщают worker_processes, сколько клиентов может одновременно обслуживать Nginx. Значение по умолчанию — 768, но важно помнить, что каждый браузер обычно открывает как минимум 2 подключения к серверу. Максимальное количество для настройки worker_processes — 1024, и лучше всего использовать это для получения полного потенциала от Nginx. Исходя из этого, принимая во внимание одно ядро для каждого worker_processes, установка параметром worker_connections равным 1024 подразумевает, что Nginx может обслуживать 1024 клиента в секунду.

worker_processes  4;
events {
    worker_connections  8096;
    multi_accept        on;
    use                 epoll;
}
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log crit;
http {
    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;
    keepalive_timeout  30;
    access_log        off; 
    tcp_nopush         on;
    tcp_nodelay        on;
    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;
    keepalive_requests 100000;
    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
}

Сжатие Gzip

Gzip может помочь уменьшить объем передачи по сети, с которой работает Nginx. Однако будьте осторожны, увеличивая уровень gzip_comp_level слишком высоко, поскольку сервер начнет тратить впустую циклы процессора.

http {
...
    gzip on;
    gzip_disable msie6;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 32 16k;
    gzip_min_length 250;
    gzip_types image/jpeg image/bmp image/svg+xml text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon;

Кеширование

Простой способ избежать обработки запросов вашего сервера — это если клиенты считают, что их контент уже обновлен.

Для этого вам понадобится установить подходящие для кэша заголовки, и простой способ сделать это — объявить необходимый контент и зафиксированы на определенный период времени:

server {
...
    location / {
       ...
  }
      ...
    location ~* \.(jpg|jpeg|png|gif|ico|xml)$ {
       expires 30d;
    }
    location ~* \.(css|js)$ {
       expires 7d;
    }
...
}

HTTP/2 Support

HTTP / 2 имеет много преимуществ по сравнению с HTTP, например, позволяет браузеру загружать файлы параллельно и позволяет серверу загружать ресурсы, помимо прочего. Все, что вам нужно сделать, это заменить http на http2 в блоке вашего сервера по умолчанию.

server{
...
listen 443 http2 default_server;
    listen [::]:443 http2 default_server;
    server_name example.com;
...
}

Redirect WWW

server {
...
}
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen 80;
    listen [::]:80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

Простая защита от  DDoS

Это далеко от безопасной защиты от DDoS, но может замедлить некоторые небольшие DDoS.
http {
 . . .
# ограничить количество соединений на один IP
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

# ограничить количество запросов для данного сеанса
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

# зона, которую мы хотим ограничить верхними значениями, мы хотим ограничить весь сервер

server {
    limit_conn conn_limit_per_ip 20;
    limit_req zone=req_limit_per_ip burst=20 nodelay;
}

# если размер тела запроса больше размера буфера, то полное (или частичное) тело запроса записывается во временный файл
client_body_buffer_size  128k;

# размер буфера для чтения заголовка запроса клиента
client_header_buffer_size 3m;

# максимальное количество и размер буферов для больших заголовков для чтения из запроса клиента
large_client_header_buffers 4 256k;

# время ожидания для тела запроса от клиента
client_body_timeout   3m;

# как долго ждать, пока клиент отправит заголовок запроса
client_header_timeout 3m;
...
}

Улучшаем безопасность

По умолчанию ваш NGINX не имеет всех необходимых заголовков безопасности, что на самом деле довольно просто. Они предотвращают атаки с использованием кликов, межсайтовый скриптинг и другие атаки с использованием кода.
http {
...
   add_header X-Frame-Options "SAMEORIGIN" always;
   add_header X-XSS-Protection "1; mode=block" always;
   add_header X-Content-Type-Options "nosniff" always;
   add_header Referrer-Policy "no-referrer-when-downgrade" always;
   add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
   add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
...
}
Теги: