Рассмотрены основные настройки для оптимизации производительности веб-сервера nginx, такие как сжатие gzip, настройка proxy_buffer, а также настройки worker-процессов и keep-alive.
В частности, особое внимание уделено важности сжатия gzip и буферизации proxy_buffer для уменьшения объёма передаваемых данных и минимизации нагрузки на сервер, а также управлению соединениями с помощью настроек worker-процессов и keep-alive.
Представлены рекомендации по применению оптимальных настроек для вашей серверной среды на основе различных тестов, а также меры предосторожности для стабильной работы сервера.
Nginx — это сервер с открытым исходным кодом, часто используемый в качестве веб-сервера или веб-прокси-сервера.
При правильной настройке он может эффективно предоставлять статический контент.
В этой статье я хочу записать некоторые основные настройки.
Несколько основных настроек, связанных с производительностью
1. Сжатие gzip
При загрузке веб-сайта браузер получает множество файлов от веб-сервера: JavaScript, изображения, HTML, CSS и другие.
Вместо отправки этого контента в исходном виде, использование сжатия gzip может значительно уменьшить объем передаваемых данных.
Таким образом, при его применении:
- уменьшается объем данных, что экономит полосу пропускания.
- можно сэкономить ресурсы сервера.
- для пользователя фактическая скорость загрузки увеличивается.
С другой стороны, поскольку сервер должен выполнить сжатие gzip перед отправкой ответа, загрузка процессора может увеличиться.
Необходимо обязательно провести тестирование перед внедрением в рабочую среду, чтобы определить, какие типы файлов следует сжимать, уровень сжатия и размер файлов для сжатия.
Ниже приведены некоторые настройки, связанные с gzip.
gzip on; # Включение сжатия gzip.
gzip_vary on; # Добавление заголовка Vary: Accept-Encoding.
gzip_proxied any; # Если nginx используется как прокси-сервер, сжимает ответы, полученные от backend (сжатие для проксированных запросов).
gzip_min_length 256; # Сжатие только файлов размером от 256 байт.
gzip_comp_level 5; # Уровень сжатия от 1 до 9. Чем выше, тем больше загрузка процессора. 5 обеспечивает примерно 50% сжатия.
gzip_types text/plain text/css text/xml application/json application/javascript;
// Указание типов контента для сжатия.
* gzip_vary указывает, что сервер может отправлять сжатую и несжатую версии контента в зависимости от того, поддерживает ли клиент gzip (в зависимости от заголовка Accept-Encoding в запросе клиента).
2. Настройка proxy_buffer
Nginx сохраняет ответ в буфере перед отправкой клиенту.
Когда веб-сервер отправляет ответ клиенту, если клиент работает медленно, сервер должен ждать отправки данных (узкое место в сети).
В это время сервер продолжает использовать ресурсы. Для решения этой проблемы используется буфер для временной обработки ответа независимо от скорости обработки клиента. Это дает следующие преимущества:
- Оптимизация нагрузки на сервер
- Уменьшение узких мест в сети
location / {
proxy_pass адрес_сервера;
# Настройка прокси-буфера
proxy_buffering on; # Включение буферизации.proxy_buffer_size 4k; # Размер буфера(обычно для заголовков).proxy_buffers8 4k; # Количество и размер буферов для каждого соединения(8 буферов по 4 КБ).proxy_busy_buffers_size 8k; # Максимальный размер буфера, доступный при отправке ответа клиенту.}
※ Слишком большой размер буфера может привести к задержкам при потоковой передаче текста (text streaming) и других потоковых данных. Поэтому обязательно нужно провести тестирование. Особенно важно это учитывать для современных сервисов на основе ИИ, где отсутствие потоковой передачи текста может быть критичным.
3. Настройка worker и http
Worker — это процесс, обрабатывающий запросы клиентов. Можно настроить, сколько worker-ов будет на каждый процессорный ядро сервера.
Обычно HTTP-запрос включает этапы: запрос — соединение — ответ — закрытие соединения. Для уменьшения ресурсов, используемых для установления соединения, можно поддерживать клиентское соединение. Это настройка keep alive.
worker_processes auto; # Автоматическая настройка в зависимости от количества доступных ядер CPU.
worker_connections 1024; # Количество одновременных соединений, которые может обрабатывать каждый worker.
# Настройка keep-alive
keepalive_timeout 65;
keepalive_requests 100;
server {
listen 80;
location / {
proxy_pass адрес_сервера;
}
}
Причина объединения этих двух пунктов:
Если на сервере 4 ядра, теоретически возможное количество соединений составляет 1024 * 4 = 4096.
(Это значение может быть неточным в зависимости от ресурсов и сетевого трафика)
Когда 4096 клиентов одновременно подключены и используют keepalive в течение 65 секунд,
4097-й пользователь не сможет подключиться, что может привести к задержке ответа.
Поэтому, предполагая стабильность ресурсов сервера (например, за счет автомасштабирования), если наблюдаются задержки ответа во время пиковых нагрузок, эти настройки могут оказывать косвенное влияние.
4. Другое — блок location
Некоторые настройки, такие как proxy_buffer, можно применять к отдельным URL-адресам.
* Некоторые настройки, такие как keep-alive, применяются на уровне HTTP/Server и не могут быть настроены поблочно.
С помощью этих настроек можно оптимизировать производительность веб-сайта. Проведите тщательное тестирование с различными сценариями, чтобы оптимизировать производительность вашего сервера!
* Изменение настроек nginx обычно может быть применено без простоя сервера, поэтому в большинстве случаев это безопасно.