Оптимизация настроек web-сервера

Применимость: nginx, Apache
Слова для поиска: веб, веб-сервер


Задача:

Увеличение производительности сайта.

Решение:

Для увеличения производительности и скорости работы веб-приложения можно произвести оптимизацию веб-сервера, который отвечает за его работу. Распространенными веб-серверами являются nginx и Apache. Параметры, приведенные в данной статье проверены на тестовом приложении и для конкретного проекта должны подбираться опытным путем. Перед началом оптимизации можно проверить скорость загрузки приложения на данном ресурсе http://www.webpagetest.org/

Оптимизация настроек nginx

Для начала необходимо сохранить старый конфигурационный файл:

 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.back 

Теперь следует открыть файл конфигурации nginx текстовым редактором:

 # vim /etc/nginx/nginx.conf 

Далее приступим к редактированию основных параметров:

Максимальное количество одновременных соединений, рекомендованное значение равно количеству ядер процессора в системе:

worker_processes 4;

Включение логирования только критических ошибок:

 error_log /var/log/nginx/error.log crit 

Далее необходимо отредактировать блок настроек events:

events {
# максимальное число соединений одного рабочего процесса
worker_connections 2048;
# приём максимально возможного количества соединений
multi_accept on;
# максимальное значение файловых дескрипторов для nginx, должно быть равным удвоенному 
# значению максимального количества клиентов (worker_processes * worker_connections)
worker_rlimit_nofile 17000;
} 

Произведем настройки кэширования:

http{
# Максимальное количество файлов в кэше
open_file_cache max=200000 inactive=20s;
# Через какое время будет удалён кэш
open_file_cache_valid 30s;
# Кэширование информации использованной хотя бы 2 раза
open_file_cache_min_uses 2;
# Кэширование информации об отсутствующих файлах
open_file_cache_errors on;

Позаботимся о базовой безопасности:

# скрыть версию nginx для безопасности
server_tokens off;
# защита от Poodle
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Настроим отправку данных и заголовков

# метод отправки данных, эффективнее чем read + write
sendfile on;
# Отправка заголовков начала и конца в одном пакете
tcp_nodelay on;
tcp_nopush on;

Включим сжатие контента для уменьшения трафика

# проверка сжатия: http://highloadtools.com/gzip
gzip on;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

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

# ждать перед закрытием keepalive соединения
keepalive_timeout 30;
# максимальное количествоо keepalive запросов от одного клиента
keepalive_requests 100;
# если нет ответа от клиента - сброс соединения
reset_timedout_connection on;
# ждать тело запроса клиента, затем сброс соединения
client_body_timeout 10;
# таймаут при чтении заголовка запроса клиента
client_header_timeout 10;
# если клиент прекратит чтение ответа - сброс соединения
send_timeout 10;
# не принимать запрос размером более 2 Мб
client_max_body_size 2048k;
# максимальный размер буфера для хранения тела запроса клиента
client_body_buffer_size 1k;
# максимальный размер буфера для хранения заголовков запроса клиента
client_header_buffer_size 1k;
# число и размер буферов для чтения большого заголовка запроса клиента
large_client_header_buffers 4 8k;
}

Оптимизация настроек Apache

Для начала сохраним старый конфигурационный файл:

cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.back

Отключение модулей Apache

Отключайте модули, которые Вам не нужны. Это сэкономит множество ресурсов на обработке запросов. Модули Apache обычно поставляются как плагины (DSO), поэтому их включение и отключение делается через конфигурационный файл. Обычно достаточно следующих модулей:

  * mod_alias, 
  * mod_authz_host, 
  * mod_deflate, 
  * mod_dir, 
  * mod_expires, 
  * mod_headers, 
  * mod_mime, 
  * mod_rewrite, 
  * mod_log_config, 
  * mod_autoindex, 
  * mod_negotiation, 
  * mod_setenvif.

MPM

MPM позволяет выбрать метод обработки параллельных запросов. Оптимальный вариант — Worker — поточный MPM. В нем каждый запрос обслуживается в отдельном потоке одного из дочерних процессов. Потоки — более легкие для ОС объекты, чем процессы. Следовательно, в этом случае производительность повышается.
Для включения Worker MPM, нужно открыть файл:

# nano /etc/sysconfig/httpd,
убрать комментарий со строки
# HTTPD=/usr/sbin/httpd.worker
и перезапустить Apache
# /etc/init.d/apache2 restart

Директива MaxClients

Директива MaxClients устанавливает максимальное количество параллельных запросов, которые будет обрабатывать сервер. Эту настройку нужно адаптировать с течением времени, работайте в пределах значений в 128…4096: MaxClients 128 Если сервер уже обслуживает MaxClients запросов, новые запросы попадут в очередь.

Директива MaxRequestsPerChild

Директива MaxRequestsPerChild устанавливает сколько запросов может обработать один дочерний процесс/поток прежде чем он будет завершен. По умолчанию значение этой директивы установлено в 0, что означает что однажды созданный процесс/поток не будет завершен никогда. Этот параметр позволяет избавиться от проблем с утечкой памяти, поэтому лучше установить его:

# MaxRequestsPerChild 1024
После 1024 обработанных запросов процесс будет перезапущен.

Директива KeepAlive

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

# keepalive on 
# keepalivetimeout 30
Включаем KeepAlive и устанавливаем время ожидания перед закрытием соединения в 30 секунд. Бывают случаи, когда пользователь отправляет только один запрос. Например, download-сервер. Тогда KeepAlive может быть бесполезен и даже вреден, т.к. при включенном KeepAlive сервер закрывает соединение не сразу, а ждет какое-то время (KeepAliveTimeout).

Включение сжатия

Все современные браузеры поддерживают сжатие. Включение gzip существенно уменьшит размер трафика.

<code>* AddOutputFilterByType DEFLATE text/plain 
* AddOutputFilterByType DEFLATE text/html 
* AddOutputFilterByType DEFLATE text/xml 
* AddOutputFilterByType DEFLATE text/css 
* AddOutputFilterByType DEFLATE application/xml 
* AddOutputFilterByType DEFLATE application/xhtml+xml 
* AddOutputFilterByType DEFLATE application/rss+xml 
* AddOutputFilterByType DEFLATE application/javascript 
* AddOutputFilterByType DEFLATE application/x-javascript </code>

Завершение настройки Apache

После применения всех параметров необходимо перезапустить веб-сервер Apache:

# /etc/init.d/apache2 restart

Смотрите также:


Актуальность: 2015/01/23 10:03