Быстрая оптимизация настроек веб сервера Apache и Nginx. Использование не слишком «долгих» KeepAlive


Мальчик может обижать симпатичную ему девочку, дергать за волосы, дразнить и отнимать школьные принадлежности.

В таком случае лучше поговорить с ним без свидетелей и объяснить, что подобное поведение вам не нравится.

У одноклассницы

Признаки симпатии у девочек:

Можно ли понравиться девочке за 1 день?

У вас не будет второго шанса произвести первое впечатление.

Если вы ранее не общались с девушкой в неформальной обстановке (все контакты происходили только в условиях групповых школьных игр, уточнения учебных вопросов и т.д.), то у нее еще нет твердого представления о вас как о личности .

В таком случае можно устроить разговор в неформальной обстановке и показать себя с лучшей стороны, сформировав у любимой положительное первое впечатление.

Придется заранее подготовить условия : предложить проводить до дома, пригласить на прогулку или позвать на свидание. Если не получается перебороть стеснение и открыто позвать на свидание, можно попросить помочь с уроками после школы, ссылаясь на ее хорошие оценки по предмету.

Желательно также заранее узнать круг интересов девочки, чтобы без труда поддерживать интересную беседу. Получить информацию можно как от подруг, так и вовремя коллективных бесед на переменах (важно лишь внимательно прислушаться к темам, которые обсуждает девочка).

Как понравиться однокласснице или девочке из параллельного класса? Для того, чтобы произвести впечатление на девушку, иногда достаточно просто начать с ней разговор.

Как понравиться однокласснику и выйти из френдзоны? Узнайте из видео:

Наша интересная группа Вконтакте.

Введение

По данным Netcraft, Apache — самый популярный веб-сервер в интернет, он
обслуживает множество серверов и сайтов. Часто возникает необходимость
увеличить производительность веб-сервера. Наверное лучший способ это
сделать — перейти к схеме frontend+backend, но это может потребовать
достаточно серьезных изменений в приложении (например, у вас наверняка
отвалятся всяческие индикаторы прогресса аплоада файлов).

Другой способ — просто увеличить производительность сервера — поставить
более быстрый процессор и больше памяти.

Однако и первое и второе требует много времени и ресурсов, так что на
первое время можно попробовать ускорить apache путем оптимизации его
конфигурации. Существуют оптимизации, которые можно применить только
при пересборке apache, другие же можно применять без перекомпиляции
сервера.

Загружайте только необходимые модули

Apache — модульная программа, бОльшая часть функций которой реализуется
в модулях. При этом эти модули могут быть как вкомпилированы, так и
собраны в виде DSO — динамических библиотеках. Большинство современных
дистрибутивов поставляет apache с набором DSO, так что не нужные модули
можно легко отключить без перекомпиляции.

Запускайте apache только с необходимыми модулями, чтобы уменьшить
потребление памяти. Если вы решили скомпилировать apache
самостоятельно, то либо тщательно подходите к выбору списка модулей,
которые вы включите, либо компилируйте их как DSO используя apxs в
apache1 и apxs2 в apache2. Для того чтобы отключить ненужные
DSO-модули, достаточно закомментировать лишние строчки LoadModule в
httpd.conf. Apache со статически скомпилированными модулями будет
потреблять чуть меньше памяти, однако вам придется каждый раз его
перекомпилировать для изменения списка модулей.

Выберете подходящий MPM

В apache каждый запрос обрабатывается в своем процессе или потоке. При
компиляции apache позволяет выбирать один из нескольким MPM
(Multi-processing module), которые отвечают за прослушивание портов,
прием запросов и раздачу этих запросов дочерним процессам или потокам,
в которых эти запросы будут обработаны.

Выбор MPM зависит от нескольких факторов, таких как наличие поддержки
потоков в ОС, количества свободной памяти, а также требований
стабильности и безопасности.

Если безопасность очень важна, следует выбрать peruser MPM, пожертвовав
производительностью.

Если важна именно производительность, то выбор ограничивается двумя
mpm: prefork и worker.

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

Perfork — mpm использует несколько дочерних процессов, каждый дочерний
процесс обрабатывает одно подключение. Из-за того что процесс — более
тяжелая структура, он использует немного больше ресурсов, зато он менее
подвержен сбоям — обработка каждого отдельного запроса не зависит от
других процессов.

К сожалению, для смены mpm требуется перекомпиляция apache. Тут
проявляют свои достоинства source-based дистрибутивы: вы можете легко
перекомпилировать apache и все зависимые от него пакеты, не превратив
систему в свалку. Бинарные дистрибутивы выходят из этой ситуации
по-разному. Например в RHEL в apache rpm находится сразу две версии
apache — с worker и prefork mpm (prefork используется по умолчанию).
Однако worker mpm не поддерживает php. Так что если вы хотите php и
worker mpm вам придется компилировать его самостоятельно либо искать
сторонние репозитории.

DNS lookup

Директива HostnameLookups включает reverse DNS запросы, так что в логи
будут попадать dns-хосты клиентов вместо ip-адресов. Разумеется, что
это существенно замедляет обработку запроса, т.к. запрос не
обрабатывается пока не будет получит ответ от DNS-сервера. Поэтому
следите чтобы эта директива всегда была выключена (HostnameLookups
Off), а если вам все-таки нужны dns-адреса, вы можете узнать их позже,
прогнав лог в утилите logresolve (которая поставляется с apache).

Кроме того, следите чтобы в директивах Allow from и Deny From
использовались ip-адреса а не доменные имена. Иначе apache будет делать
два dns запроса (обратный и прямой) чтобы убедиться что клиент-тот за
кого себя выдает.

AllowOverride

Если директива AllowOverride не установлена в ‘None’, apache будет
пытаться открыть.htaccess файлы в каждой директории которую он
посещает и во всех директориях выше нее. Например:


DocumentRoot /var/www/html

AllowOverride all

Если будет запрошен /index.html, apache попытается открыть (и
интерпретировать) файлы /.htaccess, /var/.htaccess, /var/www/.htaccess,
и /var/www/html/.htaccess. Это увеличивает время обработки запроса. Так
что, если вам нужен.htaccess только для одной директории, разрешайте
его только для нее:

DocumentRoot /var/www/html

AllowOverride None


AllowOverride all

FollowSymLinks и SymLinksIfOwnerMatch

Если для директории включена опция FollowSymLinks, сервер будет
следовать по символическим ссылкам в этой директории. Если для
директории включена опция SymLinksIfOwnerMatch, apache будет следовать
по символическим ссылкам только если владелец файла или директории, на
которую указывает эта ссылка совпадает с владельцем указанной
директории. Так что при включенной опции SymLinksIfOwnerMatch apache
делает больше системных запросов.

Кроме того, дополнительные системные запросы требуются когда
FollowSymlinks НЕ УСТАНОВЛЕН. Т.о. наиболее оптимальная ситуация для
производительности — когда опция FollowSymlinks включена.

Content Negotiatio

Старайтесь избегать content negotiaion.

MaxClients

Директива MaxClients устанавливает максимальное количество параллельных
запросов, которые будет поддерживать сервер. Apache не будет порождать
больше процессов/потоков чем MaxClients. Значение MaxClient не долно
быть слишком маленьким (иначе много клиентов останутся необслуженными),
но и не стоит устанавливать слишком большое количество — лучше не
обслужить часть клиентов чем исчерпать все ресурсы, залезть в своп и
умереть под нагрузкой. Хорошим может быть значение MaxClients =
количество памяти выделенное под веб-сервер / максимальный размер
порожденного процесса или потока. Для статических файлов apache
использует около 2-3 Мб на процесс, для динамики (php, cgi) — зависит
от скрипта, но обычно около 16-32 Мб.

Вы можете прикинуть примерный размер посмотрев на колонку rss в выводе
`ps -ylC httpd —sort:rss`

Если сервер уже обслуживает MaxClients запросов, новые запросы попадут
в очередь, размер которой устанавливается с помощью директивы
ListenBacklog.

MinSpareServers, MaxSpareServers, и StartServers

Т.к. создание потока, и особенно процесса — дорогая операция, apache
создает их заранее. Директивы MaxSpareServers и MinSpareServers
устанавливают как много процессов/потоков должны ожидать в готовности
принять запрос (максимум и минимум). Если значение MinSpareServers
слишком маленькое и неожиданно приходит много запросов, apache вынужден
будет создавать много новых процессов/потоков, что создаст
дополнительную нагрузку в этой стрессовой ситуации. С другой стороны,
если MaxSpareServers слишком велико, apache будет сильно нагружать
систему этими процессами, даже если количество клиентов минимально.

Постарайтесь установить такие MinSpareServers и MaxSpareServers, чтобы
apache не создавал более 4 процессов/потоков в секунду. Если он создаст
более 4, в ErrorLog будет помещено сообщение об этом. Это — сигнал того
что MinSpareServers слишком мало.

MaxRequestsPerChild

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

KeepAlive и KeepAliveTimeout

KeepAlive позволяет делать несколько запросов в одном TCP-подключении.
Это особенно полезно для html-страниц с большим количеством
изображений. Если KeepAlive установлен в Off, то для самой страницы и
для каждого изображения будет создано отдельное подключение (которое
нужно будет обработать master-процессу), что плохо и для сервера и для
клиента. Так что для подобных случаев рекомендуется устанавливать
KeepAlive в On. Для других применений (например для download-сервера)
KeepAlive может быть бесполезен и даже вреден, т.к. при включенном
KeepAlive сервер закрывает соединение не сразу, а ждет KeepAliveTimeout
секунд нового запроса. Для того чтобы процессы не висели слишком долго
в бесполезном ожидании, устанавливайте KeepAliveTimeout достаточно
малым, около 5-10 секунд обычно достаточно.

Сжатие

HTTP-сжатие было определено в стандарте HTTP/1.1, и сейчас все
современные клиентские программы и практически все сервера его
поддерживают. Сервер может отдавать ответ в gzip или deflate, а
клиентская программа незаметно для пользователя разжимает данные. Это
уменьшает количество передаваемого трафика (до 75%), но конечно же
повышает использование процессора.
Однако если ваш сервер посещает много клиентов с медленным подключение,
сжатие может снизить нагрузку с вашего сервера из-за того что сервер
сможет быстрее передать сжатый ответ и освободить ресурсы, занятые
дочерним процессом. Особенно сильно этот эффект может быть заметен если
у вас быстрый процессор, но мало памяти.

Кеширование конфигурируется директивами модуля mod_deflate. Имейте в
виду, что не следует устанавливать степень сжатия gzip более 4-5 — это
потребует существенно большего времени CPU, а эффект будет достаточно
невелик. Ну и разумеется не нужно пытаться сжать изображения в jpg, gif
и png, музыку, видео файлы и все другие бинарные файлы, которые уже и
так хорошо сжаты.

Кеширование на стороне клиента

Не забывайте устанавливать Expires заголовки на статические файлы (см.
модуль mod_expires). Если файл не изменяется, то его всегда следует
попробовать закешировать на клиенте. Тогда у клиента будут быстрее
загружаться страницы, а сервер освободится от лишних запросов.

Популярность веб-страницы – не только благо, но и дополнительная головная боль сисадмина. Возрастая, поток посетителей создает большую нагрузку на сервер, который со временем перестает справляться со своими обязанностями. В этот момент встает вопрос о покупке железа, который, тем не менее, можно отложить до лучших времен. Из этой статьи ты узнаешь, как заставить сервер выдерживать нагрузки даже тогда, когда он отказывается это делать.

Популярность веб-страницы - не только благо, но и дополнительная головная боль сисадмина. Возрастая, поток посетителей создает все большую нагрузку на сервер, который со временем просто перестает справляться со своими обязанностями. В этот момент встает вопрос о покупке железа, который, тем не менее, можно отложить до лучших времен. Из этой статьи ты узнаешь, как заставить сервер выдерживать нагрузки даже тогда, когда он отказывается это делать.

Допустим, ты имеешь в своем распоряжении веб-сервер, на котором крутится более-менее посещаемый динамический веб-сайт, созданный на базе одной из PHP’шных CMS. В общем, самая типичная для современного рунета ситуация. Сайт развивается, растет, посетителей становится все больше, и ты начинаешь замечать постепенно возрастающие задержки в скорости отдачи контента. Простейшие замеры показывают, что сервер уже не справляется с возложенными на него задачами, и в голову начинают закрадываться порочные мысли о покупке железа (аренде более мощного виртуального сервера). Но спешить не стоит, в большинстве случаев ситуацию легко обратить в свою пользу.

Эта статья расскажет тебе о том, как оптимизировать сервер и клиентскую часть веб-сайта под высокую нагрузку. В ходе обсуждения мы затронем следующие темы:

  • Оптимизация Apache;
  • Оптимизация PHP;
  • Установка eAccelerator;
  • Установка Nginx в качестве фронт-энда;
  • Установка Memcached;
  • Клиентская оптимизация.

Оптимизация Apache

Корневой компонент большинства современных веб-сайтов - это, конечно же, Apache. Он зарекомендовал себя как наиболее функциональный, стабильный и удобный в использовании HTTP-сервер, который можно использовать как для обслуживания домашней веб-страницы, так и для высоконагруженных корпоративных интернет-проектов. Одна проблема: Apache - очень тяжелое приложение, жадное до ресурсов сервера.

И это должно быть учтено при его настройке. Вот список рекомендаций, которые лучше выполнять при подготовке HTTP-сервера к работе:

  • Львиная доля функционала Apache вынесена в загружаемые модули, которые можно активировать или отключить путем редактирования конфигурационного файла (директива LoadModule). Хорошей практикой является тотальное отключение всех неиспользуемых модулей, что позволит повысить производительность сервера и сохранить оперативную память.
  • Apache обрабатывает каждый новый запрос в собственном потоке исполнения и позволяет использовать разные подходы для выполнения этой операции. Если ты собирал Apache2 из исходников, то мог заметить, что в опциях сборки присутствует возможность выбора так называемого MPM. Это и есть модуль мульти-процессинга (Multi-processing module), используемый для распараллеливания HTTP-сервера.

Всего их существует три:

  1. prefork - классический MPM, реализующий модель мульти-процессинга, используемую в Apache 1.3. Каждый поток обрабатывается в отдельном процессе. Не самый производительный вариант, но наиболее стабильный. Используется по умолчанию.
  2. worker - MPM, основанный на потоках. Сервер порождает несколько процессов, по несколько потоков в каждом. Один запрос - один поток. Производительнее prefork, но менее стабилен.
  3. event - событийный MPM. Вместо потоков запросы обрабатываются, используя событийную модель, похожую на ту, что применяется в nginx. Наиболее производительный MPM, но и наименее стабильный (находится в экспериментальной стадии разработки).

Многие дистрибутивы позволяют устанавливать разные варианты Apache, различающиеся используемым MPM, их легко можно найти в репозитории по запросу «apache2-mpm».

  • Apache позволяет контролировать максимальное количество порождаемых потоков с помощью опции MaxClients. Не стоит устанавливать ее значение слишком большим, иначе в определенный момент сервер исчерпает всю оперативную память, начнет свопить, и необслуженными останутся гораздо больше клиентов, чем было бы при задании жесткого ограничения. Оптимальным считается значение, равное количеству памяти, доступной Apache, поделенное на максимальный размер порожденного потока (проверяется с помощью ps или top).
  • Как и многие другие HTTP-серверы, Apache позволяет контролировать длительность удержания соединений типа keep-alive, используемых для передачи нескольких запросов/ответов в рамках одного соединения. Keep-alive позволяет экономить ресурсы сервера, не вынуждая его создавать отдельный поток на каждую картинку, CSS и прочие элементы страницы. Однако слишком долго такое соединение держать открытым не стоит, потому как на это тоже уходят ресурсы. Хорошим значением опции KeepAliveTimeout будет 5-10 секунд, причем, если все зависимые компоненты страницы отдаются клиенту отдельными серверами, а текущий сервер используется только для отдачи HTML/PHP, необходимость поддержки keep-alive отпадает вовсе, и значение опции KeepAlive лучше установить в Off.
  • Apache не любит сжатие. Если ты решил увеличить скорость отдачи страниц с помощью сжатия, то имей в виду, что, скорее всего, оно создаст еще большую нагрузку на сервер. Если же сжатие действительно необходимо (например, для мобильного портала, основной поток клиентов которого использует канал GPRS), то устанавливай коэффициент сжатия минимальным, это приведет лишь к незначительному росту объема результирующих данных, зато позволит существенно сэкономить ресурсы сервера.

Оптимизация PHP

Зачастую наибольшая нагрузка создается вовсе не HTTP-сервером, а интерпретатором языка программирования, используемого для создания динамического содержимого веб-сайта. Сегодня наиболее популярным языком для серверного веб-скриптинга является PHP, поэтому именно ему мы уделим внимание в нашей статье. Открываем файл /etc/php5/ apache2/php.ini (путь для Ubuntu, в других дистрибутивах может быть иным) и редактируем следующие строки:

  • memory_limit - лимит на съедаемую при генерации веб-страницы память. Перед изменением этого параметра рекомендуется выполнить соответствующие замеры и основывать значение уже на их результатах.
  • display_errors = Off, error_log = /var/log/php - перенаправлять сообщения об ошибках в log-файл. Включай этот параметр тогда, когда все скрипты будут полностью отлажены.
  • upload_max_filesize и post_max_size - максимальный размер загружаемых файлов и POST-запросов. Опять же, значение должно быть выбрано исходя из потребностей твоего веб-приложения.

Теперь можно закрыть файл и выполнить глубокую оптимизацию с помощью PHP-ускорителя.

Установка Eaccelerator

PHP - язык интерпретируемый. Это значит, что каждый раз, когда происходит вызов скрипта на этом языке, запускается PHP-интерпретатор, который проводит полный анализ исходного кода. Причем, если спустя секунду произойдет второй запуск того же скрипта, вся процедура будет повторена заново. Это нерациональное использование ресурсов, поэтому мы применим инструмент под названием eAccelerator, который скомпилирует исходные тексты PHP в двоичное представление, оптимизирует их и будет бережно хранить в оперативной памяти для более быстрого доступа. Благодаря только этому скорость обработки PHP-скриптов вырастет в десятки раз (подтверждено тестами).

Пакета eAccelerator нет в репозиториях популярных дистрибутивов, поэтому его придется собрать самостоятельно. Сначала устанавливаем необходимые для сборки утилиты:

$ sudo apt-get install php5-dev build-essential

$ cd /tmp/
$ wget http://bart.eaccelerator.net/source/0.9.6.1/
eaccelerator-0.9.6.1.tar.bz2
$ tar xvjf eaccelerator-0.9.6.1.tar.bz2
$ cd eaccelerator-0.9.6.1
$ phpize
$ ./configure --enable-eaccelerator=shared
$ make
$ sudo make install

Создаем каталог для хранения кэша:

$ sudo mkdir -p /var/cache/eaccelerator
$ sudo chmod 0777 /var/cache/eaccelerator
И, наконец, подключаем eAccelerator к PHP (добавить в начало файла):
# vi /etc/php5/apache2/php.ini
; Подключаем расширение
extension = "eaccelerator.so"
eaccelerator.enable = "1"
; Максимальный размер дискового кэша (Мб)
eaccelerator.shm_size = "64"
; Каталог для хранения кэша
eaccelerator.cache_dir = "/var/cache/eaccelerator"
; Включаем оптимизатор кода
eaccelerator.optimizer = "1"
; Перекомпилировать модифицированные скрипты
eaccelerator.check_mtime = "1"
; Отключаем режим отладки
eaccelerator.debug = "0"
; Кэшировать все файлы (пустой фильтр)
eaccelerator.filter = ""
; Неограниченный размер кэша в памяти
eaccelerator.shm_max = "0"
; В случае отсутствия места в кэше удалять объекты старше
1 часа (3600 секунд)
eaccelerator.shm_ttl = "3600"
eaccelerator.shm_prune_period = "0"
; Кэшировать данные и в памяти, и на диске
eaccelerator.shm_only = "0"
; Сжимать кэшированные данные с максимальным уровнем компрессии
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"

Установка nginx

Будучи популярным, большой динамический веб-сайт может создать такую нагрузку на сервер, что Apache начнет «захлебываться и плеваться».

И дело тут даже не в том, что железо не позволяет, а в тяжеловесности самого HTTP-сервера. Apache отлично подходит для отдачи динамического контента, однако большая часть современных веб-страниц так или иначе состоит из статики, и использовать для их отдачи мощный, сложный и очень тяжелый HTTP-сервер было бы так же глупо, как ездить на вездеходе по дорогам Швейцарии. Мы воспользуемся легковесным HTTP-сервером Nginx для разгрузки Apache и его освобождения от неблагодарного занятия отдачей статического контента. В отличие от Apache, Nginx использует событийную модель обработки запросов, благодаря чему на любое количество клиентов требуется всего один процесс HTTP-сервера.

Это существенно снижает нагрузку на железо, но создает определенные проблемы при обработке динамического контента (именно поэтому его не используют в качестве основного HTTP-сервера). Обычно Nginx устанавливают на выделенную машину, которая смотрит во внешнюю сеть и выступает в качестве первого чекпоинта на пути следования запросов, однако допустим и вариант с одним физическим сервером, когда Apache и Nginx крутятся на одной машине. Остановимся на нем. Открываем файл /etc/apache2/ports.conf и изменяем две опции:

NameVirtualHost *:81
Listen 81
Далее устанавливаем Nginx:
$ sudo apt-get install nginx
Открываем конфигурационный файл и пишем в него следующее:
# vi /etc/nginx/nginx.conf
# Nginx-пользователь
user www-data;
# Количество Nginx-процессов ставим равным количеству
процессорных ядер
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# Стандартные настройки
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
# Включаем сжатие
gzip on;
gzip_proxied any;
gzip_min_length 1100;
gzip_http_version 1.0;
gzip_buffers 4 8k;
gzip_comp_level 9;
gzip_types text/plain text/css application/
x-javascript text/xml application/xml
application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

Создаем конфиг нашего хоста:

# vi /etc/nginx/sites-enabled/host.com
server {
listen 80;
server_name host.com;
access_log /var/log/nginx.access_log;
# Всю статику Nginx отдает самостоятельно
location ~* \.(jpg|jpeg|gif|png|css|js|zip|
tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bm
p|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {
root /var/www/host.com/;
index index.html index.php;
access_log off;
expires 30d;
}
# Доступ к файлам типа.htaccess запрещен
location ~ /\.ht {
deny all;
}
# Все запросы ко всему остальному контенту передаем Apache
location / {
proxy_pass http://127.0.0.1:81/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_
addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}

Все, перезапускаем Apache и Nginx:

$ sudo service apache2 restart
$ sudo service nginx restart

Установка memcached

Memcached - система кэширования данных в оперативной памяти, которая может быть использована для распределенного хранения и ускорения доступа к данным любого типа.
Это одно из самых популярных решений в области тотальной оптимизации веб-сайта для высоких нагрузок, не требующее настройки и долгого изучения API. Обычно memcached используется, так сказать, двумя сторонами, одна из которых помещает данные в кэш, а другая - извлекает. В веб-среде роль первой стороны обычно играет небольшой PHP-скрипт, который записывает важные (с точки зрения скорости отдачи) данные в memcached, в то время как вторая сторона - это обычно легковесный фронт-энд сервер (как правило, nginx), использующий специальный модуль для чтения и отдачи данных из memcached. Часто memcached используется для кэширования всех страниц веб-сайта целиком, благодаря чему скорость доступа к этим страницам возрастает на несколько порядков. В простейшем случае такая конфигурация выглядит следующим образом:

1. Устанавливается memcached:

$ sudo apt-get install memcached

2. В секцию server конфигурационного файла nginx добавляе тся примерно следующее:

# vi /etc/nginx/nginx.conf
location / {
# Устанавливаем ключ memcached, равный запрашиваемому
URI
set $memcached_key $uri;
# Адрес и порт демона memcached
memcached_pass 127.0.0.1:11211;
# Заголовок по умолчанию
default_type text/html;
# Если данные в кэше не найдены - запрашиваем их у бэкэнда
error_page 404 = /fallback;
}
location /fallback {
proxy_pass backend;
}

3. Для PHP устанавливается расширение memcache (клиент к memcached):

$ sudo pecl install memcache

4. В страницы встраивается примерно такой код:

$ vi smaple.php
# Инициализация memcached опущена
ob_start();
$html = ob_get_clean();
$memcache->set($_SERVER["REQUEST_URI"], $html);
echo $html;

Все это отлично работает, но только в отношении очень простых, почти статических веб-сайтов. Дело в том, что страница не всегда должна быть одинаковой для всех посетителей. Что если главная страница будет закэширована при входе на сайт гостя, а после него на сайт придет зарегистрированный участник, которому вновь предложат зарегистрироваться.
Непорядок. Однако есть достаточно простой выход из этой ситуации. Проблему может решить покрытая мхом и паутиной технология под названием SSI (Server Side Includes). SSI позволяет разбить веб-страницу на несколько блоков, которые будут собраны фронт-эндом воедино в момент обработки запроса клиента. Например, используя SSI, ты делишь главную страницу веб-сайта на две части:

# vi /var/www/index.php





Это ровно та же страница, код аутентификации которой вынесен в файл auth.php, а вся остальная часть - в body.php. Изюминка же заключается в том, что приведенный выше в четвертом шаге код кэширования ты помещаешь только во второй из этих файлов. Как результат вырисовывается следующая картина:

  1. Человек приходит на сайт в первый раз. Происходит запрос главной страницы веб-сайта к nginx.
  2. Сервер nginx запрашивает файл index.php у бэк-энда (Apache), встречает внутри него SSI-директивы и делает еще *2* запроса к бэк-энду (auth.php и body.php).
  3. Получив запросы, Apache запускает PHP-интерпретатор для обработки запрашиваемых файлов, в результате чего (кроме всего прочего) содержимое тяжелого файла body.php попадает в кэш memcached.
  4. Ответ возвращается nginx, который объединяет файлы в один index. php и отдает их клиенту.
  5. После этого на сайт приходит зарегистрированный участник, происходит запрос index.php у бэк-энда (хотя, скорее всего, он будет взят из кэша самого nginx), однако к Apache уйдет только запрос простого и легкого auth.php, тогда как body.php будет взят из кэша memcached.

Само собой разумеется, SSI необходимо активировать в конфигурационном файле nginx с помощью опции «ssi on», помещенной в секцию «location /». Стоит отметить, что блок auth.php также поддается кэшированию, но для этого придется присваивать всем зарегистрированным пользователям идентификатор, сохранять его в кукисах и использовать для генерации уникального ключа memcached.

Клиентская оптимизация

Эта статья посвящена серверной оптимизации веб-сайтов, однако было бы кощунством не рассказать и о клиентской части этого процесса. Поэтому мы кратко пробежимся по списку рекомендаций, направленных на минимизацию общего объема передаваемых данных:

  1. Используй gzip или deflate для сжатия страниц и данных. Для этого можно задействовать модули HTTP-серверов: ngx_http_gzip_module для nginx, mod_compress для lighttpd и mod_deflate для Apache.
  2. Используй упаковщики для оптимизации и удаления лишнего мусора из HTML и JavaScript (обычно они удаляют все комментарии и пробелы, заменяют имена на более короткие и т.д., например, web-optimizator, code.google.com/p/web-optimizator).
  3. Выноси CSS и JavaScript-код в отдельные файлы, тогда они смогут быть закэшированы браузером и применены к другим страницам (также их можно разместить на отдельном сервере, чтобы их загрузка происходила параллельно).
  4. Для более плавной и корректной загрузки страницы браузером размести загрузку CSS в начале страницы, а JavaScript - в конце.
  5. Не забывай устанавливать заголовки Expires и Cache-control, чтобы CSS и JavaScript могли быть закэшированы браузером.
  6. Не применяй JPG и PNG тогда, когда можно обойтись GIF (например, для мелких иконок).

Балансировка

Round robin DNS - один из самых простых видов балансировки нагрузки. Для ее реализации достаточно присвоить IP-адреса двух или более серверов одному доменному имени. Однако, есть и существенный минус: если один из серверов выйдет из строя, часть клиентов все равно будут отправлены к нему.

memcached

При наличии достаточно больших объемов памяти хорошей практикой будет запуск демона memcached с флагом ‘-L’. В результате демон заранее подготовит к использованию всю выделенную ему память. Это немного поднимет общую производительность работы memcached за счет исключения необходимости производить постоянные выделения памяти во время работы.

Если вы решили увеличить производительность Apache (а на сегодняшний день это – один из самых популярных веб-серверов Сети), то вам пригодятся те советы, которые мы собираемся дать в этой статье.

1. Работайте только с действительно нужными вам модулями, а все остальное, сразу же и не задумываясь, удаляйте! Дело в том, что в этом случае вы сразу же уменьшите потребления памяти, что и повлечет за собой увеличение скорости. Второй вариант – скомпилировать модули как DSO, при помощи apxs (в apache 1) и apxs 2 в (apache 2), что сократить скорость работы примерно на 11-15%.

2. Правильно выберите MPM (Multi-processing module). Так как главная задача MPM – прослушивать порты, соответствующие установленным требованиям по безопасности, количеству свободной памяти или наличии поддержки потоков в ОС, то следует ограничить выбор на двух MPM – worker и prefork.

Worker – переносит обслуживание запросов в отдельный поток.

Perfork - работаете с несколькими дочерними процессами, каждый из которых отвечает за обработку одного подключения.

Чтобы сменить MPM, вы должны будете перекомпилировать apache при помощи source-based, что сразу же улучшит скорость работы всей системы.

3. Настройка DNS запросов. Во-первых, включите директиву «HostnameLookups» . Во-вторых, сделайте так, чтобы Allow from и Deny From директивах использовались не доменные имена, а IP-адреса, чтобы избавить apache от двойных запросов, которые он будет делать для того, чтобы проверять достоверность данных клиента.

4. Установить AllowOverride директиву в режим «None», иначе apache будет открывать (или пытаться сделать это) все htaccess-файлы в каждой посещаемой директории, а так же файлы выше ее:

Потому если вам нужен.htaccess только какой-нибудь одной директории, то поступите так:

Так же нужно отметит, что при включении для директории:

FollowSymLinks - сервер всегда будет следовать по символическим ссылкам в данной директории;

SymLinksIfOwnerMatch – сервер будет отслеживать ссылки только в случае если данные владельца директории совпадают с данными владельца директории, на которую указывает ссылка.

5. Так же откажитесь от Content Negotiatio.

6. Правильно задайте параметры MaxClients, определяющий количество одновременно обрабатываемых запросов. Найдите для себя оптимальное значение MaxClients, чтобы обслуживать оптимальное число клиентов. При этом следует помнить, что для статических файлов apache требуется 2-3 Мб на процесс, для динамики - 16-32 Мб.

7. Установка MinSpareServers, MaxSpareServers, и StartServers – а она должна привести к тому, чтобы apache отказался от создания 4-х потоков/процессов в 1-у секунду, что позволит не перегружать систему даже при максимальном числе клиентов.

8. Измените значение MaxRequestsPerChild при определении того, сколько запросов должен обработать 1 дочерний поток/процесс до своего завершения. Помните, что это значение (по умолчанию) выставлено как «ноль», потому лучше изменить его на 1000 и больше, что избавит вас от утечки памяти в дочерние процессы, что имеет огромное значение при использовании нестабильной версию PHP.

9. Активируйте KeepAlive и KeepAliveTimeout, которые в отключенном режиме создают отдельный поток для каждого размещенного на html-странице изображения, и «тормозит» страницы с большим числом изображений большого размера. В случаях с download-серверами KeepAlive лучше отключить, что сразу же избавит вас от долго ожидания перед закрытием сервером соединений.

10. Используйте сжатие, что позволит вам уменьшить количество передаваемого трафика на 75 процентов. И делайте это без всякой опаски, так как на сегодня все новейшие клиентские программы и сервера поддерживают HTTP-сжатие в стандарте HTTP/1.1. А постарастья сжать следует видео, музыку, и все jpg, gif png файлы.

Следует отметить, что параметры кэширование задаются директивами модуля mod_deflate. При этом не стоит устанавливать степень сжатия gzip более 4 или 5, так как это увеличит время CPU, и снизит общий эффект.

11. И конечно же не забывайте устанавливать на статических файлах (для этого применяется модуль mod_expires) Expires заголовки. Или закэшируйте его на клиенте в том случае, если файл не изменяется, что освободит сервер от лишних запросов, а клиент получит более быстро загружаемую страницу.

На новых VPS часто появляются проблемы с производительность работы Apache. Дело в том, что конфигурационные файлы которые создаются после установки Apache далеко не оптимизированы.

Симптомы плохой настройки могут быть работа VPS с обжорством RAM на 100% или CPU на 100%. После выполнения команды top или htop (если не работает выполните apt-get install htop) на первых строках будет процесс apache.

Я покажу оптимальный конфиг. файл для VPS

Оперативная память : 512 MB

Процессор : 2267 MHz

ОС : Debian 5

# # Timeout: The number of seconds before receives and sends time out. # Timeout 300 # # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100 # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 15 ## ## Server-Pool Size Regulation (MPM specific) ## # prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves StartServers 3 MinSpareServers 3 MaxSpareServers 10 MaxClients 100 MaxRequestsPerChild 0 # worker MPM # StartServers: initial number of server processes to start # MaxClients: maximum number of simultaneous client connections # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: constant number of worker threads in each server process # MaxRequestsPerChild: maximum number of requests a server process serves StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0

В этом файле настроек можно поменять следующие параметры:

  • MaxClients – ограничение максимального числа
  • одновременно запущенных процессов httpd. т.е. по сути установка лимита

    на сжирание памяти самым “голодным” процессом httpd

  • StartServers -устанавливает число дочерних процессов при запуске сервера.
  • MinSpareServers – минимальное число неиспользуемых дочерних процессов.
  • MaxSpareServers - соответственно максимальное число неиспользуемых дочерних процессов.
  • MaxRequestsPerChild – максимальное количество запросов, которое разрешено обрабатывать дочернему процессу до переполнения. Нужен данный параметр, чтобы избежать утечку памяти или других ресурсов Apache, так как при переполнении дочерний процесс будет
  • принудительно завершен. В большенстве случаев изменение не требуется. Значение 0 – озхначает отсутствие ограничений.







2024 © gtavrl.ru.