Увеличиваем скорость livestreet. Nginx. GZip и не только.

Недавно перешел с шаред хостинга на VPS и столкнулся с проблемой что VPS работает не очень быстро, при том что тариф взял не самый дешевый (1600MHz и 1024Mb). Перекопал кучу сайтов чтобы разобраться как все сделать лучшим образом, думаю многие с этим сталкивались, хочу сэкономить ваше время и подытожить важные моменты по настройке.
Для тестирования производительности изначально использовал приложение siege, когда меня там цифры стали более-менее радовать, уже начал использовать для тестов замечательный сайт loadimpact.com (количество бесплатных проверок ограничено, не злоупотребляйте сразу). Привожу картинки как было и как стало (сразу хочу заметить увеличение производительности не только из-за настройки nginx).
1. Debian 5 (64) nginx + apache + php-fcgi + eAccelerator + memcache (Апач по сути только для ISPmanager использовался)

2. Debian 5 (32) nginx + apache + mod_php + APC + memcache


Начитавшись статей по разнице 32 и 64 версиях ОС переустановил Debain, 32 субъективно быстрее показалась.

Подразумеваю что у вас уже все установлено и сайты работают, описываю какую донастройку можно сделать для увеличения производительности системы. Ниже привожу строки из моего /etc/nginx/nginx.conf отвечающие за сжатие методом gzip с комментариями.
# Включаем сжатие
gzip  on;
#Степень сжатия (рекомендую 4-5, больше смысла не имеет нагрузка на ЦПУ растет, а файлы не значительно уменьшаются)
gzip_comp_level     5; 
# Разрешаем выдавать в ответе строку заголовка "Vary: Accept-Encoding" (Google Page Speed будет доволен)
gzip_vary on;
# Запрещаем проверку наличие готового сжатого файла. (в правилах разрешаем только там где нужно, если везде проверять дополнительные действия будут в системе делаться чтобы проверить существование таких файлов)
gzip_static off;
# Типы файлов которые мы будем сжимать
gzip_types text/css text/plain application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
# Указываем минимальную длина ответа, при которой модуль будет сжимать, в байтах (сжимаем файлы больше киллобайта, меньше смысла не имеет слабо ощутимо сжатие будет)
gzip_min_length  1024;
# Запрещаем сжатие ответа методом gzip для IE4-6 (можно записать регулярным выражением, но по словам автора nginx так быстрее будет работать)
gzip_disable     "msie6";
# Разрешить сжатие для всех проксированных запросов 
gzip_proxied     any;

Можно еще увеличить производительность предварительно сжимая файлы которые у нас довольно большие по объему и часто используются, я решил сжимать файлы js и css, для этого не забудьте сначала на стройках лайвстрит включить слияние файлов в один.
Файлы можно сжимать вручную командами
for i in `find ./* -type f -name '*.js'`; do echo $i; gzip -c -9 $i > $i.gz; done;
for i in `find ./* -type f -name '*.css'`; do echo $i; gzip -c -9 $i > $i.gz; done;

Соответственно тут сжимается с максимальной степенью сжатия (9), сжимать вручную это утомительно, пусть у нас эти файлы очень редко будут меняться, поэтому можно сделать так:
Открываем файл /engine/modules/viewer/Viewer.class.php ищем функцию Compress и в ее конец после @chmod($sCacheName, 0766); добавляем
file_put_contents($sCacheName . '.gz', gzcompress($sContent, 9));
@chmod($sCacheName, 0766);

(Кто подскажет более элегантное решение, буду только рад.)
у нас рядом с .js и .css файлами буду создаваться .js.gz и .css.gz т.е. уже сжатые их версии.
Для того чтобы сервер брал версии уже сжатых файлов нужно включить gzip_static. Включим его в конкретной директории открываем ту часть конфига где прописаны виртуальные хосты nginx и после описания «location /» добавляем включение проверки наличия сжатых файлов по адресу где лежит кэш .css и .js вашего шаблона.
server {
...
location / {
...
}
location /templates/cache/new-jquery/ {
	gzip_static on;
}
...
}


Еще для ускорения можно (в указанной ниже секции) отключить лог для статики и включить время когда ресурс будет считаться устаревшим 30 дней.
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
	...
	access_log off;
	expires 30d;
}

С выключенным логом меньше будет нагрузки на жетский диск, а с expires данные дольше у людей будут хранится в кэше браузера, соответственно меньше их запрашивать с сервера будет, можно вообще поставить expires max, но это на любителя.

Надеюсь кому-нибудь это поможет сделать его сайт быстрее, а посетителей счастливее =)
Если вы что то еще знаете что добавить напишите, сделаем хороший мануал по настройке nginx.
Рекомендуем доступные Новостройки в Подмосковье. Широкий диапазон вариантов по доступным ценам.

78 комментариев

avatar
Спасибо! В мемориз.
avatar
php-fcgi — это старый, выдранный из lighttpd spawn-fcgi? Если да, советую снести его и устнаовить нормальный php-fpm

и да, если поставили nginx, то помните что все .htaccess перестанут работать, а livestreet очень любит срать логами и прочими кэшами в папки выше webroot, поэтому убедитесь что прямой доступ к этим папкам закрыт.
  • Rpsl
  • +1
avatar
php-fcgi в начале был поставлен, и уже снесен))
php-fpm думаю позже попробовать, без апача, к сожалению ISPManager не работает, а мне на данный момент с ним комфортнее.
Про «срач» livestreet можно по подробнее, куда конкретно он «срет»?)
avatar
как минимум папки /tmp/ и /logs/, файлы в этих папках имеют расширение отличное от .php, в результате чего будут выданы как plaintext.
У себя, я определил location, типо такого cfg|log|tmp|bak… и запретил к нему доступ.
avatar
и tml и logs лежат в document_root по дефолту
avatar
Ну я это и не оспариваю, это пункт в чеклист, что бы другие не забыли. ага?
avatar
все. понял
avatar
Соответственно будет достаточно добавить правило

location ~* \.log$ {
			deny all;
		}

и логи читаться не будут, а tmp не пишет потому что memcache.
пс: а так в моей связке апач все закрывает =)
avatar
Нужна скорость или удобство? Я уже давно отказался от панелей, и не жалею. Они съедают доброе количество ресурсов.

Конечно, в панели намного удобнее создать ftp пользователя, прописать ns (если тех не дает хостер), и еще пару мелочей.

Но этим стоит пожертвовать, ради полного отказа от апача, жирный он.

И еще кое-что по настройкам. Картинкам и подобной статике можно поставить expires max;
avatar
Панель по сути кушает только память, у меня ее остается по 300-400 мегабайт постоянно.
Апач это да, думаю в дальнейшем от него откажусь или оставлю на минимуме чтобы только панель работала (меня жаба душит потому что я ее купил))
у меня написано в статье
можно вообще поставить expires max, но это на любителя.
по мне 30 дней оптимально, у каждого свой путь, хотя с радостью изменю мнение если max лучше в чем то существенно.
avatar
Ну вот например картинки, которые в топике, они же не меняются, вот тут то и поможет max.
avatar
А если я решу каталог поменять или на статик сервер перенести картинки?
avatar
Что-то я не понял. Какова скорость загрузки страниц после оптимизации? Больше 1 секунды при 20 онлайн юзерах?!
avatar
Покажите, пожалуйста, ещё диаграммы «Url resource type distribution» и «Url resource type load time distribution», чтобы понимать, из чего эта секунда складывается.
avatar
avatar
Обычный шаред-хостинг за три копейки:



avatar
Что-то бредовый сервис, сайт livestreetr.ru на нём 10 секунд показывает, а реале он летает. Лучше данные siege выложите. ;)
avatar
Согласен, он иногда дурит) Чтобы более точно показало советую там зарегистрироваться и 1 раз хорошо прогнать, там уже точнее показывает)
Siege
при -d1 -c20 -r10 Response time: 2.16 secs
при -d1 -c5 -r10 Response time: 0.71 secs
при -d3 -c5 -r10 Response time: 0.21 secs

Вообще при тестах у меня больше всего нагружается процессор причем апачем, все таки подозреваю что хостер оверселит, т.к. даже когда 5 конкурирующих пользователя проц до 100% забивается.
avatar
Апач зачем? nginx прекрасно справляется и без него. Два года назад я написал подобную статейку по выбору хостинга дла ЛС на хабре: habrahabr.ru/blogs/livestreet/67415/
avatar
Читал) я апач оставил исключительно из-за ISPManager =)
У тебя сейчас какие характеристики VPS можешь прогнать тест при этом top посмотреть сколько процессора кушает? у меня такое ощущение что проц у меня урезан по полной… да и память тоже, потому как сделал tmps раздел и туда помещал все скомпиленные tpl и css с js прироста никакого вообще.
avatar
Не могу, т.к. VPS уже не пользуюсь. :)
А ISPManager вообще зачем? Привычка видеть визуальный интерфейс? Тогда уж Plesk лучше. :)
Твой VPS вообще по какой технологии построен? Не OpenVZ, надеюсь, т.к. это по сути продвинутый шаред. XEN — наше фсё! ;)
avatar
Ты угадал OpenVZ… Зря я похоже с ним вожусь)) Кончится срок оплаты попроьбую на KVM, на XEN оптимального по цене не встречал еще.
пс: А чем плеск лучше?
avatar
Да удобный и красивый, но такой же проглот ресурсов, если не больше. Вообще не вижу смысла в панелях с тех пор, как немного разобрался с администрированием сервера. :)
avatar
Plesk не умеет с nginx работать. Насчет проглота вы правы. Сейчас пробую связку Direct Admin + Nginx + spawn-fcgi.
avatar
А ISPManager вообще зачем?
Если на сервере несколько пользователей и общее число сайтов более 20, то без панели начинаешь задалбываться. Если же сайтов несколько и их, как говориться, настроил и забыл, то да, можно и без панели обойтись.
А вообще, ISPmanager удобен при правильном к нему подходе и отключением всего и вся лишнего. Сам его активно использую для управления WEB и DNS серверами.
avatar
это только начало, бро. как БД распухнет от комментов, придется еще мускуль тюнить и оперативку под кеши всякие ему докупать пачками.
avatar
Количество записей? Мне вот всегда интересно было, какие нагрузки ЛС выдерживает, но крупных сайтов на нём пока не знаю.
avatar
Нашёл сайт на LS с посещаемостью больше 50к уников (100к хостов) в сутки, он просто летает. Показов страниц за месяц 25,000,000. Мотивирует на использование LS. :)
avatar
Ссылочку можно?) Хотя бы в личку =)
avatar
Отправил.
avatar
А можно и мне ссылку? А лучше здесь дайте ссылку, «страна должна знать своих героев»:)
avatar
avatar
Предлагаю написать статью по оптимизации мускула) А то когда я еще доберусь, а у тебя уже опыт есть) Вообще бы хотелось серию статей по всесторонней оптимизации, чтобы по куче сайтов не лазить, а все в одном месте было.
avatar
а вы знаете, что в основном выжирает память? Даже не мускул. Мускул, конечно, ест, но терпимо, можно его и закешировать. А вот экземпляры классов, на каждый же чих создается сущность, у меня съедают до 30 метров при загрузке страницы. Врать не буду, не на чистом движке, да и сущности я осложнил всякими релейшенами, но все-таки. Буду профилировать.
На более-менее чистом LS у меня держится от 100 посетителей онлайн, 4К в день. При том что на сервере еще пара тройка сайтов на DLE висит с посещаемостью 30К. Но в последнее время стала отваливаться база, пока не разобрался, на что грешить.
avatar
Блин, так мало, 4к в день, а уже проблемы… :(
Веб-сервер какой, eAccelerator или аналог стоит?
avatar
Nginx + Apache + Memcache + APC
Просто он не один на том сервере. Может DLE все сжирает
avatar
Intel® Core(TM)2 Quad CPU Q8300 @ 2.50GHz
MemTotal: 16471188 kB
avatar
16 Гб оперативки и не хватает? оО
avatar
та да, ORM потянул.
avatar
Мне бы такого демона в руки
avatar
та же хурма. валилась база.
после подкручивания кешей по наводке mysqltuner'а, оказалось что этих кешей в общей сумме больше инсталлированной оперативки в 2 раза %) но даже с такой недостачей вроде не валится.
изредка, правда, не проглатывает запрос и отдает ошибку «Error while sending QUERY packet». покрутил таймауты — стало чуть реже, но все равно бывает
avatar
Я так понял, что база валилась когда «разбухла». Какой размер базы был и сколько памяти под кеши было отведено?
avatar
ну валиться начало, когда размер данных innodb стал более 500мб, а сколько БЫЛО отведено под кеши — это уж давно забыто.
avatar
этим же тюнером и настраивал. Может ему 16 Гигов памяти мало. Поеду на радиорынок докупать)
avatar
там у него фича в том, что не менее суток после каждой подкрутки должно проходить, он на статистическх данных предлагает инкриминировать численные значения настроек. так-то можно и сильно ошибиться, если не выдержать это время
avatar
Как оказалось, тормозили update, insert и delete запросы.
Поставил innodb_flush_log_at_trx_commit=0
Стало намного быстрее.
avatar
А не опасно ли выставлять «0»?
Цитата с Хабра «Значение «0» повысит производительность, но Вы рискуете потерять данные даже при аварийной остановке mySQL-сервера, в то время как при установке значение innodb_flush_log_at_trx_commit в «2» Вы потеряете данные только при аварии всей операционной системы.»
avatar
Поставил, вроде не пока все быстро.
Со значением 1 у меня инсерт в пустую таблицу проходил около 0,4 сек.
Если учесть, что ЛС все время апдейтит таблицу topic_read, то это оказывалось существенно
avatar
# Запрещаем сжатие ответа методом gzip для IE4-6 (можно записать регулярным выражением, но по словам автора nginx так быстрее будет работать)
gzip_disable «msie6»;

ie6 вполне понимает сжатие, можно было пойти навстречу некрофилам
avatar
Разработчик пошел на встречу «некрофилам» =)
Специальная маска «msie6» (0.7.12) соответствует регулярному выражению «MSIE [4-6]\.», но работает быстрее. Начиная с версии 0.8.11, из этой маски исключается «MSIE 6.0;… SV1».
avatar
vps от majordomo (стартовый тариф)
avatar
забыл добавить, никаких настроек сервера не производилось, работает в связке с ISPmanager, конфигурация проц 400 МГц/память 256Мб/диск 5гб
avatar
Шикарно, что я скажу, похоже мой хостер оверселит...)
avatar
так же произвел вторую проверку, в связке с другим сайтом, который тоже «атаковал» мой домен, в итоге получил прирост можно сказать в прогрессии, вышло около 120 активных человек, и около 70 «мимолетных» и параметры были таковы

120 активных — ~5 секунд на загрузку
70 мимолетных — ~ 3-4 секунды

думаю до 250 активных и ~100 мимолетных, такая «нишевая» vps будет держать, опять же если это все в прогресси и не начнут оверселить, а так, всего 350 рублей в месяц :)
avatar
А на сайте что, лайвстрит стоит? какая конфигурация просто apache или nginx+…
avatar
на сайте LS стоит с 2 самописными плагинами, и просто тупо апач)
avatar
думаю сейчас настройку сделать, поставить сжатие, поработать с логами
avatar
За 7.9 евро (~330h) рублей посоветовал бы взять виртуалку у Хетцнера — Single Core, 512 MB, 20 GB HDD. Я сейчас у них сервак арендую, до этого виртуалками пользовался. Очень нравится. Почитайте отзывы о них, если не слышали. Хороший немецкий хостер, ДЦ ни в какое сравнение с отечественными.
avatar
у них хороший плюс — большой выбор ос который можно поставить на сервер при выборе минимального тарифа, в рашке мало хостеров которые дают эту возможность, интересный хостер, спасибо
avatar
и кстати, забыл уточнить, при какой нагрузке сервер стабильно продолжает работать, естественно если тестировали)
avatar
Тестировал давно, не помню уже результаты. Пока ресурсов валом. :)
avatar
Кто хостер?
avatar
Я один на облаке сижу? :)
avatar
Я не понял так в какую папку файлы закачивать /var/www or /etc/share/nginx/www?
avatar
Откуда нам знать в какой директории у вас лежит ls и куда прописан документ рут на вебсервере?
avatar
Есть папка для nginx, к которой доступ по 80 порту.А есть папка для apache2, к которой доступ по 88 порту. Так вот в какую закачивать LS не пойму :(
avatar
Уточняйте у хостера в таком случае.
avatar
У меня VPN
avatar
VPS:)
avatar
рекомендую посмотреть в сторону tmpfs (раздел в памяти). на дынный раздел можно закинуть всякую gzipнутую статику, чтоб она считывалась не с диска, а напрямую из оперативной памяти. это так-же вам ускорит отдачу статики и снизит нагрузку на ваш VPS. Зачастую узким местом для VPS/VDS становится именно обращение к диску.
avatar
Здраствуйте!
посмотрите пожалуйса на график, что надо оптимизировать?
loadimpact.com/load-test/djradioternopil.com-044ec0c656e450f3e49c5c543aecead2
CentOS 5.5, nginx + eAccelerator + ZendOptimizer + memcache
Сколько стоит заказать оптимизацию и настройку сервачка?
Ресурсы: проц 2000Mhz, озу 512 Mb)
Спасибо за понимание!
avatar
Люди добрые, объясните, как получены результаты, указанные выше? (любые)

У меня vds с debian 6: nginx + apache2 + mod_php + APC + memcache

и в этих тестах у меня время доходит до 1м…
  • dsg
  • 0
avatar
от возможностей vds ващего зависит. ну и apache2 + mod_php (т.е. mpm_prefork) это с точки зрения производительности печально
avatar
Виртуализация — kvm
CPU Core: 1 x 3,46 GHz
RAM DDR3- 1333MHz: 2048 MB
SAS диски, RAID-10

Вполне неплохой сервак, вроде как.

Что касается mod_php, то не уверен, что есть сильно большая разница, например с fastcgi (по крайне мере по тем же тестам, fastcgi еще хуже). А php-fpm, насколько я понимаю, с Apache2 не очень хорошо дружит — лучше в связке nginx+php-fpm, но от апача я отказаться пока не могу.
avatar
php-fpm c apache дружит без проблем у самого так работает. там фишка в том что mod_php вынуждает апач работать с mpm_prefork а не mpm_worker. первое для сервера значительно тяжелее по CPU. у меня на стресс тестах apache(mpm_worker)+mod-fastcgi+ php-fpm тотально выигрывал у apache + mod_php. Но это всё я гонял на физическом сервере. виртуализация вносит свои коррективы, особенно в отношении параллелизма. Я бы сказал что если fast cgi процессы работают медленние обычных то что то не так с реально доступным процессорным временем…
avatar
У Вас стоит именно такая связка: apache(mpm_worker)+mod-fastcgi+ php-fpm ?

Т.е. fastcgi работает совместно с php-fpm?
avatar
Надо понимать тесты чего это есть.
avatar
Можно подробнее?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.