Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

каталог_статей:веб-окружение:оптимизация_web-сервера [2015/08/27 12:16]
каталог_статей:веб-окружение:оптимизация_web-сервера [2022/04/01 15:08] (текущий)
Строка 1: Строка 1:
 +====== Оптимизация настроек web-сервера ======
 +**Применимость:** nginx, Apache\\ 
 +**Слова для поиска:** веб, веб-сервер
 +
 +----
 +===== Задача: =====
 +Увеличение производительности сайта.
 +===== Решение: =====
 +Для увеличения производительности и скорости работы веб-приложения можно произвести оптимизацию веб-сервера, который отвечает за его работу. Распространенными веб-серверами являются nginx и Apache.
 +Параметры, приведенные в данной статье проверены на тестовом приложении и для конкретного проекта должны подбираться опытным путем.
 +Перед началом оптимизации можно проверить скорость загрузки приложения на данном ресурсе http://www.webpagetest.org/
 +
 +===== Оптимизация настроек nginx =====
 +Для начала необходимо сохранить старый конфигурационный файл:
 +<code> cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.back </code>
 +
 +Теперь следует открыть файл конфигурации nginx текстовым редактором:
 +<code> # vim /etc/nginx/nginx.conf </code>
 +
 +Далее приступим к редактированию основных параметров:
 +
 +<code | Максимальное количество одновременных соединений, рекомендованное значение равно количеству ядер процессора в системе:>worker_processes 4;</code>
 +
 +<code | Включение логирования только критических ошибок:> error_log /var/log/nginx/error.log crit </code>
 +
 +<code | Далее необходимо отредактировать блок настроек events:>events {
 +# максимальное число соединений одного рабочего процесса
 +worker_connections 2048;
 +# приём максимально возможного количества соединений
 +multi_accept on;
 +# максимальное значение файловых дескрипторов для nginx, должно быть равным удвоенному 
 +# значению максимального количества клиентов (worker_processes * worker_connections)
 +worker_rlimit_nofile 17000;
 +} </code>
 +
 +<code | Произведем настройки кэширования:>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;</code>
 +
 +<code | Позаботимся о базовой безопасности:># скрыть версию nginx для безопасности
 +server_tokens off;
 +# защита от Poodle
 +ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</code>
 +
 +
 +<code | Настроим отправку данных и заголовков># метод отправки данных, эффективнее чем read + write
 +sendfile on;
 +# Отправка заголовков начала и конца в одном пакете
 +tcp_nodelay on;
 +tcp_nopush on;</code>
 +
 +
 +<code | Включим сжатие контента для уменьшения трафика>
 +# проверка сжатия: 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;</code>
 +
 +
 +<code | Настроим параметры соединений и запросов клиента># ждать перед закрытием 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;
 +}</code>
 +
 +===== Оптимизация настроек Apache =====
 +Для начала сохраним старый конфигурационный файл:
 +<code>cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.back</code>
 +
 +===== Отключение модулей Apache =====
 +Отключайте модули, которые Вам не нужны. Это сэкономит множество ресурсов на обработке запросов. Модули Apache обычно поставляются как плагины (DSO), поэтому их включение и отключение делается через конфигурационный файл.
 +Обычно достаточно следующих модулей: 
 +<code>
 +  * 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.
 +</code>
 +
 +===== MPM =====
 +MPM позволяет выбрать метод обработки параллельных запросов. Оптимальный вариант — Worker — поточный MPM. В нем каждый запрос обслуживается в отдельном потоке одного из дочерних процессов. Потоки — более легкие для ОС объекты, чем процессы. Следовательно, в этом случае производительность повышается.\\ 
 +Для включения Worker MPM, нужно открыть файл:
 +<code># nano /etc/sysconfig/httpd,</code>
 +убрать комментарий со строки
 +<code># HTTPD=/usr/sbin/httpd.worker</code>
 +и перезапустить Apache
 +<code># /etc/init.d/apache2 restart</code>
 +
 +===== Директива MaxClients =====
 +Директива MaxClients устанавливает максимальное количество параллельных запросов, которые будет обрабатывать сервер. Эту настройку нужно адаптировать с течением времени, работайте в пределах значений в 128...4096:
 +MaxClients 128
 +Если сервер уже обслуживает MaxClients запросов, новые запросы попадут в очередь.
 +
 +===== Директива MaxRequestsPerChild =====
 +Директива MaxRequestsPerChild устанавливает сколько запросов может обработать один дочерний процесс/поток прежде чем он будет завершен. По умолчанию значение этой директивы установлено в 0, что означает что однажды созданный процесс/поток не будет завершен никогда. Этот параметр позволяет избавиться от проблем с утечкой памяти, поэтому лучше установить его: 
 +<code># MaxRequestsPerChild 1024</code>
 +После 1024 обработанных запросов процесс будет перезапущен.
 +
 +===== Директива KeepAlive =====
 +KeepAlive запросы позволяют устанавливать постоянные соединения между клиентом и сервером. Это экономит ресурсы на отсутствии повторной установки соединений. Обязательно включайте эту опцию. 
 +<code># keepalive on 
 +# keepalivetimeout 30</code>
 +Включаем 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:
 +<code># /etc/init.d/apache2 restart</code>
 +
 +
 +===== Смотрите также: =====
 +
 +
 +---- 
 +Актуальность: 2015/01/23 10:03 
 +
 +{{tag> nginx apache web}}