Различия

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

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

каталог_статей:веб-окружение:оптимизация_web-сервера [2015/08/27 12:16] (текущий)
Строка 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}}