Применимость: nginx, Apache
Слова для поиска: веб, веб-сервер
Увеличение производительности сайта.
Для увеличения производительности и скорости работы веб-приложения можно произвести оптимизацию веб-сервера, который отвечает за его работу. Распространенными веб-серверами являются nginx и Apache. Параметры, приведенные в данной статье проверены на тестовом приложении и для конкретного проекта должны подбираться опытным путем. Перед началом оптимизации можно проверить скорость загрузки приложения на данном ресурсе http://www.webpagetest.org/
Для начала необходимо сохранить старый конфигурационный файл:
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; }
Для начала сохраним старый конфигурационный файл:
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.back
Отключайте модули, которые Вам не нужны. Это сэкономит множество ресурсов на обработке запросов. Модули 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 позволяет выбрать метод обработки параллельных запросов. Оптимальный вариант — Worker — поточный MPM. В нем каждый запрос обслуживается в отдельном потоке одного из дочерних процессов. Потоки — более легкие для ОС объекты, чем процессы. Следовательно, в этом случае производительность повышается.
Для включения Worker MPM, нужно открыть файл:
# nano /etc/sysconfig/httpd,убрать комментарий со строки
# HTTPD=/usr/sbin/httpd.workerи перезапустить Apache
# /etc/init.d/apache2 restart
Директива MaxClients устанавливает максимальное количество параллельных запросов, которые будет обрабатывать сервер. Эту настройку нужно адаптировать с течением времени, работайте в пределах значений в 128…4096: MaxClients 128 Если сервер уже обслуживает MaxClients запросов, новые запросы попадут в очередь.
Директива MaxRequestsPerChild устанавливает сколько запросов может обработать один дочерний процесс/поток прежде чем он будет завершен. По умолчанию значение этой директивы установлено в 0, что означает что однажды созданный процесс/поток не будет завершен никогда. Этот параметр позволяет избавиться от проблем с утечкой памяти, поэтому лучше установить его:
# MaxRequestsPerChild 1024После 1024 обработанных запросов процесс будет перезапущен.
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:
# /etc/init.d/apache2 restart
Актуальность: 2015/01/23 10:03