Счетчик

Поисковый анализ сайта
яндекс.ћетрика
Cервер и сайт запущен 2011.02.01 на Debian

Решил написать данную статью для того, чтобы собрать всю информацию по данному поводу в одном месте. У многих возникает вопросы по оптимизации сервера. Расскажу как я добился скорости загрузки страницы за 0.013 секунд. Итак. У нас есть чистый Debian либо Ubuntu.

Нам предстоит установить и настроить:

Apache 2
PHP 5
MySQL 5
nginx
memcached
eAcellerator
Sphinx



Буду писать для debian 6, впринципе для дебиана почти всё так же.
Расчитываем на то, что сеть у нас уже настроена. 

Устанавливаем LAMP 
apache2 php5 php5-mysql mysql-server-5.0.

Устанавливаем nginx.
Все ставим из офф репозиторий

apt-get install nginx libapache2-mod-rpaf


Вешаем апач на другой порт, например 81 (можете на 8080, не суть важно):

$ nano /etc/apache2/ports.conf


В файле назначаем:

Listen *:81



Далее настраиваем виртуальный хост apache.
Копируем дефолтный конфиг:

$ cd /etc/apache2/sites-available
$ sudo cp ./default /etc/apache2/sites-enabled/domain.ru



Редактируем конфиг виртуалхоста апача:

$ nano /etc/apache2/sites-enabled/domain.ru



<VirtualHost *:81>
ServerName www.example.com
ServerAlias example.com
ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
DocumentRoot /var/www/example.com
<Directory /var/www/example.com>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory〉
ErrorLog /var/log/apache2/error.log
LogLevel warn
ServerSignature On
</VirtualHost>



Настраиваем gzip сжатие для nginx. Открываем конфиг:

$ nano /usr/local/etc/nginx/nginx.conf



Мой конфиг выглядит так:

user www-data;
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/html 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/*;
}



#Разрешить сжатие для всех проксированных запросов 
gzip_proxied any;
# MIME-типы которые необходимо жать
gzip_types text/plain text/html text/xml application/xml application/x-javascript text/javascript text/css text/json; 
# Уровень gzip-компрессии (у меня 9, т.е. максимальное сжатие, т.к. ресурсы позволяют)
gzip_comp_level 8;

Для виртуалхоста создаем новый конфиг:

$ nano /etc/nginx/sites-enabled/domain.ru



server {
listen 80;
server_name domain.ru;
access_log /var/log/nginx/domain.ru-nginx.access.log;
location / {
proxy_pass http://127.0.0.1:81/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 40m;
client_body_buffer_size 256k;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#Static files location
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ {
root /var/www/domain.ru; }
}



Проверяем конфиг nginx:

$ nginx -t



Устанавливаем memcached:

$ apt-get install memcached



Конфигурация memcached находится по адресу /etc/php5/conf.d/memcache.ini
По началу ничего менять не стоит.

Устанавливаем eAccelerator.
Так же тянем php5-dev, т.к. нам понадобится утилита phpize.

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



Создаем папку кеша:

$ sudo mkdir -p /var/cache/eaccelerator 
$ sudo chmod 0777 /var/cache/eaccelerator



Редактируем конфиг PHP:

$ nano /etc/php5/apache2/php.ini



Добавляем строки в самом верху:

[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, которым вы можете управлять кешем и анализировать ошибки, что очень удобно. Класть этот файл нужно обязательно по пути

eaccelerator.allowed_admin_path = "/var/www/eaccelerator"



Иначе будет выдавать ошибки.

Далее устанавливаем 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'ом (за что ему, или не ему, но всёравно спасибо), но приведу сразу полностью рабочий и готовый вариант (вариант из авторской статьи не актуален и требует допиливания):

$ nano /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.

Далее создаем папку для базы индекса и устанавливаем права на запись:

$ mkdir -p /usr/local/SphinxIndex
$ chmod -R 777 /usr/local/SphinxIndex/



Запускаем индексацию:

$ /usr/local/bin/indexer --all



Запускаем демон:

$ /usr/local/bin/searchd




Далее останется лишь прописать сфинкс в крон:

$ nano /etc/crontab



Добавляем:

0 */3 * * * /usr/local/bin/indexer --all --rotate


Это значит, что мы будем запускать индексацию каждые 3 часа.

Перезапускаем сервисы:

$ service apache2 restart
$ service nginx restart
$ service memcached restart



На сим всё должно работать.
Проверяем в phpinfo()
В хеадере eAccelerator:
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright © 1998-2008 Zend Technologies
with eAccelerator v0.9.5.3, Copyright © 2004-2006 eAccelerator, by eAccelerator

И ниже
memcache support enabled

Проверяем работоспособность портов (PID и DEVICE конечно же могут быть другими):

lsof -i



Мы должны видеть ниже строки:

apache2     948 www-data    3u  IPv4  47935       TCP *:81 (LISTEN)
memcached  3096   nobody    3u  IPv4 165608       TCP localhost:11211 (LISTEN)
nginx     19605 www-data    6u  IPv4  62263       TCP *:www (LISTEN)



Все мы на финише! Должно все отлично работать!!!

Пост взят отсюда!

Добавить комментарий


Защитный код
Обновить