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

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

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

А именно, ставить прокси-сервер nginx для уменьшения количества запусков Apache при отдаче статики (картинок, css, js) и более жесткого кеширования готовых страниц (не забывайте обрезать cookie). Стоит отметить, что только один сайт в обилии хранит (и отдает) картинки прямо с сервера, но он же и является и одним из самых посещаемых и критичных. Результат оказался очень приятным – страница вместе с картинками стала грузиться довольно резво, хотя первого ответа от сервера приходилось ждать довольно долго.

Вторая оптимизация через nginx касалась принудительного кеширования страниц для незарегистрированных посетителей блогов на WordPress. Стоит обратить внимание, что в ключ кеша необходимо добавлять куки wordpress_*, чтобы исключить возможность взлома через передачу "чужих" cookie. Как ни странно, это не дало ожидаемого, но чуть-чуть снизило нагрузку.

В поисках производительности было решено частично отказаться от php как модуля Apache в пользу FastCGI. Тут и разделение процессов и дополнительные возможности FastCGI по оптимизации PHP-кода, но об этом чуть позже. Как ни странно, но именно переход на FastCGI исправил львиную долю прорех с производительности сервера – разницу было видно невооруженным глазом.

Установка PHP как FastCGI позволяет, к тому же, и использовать различные акселераторы типа eAccelerator, XCache и APC, которые занимаются кешированием (и оптимизацией) php-кода. eAccelerator, хоть и показался максимально продвинутым, но заставить его правильно работать так и не удалось. XCache же оказался не очень привередливым и сразу показал свою эффективность. Да, пришлось отдать ему "на съедение" часть оперативной памяти, но результат оправдывает. К тому же, после "первичного" периода, когда xcache компилирует код и формирует кэш (в это время нагрузки на процессор несколько больше обычных), значительно снижаются нагрузки как на процессор, так и на потребление памяти процессом fastcgi.

На закуску, я оставил настройки кеширования в drupal и wordpress. Туда все-равно нужно было лезть и отключать gzip-сжатие поскольку теперь этим занимается nginx (да и делает он это быстрей). В некоторых блогах на wordpress были выставлены разные варианты кеширования: без кеширования, wp-cache, wp-supercache. С одной стороны хотелось сравнить разные методики, с другой стороны – дополнительный модуль не всегда благо.

Совсем другая "канитель" с Drupal – тут кэширование построено довольно грамотно. Для нагруженных сайтов выставил минимальное время жизни кеша в 10 минут. Можно было и больше, но этого хватило с головой – посещаемые страницы стали отдаваться моментально. Да, не забывайте очищать кэш при изменении настроек gzip.

После суток наблюдений (надо же было дать "устаканиться") результат такой:
Нагрузка процессора 0.00 0.00 0.00 (против примерно 5-7 до оптимизаций)
Количество отказов в предоставлении оперативной памяти упало до 0
Количество процессов хоть сократилось не сильно, но стало видно, что различные процессы теперь не "толкаются" между собой.

В качестве резюме, если бы мне пришлось оптимизировать еще один сервер, то:

  • nginx снижает нагрузки хотя бы тем, что самостоятельно сжимает в gzip (быстрее) и позволяет отдавать статику напрямую минуя лишние 20-30МБ и некоторое время на загрузку Apache
  • FastCGI – однозначно необходимое решение, как минимум, из-за некоторых важных особенностей: под ним работают оптимизаторы PHP, разделение процессов Apache и PHP (к тому же, mod_php заметно медленней FastCGI)
  • XCache стоит того, чтобы отдать ему часть оперативной памяти (это окупится, если, конечно, вы используете PHP). Хоть и кажется простым, но свои задачи выполняет честно и без особых плясок с бубнами.
  • Кеширование в Drupal – построено грамотно, вполне можно использовать для снижения нагрузок.

Надеюсь, вы оцените проведенную работу…

P.S.: Существует множество статей о связке nginx+FastCGI-PHP и т.п. минуя Apache. Стоит отметить, что это довольно специфическое решение и имеет множество подводных камней. Поэтому, не рекомендую выстраивать подобную схему без четкого понимания ее необходимости и полнофункциональности в Вашем конкретном случае.

Google slashdot YahooMyWeb Digg Technorati Delicious Забобрить эту страницу! Добавить на Newsland.ru Добавить на СМИ2 Добавить на RUmarkz Добавить на Ваау! Добавить на rucity.com Добавить в закладки МоёМесто.ru
Link:

Эта статья была опубликована в в четверг, декабря 9, 2010 at 8:12 pm в рубрике Администрирование. Вы можете отслеживать ответы на нее через RSS 2.0. Вы можете оставить отзыв, или trackback из вашего сайта.


3 комментария to “Технические работы на сервере”

  1. Я разработчик » Работаем с цветами и гаммами on декабря 9, 2010 at 10:26 pm

    [...] марафона по оптимизации сервера выкладываю, наконец-то [...]

  2. Я разработчик » Drupal Boost + Nginx on декабря 22, 2010 at 1:37 am

    [...] так давно я уже проводил оптимизацию сервера посредством nginxи других инструментов. Они позволили частично решить [...]

  3. Каки, факи, хаки » » Apache port redirect snippet on февраля 25, 2013 at 1:26 pm

    [...] как-то уже писал как оптимизировал нагрузку на сервер с помощью nginx и [...]

Оставить отзыв