Решил написать данную статью для того, чтобы собрать всю информацию по данному поводу в одном месте.
У многих возникает вопросы по оптимизации сервера. Расскажу как я добился скорости загрузки страницы за 0.013 секунд.
Итак. У нас есть чистый Debian либо Ubuntu.
Нам предстоит установить и настроить:
— Apache 2
— PHP 5
— MySQL 5
— nginx
— memcached
— eAcellerator
— Sphinx
Буду писать для Ubuntu Server 9.04, впринципе для дебиана почти всё так же.
Расчитываем на то, что сеть у нас уже настроена.
Краткая справка по редактору vi (мы его будем использовать для редактирования):
— для вставки текста нажмите i, затем вводите текст
— для удаления символов нажмите ESC, а затем наберите x
— для выхода из vi без сохранения изменений нажмите ESC, а затем наберите :q!
— для сохранения и выхода нажмите ESC, а затем наберите :wq
Устанавливаем nginx.
Сам компилил из исходников, но лучше взять deb пакет здесь: http://packages.debian.org/unstable/web/nginx
Тянем пакет, устанавливаем (ссылку берём выше для своей архитектуры, у меня 64 бит).
[PHP]
; eAccelerator configuration
; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension
; If you are using a thread safe build of PHP you must use
; zend_extension_ts instead of zend_extension
extension = "eaccelerator.so"
eaccelerator.shm_size = "16"
eaccelerator.cache_dir = "/var/cache/eaccelerator"
eaccelerator.enable = "1"
eaccelerator.optimizer = "1"
eaccelerator.check_mtime = "1"
eaccelerator.debug = "0"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
eaccelerator.compress = "1"
eaccelerator.compress_level = "9"
eaccelerator.allowed_admin_path = "/var/www/eaccelerator"
Внимание!
Если у вас достаточно свободной оперативной памяти, то рекомендую включить режим кэширования байт-кода исключительно в оперативной памяти:
eaccelerator.shm_only = "1"
А так же увеличить доступную память для кеша:
eaccelerator.shm_size = "128"
Так же в пакете аксселлератора есть файл control.php, которым вы можете управлять кешем и анализировать ошибки, что очень удобно. Класть этот файл нужно обязательно по пути
Далее устанавливаем Sphinx.
Зачем я повторяюсь, ведь об этом уже написано несколько постов (кстати в интернете мануалов поти нет)? Отвечаю: я столкнулся с такими проблемами, которые там не обхвачены, поэтому пишу из-за этих моментов.
Тянем исходники (в репозиториях пакета нет), распаковываем и устанавливаем:
$ wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
$ tar –xzvf sphinx-0.9.8.tar.gz
$ cd sphinx-0.9.8
$ ./configure
$ make
$ make install
$ mkdir -p /var/db/sphinx/log
$ chmod -R 777 /var/db/
Далее редактируем файл конфигурации, любезно составленный kruft'ом (за что ему, или не ему, но всёравно спасибо), но приведу сразу полностью рабочий и готовый вариант (вариант из авторской статьи не актуален и требует допиливания):
$ vi /usr/local/etc/sphinx.conf
## Конфигурационный файл Sphinx-а для индексации Живой улицы
#######################
#
# Описываем индексы
#
#######################
# Источник-родитель для всех остальных источников. Здесь указываются параметры доступа
# к базе данных сайта
source lsParentSource
{
type = mysql
sql_host = your_database_host
sql_user = your_database_login
sql_pass = your_database_password
sql_db = your_database_name
sql_port = 3306
# Для ускорения работы прописываем путь до MySQL-го UNIX-сокета (чтобы
# операции с БД происходили не через TCP/IP стек сервера)
sql_sock = /var/run/mysqld/mysqld.sock
mysql_connect_flags = 32 # 32- включение сжатие при обмене данными с БД
# Включам нужную кодировку соединения и выключаем кеш запросов
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
}
# Источник топиков
source topicsSource : lsParentSource
{
# запрос на получения данных топиков
sql_query = \
SELECT t_fast.topic_id, t_fast.topic_title, UNIX_TIMESTAMP(t_fast.topic_date_add) as topic_date_add, \
tc.topic_text, t_fast.topic_publish \
FROM prefix_topic as t_fast, prefix_topic_content AS tc \
WHERE t_fast.topic_id=tc.topic_id AND t_fast.topic_id>=$start AND t_fast.topic_id<=$end
# запрос для дробления получения топиков на неколько итераций
sql_query_range = SELECT MIN(topic_id),MAX(topic_id) FROM prefix_topic
# сколько получать объектов за итерацию
sql_range_step = 1000
# Указываем булевый атрибут критерия "топик опубликован". Для возможности указания этого критерия при поиске
sql_attr_bool = topic_publish
# Атрибут даты добавления, типа "время"
sql_attr_timestamp = topic_date_add
# мульти-аттрибут "теги топика"
sql_attr_multi = uint tag from query; SELECT topic_id, topic_tag_id FROM prefix_topic_tag
sql_ranged_throttle = 0
}
# Источник комментариев
source commentsSource : lsParentSource
{
sql_query = \
SELECT comment_id, comment_text, UNIX_TIMESTAMP(comment_date) as comment_date, comment_delete \
FROM prefix_topic_comment \
WHERE comment_id>=$start AND comment_id<=$end
sql_query_range = SELECT MIN(comment_id),MAX(comment_id) FROM prefix_topic_comment
sql_range_step = 5000
sql_attr_bool = comment_delete
sql_attr_timestamp = comment_date
}
#######################
#
# Описываем индексы
#
#######################
index topicsIndex
{
# Источник, который будет хранить данный индекса
source = topicsSource
path = /usr/local/SphinxIndex/topicsSource
# Тип хранения аттрибутов
docinfo = extern
mlock = 0
# Используемые морфологические движки
morphology = stem_enru, soundex, metaphone
# Кодировака данных из источника
charset_type = utf-8
# Из данных источника HTML-код нужно вырезать
html_strip = 1
}
# Индекс комментариев
index commentsIndex
{
source = commentsSource
path = /usr/local/SphinxIndex/commentsSource
docinfo = extern
mlock = 0
morphology = stem_enru, soundex, metaphone
charset_type = utf-8
}
#######################
#
# Настройки индексатора
#
#######################
indexer
{
# Лимит памяти, который может использавать демон-индексатор
mem_limit = 32M
}
#######################
#
# Настройка демона-поисковика
#
#######################
searchd
{
# Адрес, на котором будет прослушиваться порт
address = 127.0.0.1
# Ну и собственно номер порта демона searchd
port = 3312
# Лог-файл демона
log = /var/log/sphinx/searchd.log
# Лог поисковых запросов. Если закомментировать,то логировать поисковые строки не будет
query_log = /var/log/sphinx/query.log
# Время в секундах, которое ждет демон при обмене данными с клиентом. По исчерпании происходит разрыв коннекта
read_timeout = 5
# Максимальное количество одновременно-обрабатываемых запросов. 0 означает дофига, а точнее без ограничения
max_children = 30
# Файл, в который сохраняется PID-процесса при запуске
pid_file = /var/log/sphinx/searchd.pid
}
Не забываем прописать настройки MySQL.
Далее создаем папку для базы индекса и устанавливаем права на запись:
Все понимаю. Но зачем апач? По тестам на высоконагруженных сайтах (400к-600к в сутки) apache2+nginx+php ничем не лучше nginx+php-cgi. А если нет разницы, зачем держать два http-севера?
1) Почему? nginx сам отделяет мух от котлет? Т.е. если ИЕ версии 6 и ниже, то gzip атоматически отключается?
2) Не обязательно, но рекомендуется, т.к. не зачем кэшировать слишком маленькие файлы и загружать процессор по-пусту.
3) Эт да. =)))
1) Я не беру в расчёт Осла6 впринципе. Кому надо, тот путь берёт ^_^
2) Я могу себе позволить сжимать всё ;) Но этот параметр я давно добавил. Спасиб.
3) Да.
Голосую за первое)) И да, готов обосрать то что должно быть обосрано по факту и никогда не отказываюсь от своих позиций.
Только одно дело высказать свою позицию и обосновать её, а другое — тихо буркать за спиной, люто, бешено срать кирпичами и еже в карму, повышая уровень ЧСВ.
За материал пожалуйста)) Пишите если возникнут вопросы.
Ну я слышал, что если поставить нгникс, то в панели перестает отображаться статистика (например по трафику для аккаунта и так далее) ввиду того, что трафик уже не идет через апач. Типо того )
Просто в конце месяца будем обновлять ПО сервера и хотелось бы найти оптимальное решение )
Apache стоит на вашем сервере. Наверняка в конфигах панели есть константа порта апача, т.к. многие апач вешают не только на 80 порт. Ну вот и пропишите там тот порт, куда вы повесили апач и ловите профит.
Не обязательно 81, можете вешать и на 8080, хоть на 8081, хоть на 8082.
А если оба будут висеть на одном, то будет работать первый сервис, запущенный на сервере, второй выдаст ошибку что порт занят и пошлёт вас далеко и надолго. По-моему это логично…
Итак, пользователь skpnm забанен за регу виртуалов, накрутку и не норматив. MaxSvargal, тебе советую не употреблять на этом сайте не нормативную лексику, устал уже за тобой их удалять, дальше просто будет запрет на комменты.
Топик убивать не нужно, многим пригодится
Да, именно через локальный сокет. Я тестировал как-то и выигрыш был, правда не помню точно на сколько большой. Предлагаю протестить это дело и принять на пользование, если есть польза. :-)
Вот обьясните мне, обязательно так устанавливать? я имею ввиду
— Apache 2
— PHP 5
— MySQL 5
— nginx
— memcached
— eAcellerator
— Sphinx
если просто установить связку apache+php+mysql ну и Sphinx еще, это намного хуже будет?
Статья отличная.
Еще бы сравнить с тем, что у меня сейчас имеется.
windows, nginx, apache, eAccelerator, php и mysql.
Не помешало бы добавить установку и настройку iptables.
1) Если ./configure sphinx'a ругается на mysql-devel, выполняем в баше:
apt-get install libmysql++-dev libmysqlclient15-dev
2) Нужно немного подправить конфиг сфинкса:
* сменить address на listen
* сменить prefix_topic_comment на prefix_comment
* да, и если префиксы таблиц меняли — не забудьте на свои поменять )
161 комментарий
P.S. Возьми часть под кат.
gzip_min_length 1100; не обязательно.
gzip_http_version 1.0; ето да.
2) Не обязательно, но рекомендуется, т.к. не зачем кэшировать слишком маленькие файлы и загружать процессор по-пусту.
3) Эт да. =)))
2) Я могу себе позволить сжимать всё ;) Но этот параметр я давно добавил. Спасиб.
3) Да.
Я работаю программистом 1С, закончила физмат. Так что как-то так.
И в чём же экономия проявляется? :)
Экономия заключается в том, что не нужно нанимать сисадмина для настройки сервера.
Ясно, вопросов больше не имею :)
Просто не так уж и много девушек, готовых красноглазить на фряхе ^_^
Ну, суть не особо меняет ^_^
Таки да.
Вам я когда-то также рейтинг прибавлял (это чтобы ни у кого не возникало иллюзий, что я девушек автоматически поддерживаю) ;-)
За материал спасибо! :-)
Только одно дело высказать свою позицию и обосновать её, а другое — тихо буркать за спиной, люто, бешено срать кирпичами и еже в карму, повышая уровень ЧСВ.
За материал пожалуйста)) Пишите если возникнут вопросы.
Просто в конце месяца будем обновлять ПО сервера и хотелось бы найти оптимальное решение )
А если оба будут висеть на одном, то будет работать первый сервис, запущенный на сервере, второй выдаст ошибку что порт занят и пошлёт вас далеко и надолго. По-моему это логично…
зы. Sphinx нужен?
Заранее спасибо :)
Топик убивать не нужно, многим пригодится
Да и правда же было весело… Нет, ну правда…
зы. снеси из базы чтоль посты, а то… ну сам видишь.
зы. и вообще…
Мы должны видеть ниже строки:
1. sites-enabled в nginx, убрать html из обрабатываемых типов
2. Sphinx на голом сервере может и не собраться необходима поддержка libmysqlclient16-dev как-то так.
А так использовал удобно copy&paste. Я думаю на основе материала можно даже bash-скрипт написать.
2 — да, были большие проблемы и у меня — пришлось вручную указывать путь к mysql для sphinx, а потом уже собирать…
Прописал все, но почему то индексации не происходит :(
При ручном все индексируется отлично… а вот кроном — нет. Кто в курсе в чем проблема?
на всякий случай у меня на сайте расписано все более подробно.
— Apache 2
— PHP 5
— MySQL 5
— nginx
— memcached
— eAcellerator
— Sphinx
если просто установить связку apache+php+mysql ну и Sphinx еще, это намного хуже будет?
заранее благодарен
Еще бы сравнить с тем, что у меня сейчас имеется.
windows, nginx, apache, eAccelerator, php и mysql.
Не помешало бы добавить установку и настройку iptables.
apt-get install libmysql++-dev libmysqlclient15-dev
2) Нужно немного подправить конфиг сфинкса:
* сменить address на listen
* сменить prefix_topic_comment на prefix_comment
* да, и если префиксы таблиц меняли — не забудьте на свои поменять )