nginx [engine x] - это HTTP и обратный прокси-сервер, почтовый прокси-сервер и общий TCP/UDP прокси-сервер, первоначально написанный Игорем Сысоевым. Долгое время он работал на многих высоконагруженных российских сайтах, включая Яндекс, Mail.Ru, VK и Rambler.
Совет 1 - Настройте рабочие процессоры и рабочие соединения
Архитектура Nginx состоит из одного главного процессора и нескольких рабочих процессоров. Задача главного процессора - считывать и оценивать конфигурацию, а также управлять рабочими процессорами. Работа рабочего процессора заключается в обработке запросов и установлении соединения между клиентом и сервером.
По умолчанию значение этого параметра установлено на auto (рекомендуется), и он устанавливает количество рабочих процессов в соответствии с количеством доступных ядер CPU в системе. Однако, если на ваш веб-сервер Nginx поступает больше трафика и если вам требуется больше процессоров, то рекомендуется обновить вашу машину до большего количества ядер и перенастроить рабочие процессы в соответствии с новым количеством ядер CPU в вашей системе.
Чтобы выяснить, сколько рабочих процессов нам необходимо, сначала нужно узнать, сколько процессоров имеется в нашей системе. Чтобы узнать, сколько ядер имеется в вашем сервере Nginx, выполните следующую команду.
1 | grep processor /proc/cpuinfo | wc -l |
Затем мы можем внести изменения в параметр "worker_processes" в файле /etc/nginx/nginx.conf
1 | worker_processes auto; |
Рабочие соединения (worker_processes) - это максимальное количество соединений (TCP-сессий), которые каждый рабочий процесс может обрабатывать одновременно. Увеличивая это число, мы можем повысить производительность каждого рабочего процесса. При объединении рабочих процессоров и рабочих соединений вместе, вы получаете максимальное количество клиентов, которые могут быть обслужены в секунду.
Максимальное количество клиентов/секунду = Рабочие процессы * Рабочие соединения
По умолчанию это 512, но большинство систем имеют достаточно ресурсов для поддержки большего числа, а большинство веб-браузеров открывает как минимум два соединения на сервер, это число может уменьшиться вдвое.
Следующая команда скажет вам, сколько открытых файлов ваша система позволяет использовать процессу.
1 | ulimit -a |
Поэтому максимальное число для настройки рабочих соединений - 1024, и лучше всего использовать это значение, чтобы получить полный потенциал от Nginx.
Давайте обновим основной конфиг /etc/nginx/nginx.conf
1 | worker_connections 1024; |
Совет 2 - Включение сжатия Gzip
Gzip - это известное программное приложение, используемое для сжатия и распаковки файлов. Оно может помочь уменьшить объем сетевой передачи, с которой имеет дело Nginx. Включение gzip позволяет сэкономить пропускную способность и улучшить время загрузки сайта на медленных соединениях.
В настоящее время большинство клиентов и серверов поддерживают приложение gzip. Когда gzip-совместимый клиент/веб-браузер запрашивает ресурс у сервера с поддержкой Gzip, сервер сжимает ответ перед отправкой обратно клиенту. Это отличный способ оптимизировать работу сервера Nginx и управлять запросами еще более эффективно.
Общая конфигурация Gzip-сжатия может выглядеть следующим образом. Откройте файл /etc/nginx/nginx.conf
и добавьте следующие директивы внутри блока server.
1 2 3 4 5 6 7 8 9 10 | server { ... gzip on; gzip_vary on; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml; gzip_disable "MSIE [1-6]\."; ... } |
Вот объяснение конфигурации, строка за строкой:
- gzip on; - Включает сжатие gzip.
- gzip_vary on; - Указывает прокси кэшировать как gzip, так и обычную версию ресурса.
- gzip_min_length 1024; - Сообщает NGINX не сжимать ничего, что меньше определенного размера.
- gzip_proxied; - Сжимать данные даже для клиентов, подключающихся через прокси (здесь мы включаем сжатие, если: заголовок ответа включает параметры "expired", "no-cache", "no-store", "private" и "Authorization").
- gzip_types; - Включает типы файлов, которые могут быть сжаты.
- gzip_disable ; - "MSIE [1-6]\."; - отключить сжатие для Internet Explorer версий 1-6.
Совет 3 - Изменение длительности кэширования статического контента на Nginx
Статический контент - это содержимое сайта, которое остается неизменным на всех страницах. Например, это такие файлы, как медиафайлы, документы, CSS и JS файлы. Кэширование - это механизм хранения файлов частого доступа в легкодоступных местах. Включение кэширования позволяет снизить пропускную способность и повысить производительность сайта. Когда запрос клиента поступает на ваш сайт, кэшированная версия будет предоставлена, если она не изменилась с момента последнего кэширования. В главный конфигурационный файл Nginx можно добавить следующие директивы, чтобы указать компьютеру кэшировать статические файлы веб-страницы для более быстрого доступа.
Добавьте следующий раздел в файл /etc/nginx/sites-available/domainname.conf
файл vhost.
1 | location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; } |
В этом примере все файлы .jpg, .jpeg, .png, .gif, .ico, .css и .js получают заголовок Expires с датой 365 дней в будущем от времени доступа браузера.
Совет 4 - Измените размер буферов
Буферы Nginx также имеют определенное значение для оптимизации производительности Nginx. Если размер буфера слишком мал, то Nginx будет писать во временный файл, постоянно выполняя огромные операции ввода-вывода на диск. Чтобы предотвратить это, установите размер буфера соответствующим образом.
Ниже перечислены параметры, которые необходимо настроить в файле /etc/nginx/nginx.conf
для оптимальной производительности:
1 2 3 4 5 6 7 8 | http{ ... client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 4 4k; ... } |
- client_body_buffer_size - Задает размер буфера для чтения тела запроса клиента. Если тело запроса больше буфера, то все тело или только его часть записывается во временный файл.
- client_header_buffer_size - Указывает размер буфера относительно заголовка клиентского запроса.
- client_max_body_size - Устанавливает максимально допустимый размер тела клиентского запроса, указанный в поле заголовка запроса "Content-Length". Если размер в запросе превышает настроенное значение, клиенту возвращается ошибка 413 (Request Entity Too Large).
- large_client_header_buffers - Максимальное количество и размер буферов для больших клиентских заголовков. Строка запроса не может превышать размер одного буфера, иначе клиенту будет возвращена ошибка 414 (Request-URI Too Large).
При указанных выше значениях Nginx будет работать оптимально, но для еще большей оптимизации вы можете подстроить значения и протестировать производительность.
Совет 5 - Сокращение тайм-аутов
Таймауты также значительно повышают производительность Nginx. Соединения keepalive уменьшают затраты процессора и сети на открытие и закрытие соединений.
Ниже перечислены параметры, которые необходимо настроить в файле /etc/nginx/nginx.conf для оптимальной производительности:
1 2 3 4 5 6 7 8 | http { ... client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10; ... } |
- client_header_timeout - Определяет таймаут для чтения заголовка запроса клиента. Если клиент не передает весь заголовок в течение этого времени, запрос завершается с ошибкой 408 (Request Time-out).
- client_body_timeout - Определяет тайм-аут для чтения тела запроса клиента. Таймаут устанавливается только для периода между двумя последовательными операциями чтения, а не для передачи всего тела запроса. Если клиент ничего не передает в течение этого времени, запрос завершается с ошибкой 408 (Request Time-out).
- keepalive_timeout - Время, в течение которого клиентское соединение keep-alive будет оставаться открытым на стороне сервера.
- send_timeout - Устанавливает тайм-аут для передачи ответа клиенту. Если в течение этого времени клиент ничего не получит от сервера, соединение будет закрыто.
Совет 6 - Отключение журналов доступа (если требуется)
Ведение журнала очень важно при устранении неполадок и для аудита. Однако, если включить ведение журнала, он будет занимать большой объем дискового пространства и использовать больше циклов CPU/IO, что снижает производительность сервера, поскольку он регистрирует каждый запрос Nginx, поступающий на сервер.
Есть два варианта решения этой проблемы.
Полностью отключить ведение журнала доступа, что сэкономит дополнительную обработку данных и место на жестком диске.
1 | access_log off; |
Если необходимо вести журнал доступа, то включите буферизацию журнала доступа. Это позволит Nginx буферизировать серию записей журнала и записывать их в файл журнала одновременно, вместо того чтобы выполнять различные операции записи для каждого запроса.
1 | access_log /var/log/nginx/access.log main buffer=16k |
В качестве альтернативного решения вы можете использовать решения с открытым исходным кодом, такие как ELK stack и другие, которые централизуют все журналы для вашей системы.
Совет 7 - Настройте поддержку HTTP/2
HTTP/2 является преемником сетевого протокола HTTP 1.x. HTTP/2 широко используется для снижения задержки, минимизации накладных расходов протокола и добавления поддержки приоритезации запросов, что позволяет веб-приложениям загружаться намного быстрее. Следовательно, жизненно важно оставаться в курсе техники и стратегии оптимизации производительности. Основным направлением HTTP/2 является сокращение общего времени загрузки веб-страниц, что позволяет оптимизировать производительность.
Он также фокусируется на использовании ресурсов сети и сервера, а также на повышении безопасности, поскольку в HTTP/2 шифрование SSL/TLS является обязательным.
В качестве предварительного условия убедитесь, что версия Nginx - 1.9.5 или выше, поскольку он построен с модулем ngx_http_v2_module, иначе вам придется добавить его вручную, а сервер должен включить SSL/TLS.
Теперь ваш блок HTTPS сервера должен выглядеть следующим образом:
1 2 3 4 5 6 | server { listen 443 ssl http2; ... #Удаление старых и небезопасных наборов шифров, если таковые имеются, и добавление следующих. ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; } |