Настройка 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
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; ... }
Улучшаем безопасность
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; ... }