Настройка веб-сервера VPS/VDS для Debian/Ubuntu (Оценка: +6)

Печать / RSS-лента
Решил написать данную статью для того, чтобы собрать всю информацию по данному поводу в одном месте.
У многих возникает вопросы по оптимизации сервера. Расскажу как я добился скорости загрузки страницы за 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
Устанавливаем LAMP
$ sudo apt-get update
$ sudo apt-get install apache2 php5 php5-mysql mysql-server-5.0

Устанавливаем nginx.
Сам компилил из исходников, но лучше взять deb пакет здесь: http://packages.debian.org/unstable/web/nginx
Тянем пакет, устанавливаем (ссылку берём выше для своей архитектуры, у меня 64 бит).
$ wget http://ftp.de.debian.org/debian/pool/main/n/nginx/nginx_0.7.59-1_amd64.deb
$ dpkg -i nginx_*

Доустанавливаем модуль к апачу (обязательно):
$ apt-get install libapache2-mod-rpaf


Вешаем апач на другой порт, например 81 (можете на 8080, не суть важно):
$ vi /etc/apache2/ports.conf

В файле назначаем:
Listen *:81

Далее настраиваем виртуальный хост apache.
Копируем дефолтный конфиг:
$ cd /etc/apache2/sites-available
$ sudo cp ./default /etc/apache2/sites-enabled/example.com

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

$ vi /etc/apache2/sites-enabled/example.com

<VirtualHost *:81>
ServerName www.example.com
ServerAlias example.com
ServerAdmin [email protected]

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. Открываем конфиг:

$ vi /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/*;
}



Немного мана (полный ман: sysoev.ru/nginx/docs/http/ngx_http_gzip_module.html):
#Разрешить сжатие для всех проксированных запросов
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;


Для виртуалхоста создаем новый конфиг:
$ vi /etc/nginx/sites-enabled/example.com

server {
listen 80;
server_name example.com;

access_log /var/log/nginx/example.com-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/example.com; }

}

Проверяем конфиг 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:
$ vi /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'ом (за что ему, или не ему, но всёравно спасибо), но приведу сразу полностью рабочий и готовый вариант (вариант из авторской статьи не актуален и требует допиливания):
$ 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.
Далее создаем папку для базы индекса и устанавливаем права на запись:
$ mkdir -p /usr/local/SphinxIndex
$ chmod -R 777 /usr/local/SphinxIndex/

Запускаем индексацию:
$ /usr/local/bin/indexer --all

Запускаем демон:
$ /usr/local/bin/searchd


Далее останется лишь прописать сфинкс в крон:
$ vi /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)


Если таковые имеются, то сервер работает как задумывалось. ).gif
Автор статьи: Александр (05.05.11 / 14:53)
VDS, настройка
Рейтинг: +6
Просмотров: 2454
Комментарии (3) »