Nginx-оптимизация производительности

Nginx

предисловие

это оNginxОптимизация производительности основана на моих исследованиях и исследованиях и не используется в реальной производственной среде. Если вы хотите использовать ее на практике, используйте ее после тщательного тестирования.

NginxОптимизация производительности, в основном для уменьшения磁盘 io.

  • Заголовок запроса, тело запроса и тело ответа обрабатываются в буфере.
  • прочитать информацию о файле

Уменьшить сетевой ввод-вывод.

  • gzip-сжатие. Внешние ресурсы также могут быть выполнены заранееgzipСжатие, чтобы не было необходимости сжимать при запросе, уменьшая количествоcpuпотеря.
  • Сильный кеш. Уменьшите количество запросов к статическим ресурсам на серверной части.

httpСсылка освобождается как можно скорее, чтобы уменьшить накопление запросов.

linuxОптимизация ядра. Эта часть в основном предназначена для ознакомления с информацией и добавления собственного понимания. Содержание взято из «Глубокого понимания разработки модулей Nginx и проектирования архитектуры».

Можно использовать после настройки параметров аккаунтаabиjmeterВыполните измерение давления и внесите коррективы в соответствии с фактическим эффектом.

NginxОбязательно выполняйте оптимизацию производительности, когда это безопасно. В противном случае tcp-атака может повесить ваш сервер, и лучше всего использовать ее. Во-первых, безопасный доступ, во-вторых, производительность.

После настройки необходимо не забыть ограничить ток.

Готов к следующей серииMysqlСвязанные, уже в подготовке.

оптимизация ядра линукса

можно изменить/etc/sysctl.confизменить параметры ядра. Тщательная оптимизация этой части

  • Просмотр системных параметров, связанных с TCP
 sysctl -a | grep 'net.ipv4.tcp' | grep -v grep
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 15
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem = 4096 32768 262144
net.ipv4.tcp_wmem = 4096 32768 262144
net.ipv4.tcp_max_orphans = 262144 
net.core.netdev_max_backlog = 262144
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.core.somaxconn = 262144 
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog=262144

После изменения выполните следующую команду, чтобы конфигурация вступила в силу.

sysctl -p

Значения вышеуказанных параметров поясняются следующим образом:

  • fs.file-max: 999999

    Этот параметр указывает максимальное количество дескрипторов, которые процесс (например, рабочий процесс) может открыть одновременно.Этот параметр напрямую ограничивает максимальное количество одновременных подключений и должен быть настроен в соответствии с реальной ситуацией.

  • net.ipv4.tcp_tw_reuse:

    Этот параметр установлен в 1, что означает, что сокеты в состоянии TIME-WAIT разрешено повторно использовать для новых соединений TCP, что имеет смысл для сервера, т.к. всегда будет большое количество соединений в состоянии TIME-WAIT на сервер.

  • net.ipv4.tcp_keepalive_time:

    Этот параметр указывает, как часто TCP отправляет сообщения проверки активности, когда поддержка активности включена. Значение по умолчанию — 2 часа. Если установить меньшее значение, недействительные соединения будут очищаться быстрее.

  • net.ipv4.tcp_fin_timeout:

    Этот параметр указывает максимальное время, в течение которого сокет остается в состоянии FIN-WAIT-2, когда сервер активно закрывает соединение.

  • net.ipv4.tcp_max_tw_buckets:

    Этот параметр указывает максимальное количество сокетов TIME_WAIT, разрешенное операционной системой. Если это число превышено, сокет TIME_WAIT будет немедленно очищен, и будет напечатано предупреждающее сообщение. Этот параметр по умолчанию равен 180000, слишком много сокетов TIME_WAIT могут замедлить работу веб-сервера.

  • net.ipv4.ip_local_port_range:

    Этот параметр определяет диапазон значений для локального (исключая удаленный конец соединения) порта в соединениях UDP и TCP.

  • net.ipv4.tcp_rmem:

    Этот параметр определяет минимальное значение, значение по умолчанию и максимальное значение буфера приема TCP (используется для скользящего окна приема TCP).

  • сеть.ipv4.tcp_wmem:

    Этот параметр определяет минимальное значение, значение по умолчанию и максимальное значение буфера отправки TCP (используется для скользящего окна отправки TCP).

  • net.ipv4.tcp_max_orphans

    Возможность записи максимального количества запросов на подключение, которые не получили подтверждения от клиента. Значение этого параметра по умолчанию — 1024 для систем с 128 МБ памяти и 128 для систем с небольшим объемом памяти.

  • net.core.netdev_max_backlog:

    Когда сетевая карта получает пакеты быстрее, чем ядро ​​может их обработать, возникает очередь для хранения этих пакетов. Этот параметр представляет максимальное значение очереди.

  • net.core.net.core.rmem_default:

    Этот параметр указывает размер приемного буфера сокета ядра по умолчанию.

  • сеть.core.wmem_default:

    Этот параметр указывает размер буфера отправки сокета ядра по умолчанию.

  • сеть.ядро.rmem_max:

    Этот параметр указывает максимальный размер приемного буфера сокета ядра.

  • net.core.wmem_max:

    Этот параметр указывает максимальный размер буфера отправки сокета ядра.

Размер скользящего окна и буфера сокета в некоторой степени влияют на количество одновременных подключений.

Каждое соединение TCP потребляет память для поддержания скользящего окна TCP, которое сжимается или расширяется в зависимости от скорости обработки сервера.

Настройка параметра wmem_max должна определяться балансировкой общего размера физической памяти и максимального количества подключений, одновременно обрабатываемых Nginx (определяется параметрами worker_processes и worker_connections в nginx.conf).

Конечно, нецелесообразно уменьшать размер скользящего окна только для увеличения параллелизма, чтобы на сервере не возникала проблема Out Of Memory, потому что слишком маленькое скользящее окно повлияет на скорость передачи больших объемов данных.

Настройки четырех параметров rmem_default, wmem_default, rmem_max и wmem_max должны быть всесторонне рассмотрены в соответствии с особенностями нашего бизнеса и фактическими затратами на оборудование.

  • net.core.somaxconn

    Параметр указывает максимальное количество пакетов, разрешенных для отправки в очередь, когда каждый сетевой интерфейс получает пакеты быстрее, чем ядро ​​может их обработать.

  • net.ipv4.tcp_syncookies:

    Установите на 1. Этот параметр не имеет ничего общего с производительностью и используется для защиты от SYN-атаки TCP.

  • net.ipv4.tcp_max_syn_backlog:

    Этот параметр указывает максимальную длину очереди получения SYN-запросов на этапе установления трехстороннего рукопожатия TCP.Значение по умолчанию — 1024. Установка большего значения может предотвратить потерю Linux запроса на подключение, инициированного клиентом, когда Nginx слишком занят. принять новое соединение.

Оптимизация памяти и дисковых данных

client_header_buffer_size 1k;

Доступа к 1k как к статическому ресурсу достаточно.

Размер буфера заголовка клиентского запроса, по умолчанию 1к, при запросе интерфейса задайте целое число кратное 4к согласно данным заголовка запроса.

4k — размер страницы системной памяти, команда getconf PAGESIZE размер страницы памяти

large_client_header_buffers

image-20200329190558284

client_body_in_single_buffer

Если включено, http-пакеты всегда записываются в буфер памяти, если размер тела пакета превышаетclient_body_buffer_sizeразмер, он все равно будет записан в файл на диске.

client_body_buffer_size

x64 по умолчанию 16K. Определяет размер буфера памяти для тела запроса.Запрос сначала записывается в буфер, а затем во временный файл.

client_max_body_size 100m;

Установите максимально допустимый размер тела запроса клиента, по умолчанию 1м. Проверяется Content-Length. Установите 0, чтобы не проверять. Настройка для определенного местоположения. Чтобы предотвратить запрошенные атаки, установите его там, где необходимо увеличить, а не глобально.

sendflie on;

Чтение содержимого файла уменьшает копирование из состояния ядра в состояние пользователя и непосредственно из состояния ядра в устройство сетевой карты, что повышает эффективность передачи.

open_file_cache

Информация о хранении файлов кэша. max представляет максимальный объем хранилища, сверх этого объема используйте LRU для устранения

inactive указывает период времени, элементы, к которым не было доступа в течение этого периода времени, будут удалены

open_file_cache max=65535 inactive=20s;

open_file_cache_min_uses

По умолчанию 1. Используется в сочетании с inactive для open_file_cache, если количество обращений превышает количество раз, указанное в open_file_cache_min_uses, в течение времени, указанного в inactive, кеш не будет удален.

Увеличить лимит файловых дескрипторов

linuxВсе является файлом, но существует ограничение на количество файлов, которые может открыть процесс. Количество дескрипторов файлов может быть ограничено для пользователей и процессов.

  • Дескриптор файла, может быть установлен для пользователя, процесса

    • Глобальные настройки /etc/security/limits.conf
* hard nofile 65535
* soft nofile 65535
root hard nofile 65535
- nginx 进程配置
worker_rlimit_nofile 20480;

оптимизация журнала

Операции с журналами можно соответствующим образом сократить. Например, ведение журнала доступа к статическим данным, если вы считаете, что это не важно, вы можете отменить ведение журнала. Это уменьшит дисковый ввод журнала при запросе ресурсов.

# 关闭日志
access_log off;
# 禁用文件未找到的错误到日志中去
log_not_found off;

Оптимизация обратного прокси

если вы используетеnginxВ качестве прокси-сервера также уменьшите количество операций чтения с диска.

proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 16 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_set_header Host $http_host;
proxy_set_header X-REAL-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Оптимизированная конфигурация Nginx

# 配置 worker 进程所属用户,用户组
user nginx nginx;

# 配置 worker 进程数量,为避免 cpu 切换损耗,配置和系统内核数一样即可,或者 auto
worker_processes auto;

# 配置 cpu 亲和,auto 代表自动绑定
worker_cpu_affinity auto;

# nginx 进程打开文件描述符数目,此值覆盖 ulimit -n 的值。
worker_rlimit_nofile 65535;

events {
    # 用这个模型来高效处理异步事件
    use epoll;

    # 设置为 on worker 进程轮流接受新链接,官方推荐设置为 off.高负载的情况下设置为 on.
    accept_mutex on;

    # worker进程是否同时接受连接所有新请求。默认为off,表示一次只接受一个新的请求。官方推荐 off
    multi_accept on;

    # 配置 一个 woker 进程处理的连接数
    worker_connections 65535;
}
http {
    # 关闭日志
    access_log off;
    # 隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的。
    server_tokens off;
    sendfile on;
    # 设置为非零值时,可限制单个 sendfile() 调用时传输的数据量。如果没有限制,一个快速 连接可能会完全占用工作进程。
    sendfile_max_chunk 5m;
    # tcp_nopush 和 tcp_nodeny 可以一起生效
    # 等数据包累计到一定大小发送,启用 sendfile 生效
    tcp_nopush on;
    # 该选项仅在连接转换到 keep-alive ,长连接状态时启用。让 tcp 尽快发包。
    tcp_nodelay on;
    # 为了尽快释放连接,可以设置小点. 15 至 30
    keepalive_timeout 15;

    # 客户端请求头部的缓冲区大小,默认 1k,当请求接口的时候需要设置 4k 整数倍.内存设置为系统内存页大小,命令 getconf PAGESIZE 内存页大小
    client_header_buffer_size 4k;

    large_client_header_buffers 8 8k;

    # 根据需求设置,接口请求可以设置大些
    client_body_buffer_size 128k;

    # 设置客户端请求体最大允许大小,默认 1m。检查的是 Content-Length。设置为 0 不检查。针对具体 location 配置
    client_max_body_size 1m;


    # 下面这个参数将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
    # inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=262140 inactive=20s;
    # 下面这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_valid 30s;
    # open_file_cache指令中的inactive参数时间内文件的最少访问次数,低于这个数,缓存清除
    open_file_cache_min_uses 1;
    open_file_cache_errors on;

    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;

    # 限制每个 ip 的连接数
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

    # 限制每个 ip 每秒的请求数
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

    gzip on;
    # 在响应头中增加,Vary: Accept-Encoding
    gzip_vary on;
    # gzip压缩级别1-9,数字越大压缩效果越好,压缩时间也就越长CPU越高
    gzip_comp_level 5;
    # 申请内存时大小,如果源文件 9k,超过了 8K,那会申请 16*8K。
    gzip_buffers 8 128k;
    gzip_min_length 5K;
    gzip_proxied any;
    gzip_disable msie6;
    gzip_http_version 1.1;
    # 文本(js、text、css、xml、json)压缩比较好,图片已经进行过压缩,在压缩,效果不是很明显,还浪费 cpu
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss application/rss+xml application/atom+xml image/svg+xml;

    # 安全相关 header
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Feature-Policy "autoplay 'none'; camera 'none'" 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 'self' http: https: data: blob: 'unsafe-inline'" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;


    server {
        listen 80 backlog=262144;

        limit_conn conn_limit_per_ip 10;
        limit_req zone=req_limit_per_ip burst=10 nodelay;
        # assets, media
        location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
            # 强缓存,时间为一年,浏览器和 cdn 中间件可以缓存
            add_header Cache-Control "max-age=31536000";
            etag off;
            access_log off;
            # 禁用文件未找到的错误到日志中去
            log_not_found off;
        }

        # svg, fonts
        location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
            # 强缓存,时间为一年,浏览器和 cdn 中间件可以缓存
            add_header Cache-Control "max-age=31536000";
            etag off;
            access_log off;
            # 禁用文件未找到的错误到日志中去
            log_not_found off;
        }
    }

}

Ссылка на данные

http-security-headers

Настройка производительности Nginx — советы и рекомендации

«Глубокое понимание разработки модулей Nginx и дизайна архитектуры».


Эта статья написанаБлог Чжан Паньциня www.mflyyou.cn/творчество. Ее можно свободно воспроизводить и цитировать, но с обязательной подписью автора и указанием источника статьи.

При перепечатке в публичную учетную запись WeChat добавьте QR-код публичной учетной записи автора в конец статьи. Имя общедоступной учетной записи WeChat: Mflyyou

img