Введение
В этой статье я расскажу о своих первых шагах, как я настраивал VPS, заказанный в компании .masterhost.
Здесь будут описаны только самые первые шаги по запуску своего сайта на VPS. В дальнейшем мы обязательно затронем вопросы резервирования данных и разделения прав.
Не обошлось без скрытых камней, которых я надеюсь помочь Вам избежать.
Заказ
Для начала я зарегистрировал себе домен, и заказал VPS (Fedora Core 7, тарифный план VPS Standard, без Plesk). Поддерживать DNS я предпочёл через сервера .masterhost, поэтому зашёл в контрольной панели в "персональные услуги и настройки", и включил там услугу "поддержка DNS (клиента)". Обходится это в $0.25 независимо от числа доменных зон.
Использовать Plesk я посчитал невыгодным, так как настроить всё можно и без него, а эта панель кушает немало ресурсов (особенно заметно на младших тарифных планах).
Операционную систему Fedora Core 7 выбрал случайным образом (как предлагаемую по умолчанию), и все последующие шаги имеют смысл, скорее всего, только по отношению к ней.
После получения реквизитов домена пришлось включить отдельно клиентскую поддержку DNS для этого домена (там же в персональных настройках), чтобы домен появился в редакторе DNS.
Установка необходимого программного обеспечения
Изначально мы получаем достаточно голый сервер с установленным Apache 2.x. Естественно, такая конфигурация крайне неэффективна.
Поэтому мы установим связку nginx + Apache. Кроме того, обычно нам потребуется также PHP и MySQL.
Сразу после получения в свои руки сервера (это происходит очень быстро) он ещё не готов к работе, в фоновом режиме выполняется установка минимального набора пакетов, включая yum. Это может занять до 10-30 минут. Поэтому, если Вы увидите на экране сообщение, что команда yum неизвестна, просто немного подождите.
Заходим в консоль ssh (под Windows я использую для этого putty, о которой рассказано в этой статье), далее выполняем
yum install nginx
Для установки nginx с настройками по умолчанию, они нам подходят.
yum install -y php mysql-server php-mysql php-eaccelerator
Установим PHP, eAccelerator, MySQL и расширения MySQL для PHP
yum install ImageMagick
Для некоторых сайтов требуется одна из библиотек для работы с изображениями. Мне для одного из сайтов потребовался ImageMagick, который ставится вот такой командой. Если он вам не нужен, лучше не ставить - тянет множество зависимостей.
Кроме того, нам нужно установить mod_rpaf для Апача, чтобы им корректно определялись исходные IP-адреса клиентов. К сожалению, пакета yum для него я не нашёл, пришлось ставить через rpm/apxs.
cd /usr/local/src/
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar -xzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
Теперь мы имеем необходимый набор программного обеспечения. Осталось его настроить.
Первичная настройка
Настройки мы сделаем, исходя из возможности держать на одном VPS несколько сайтов.
Редактор DNS
Открываем Контрольную панель .masterhost, ищем в меню DNS-зоны, и переходим к редактированию DNS успешно зарегистрированного домена (далее для примера mysite.ru). Создайте такой набор записей:
www IN CNAME mysite.ru.
Apache
Все настройки находятся в каталоге /etc/httpd.
Для начала остановим Apache.
service httpd stop
Прослушивание портов
Теперь настроим Apache на прослушивание только локальных запросов, например, по порту 8080.
Для этого найдём в файле /etc/httpd/conf/httpd.conf строчку, начинающуюся с Listen, и заменим на
Listen 127.0.0.1:8080
Настройка mod_rpaf
В каталоге /etc/httpd/conf.d/ создадим файл mod_rpaf.conf следующего вида:
RPAFenable On
# Enable reverse proxy add forward RPAFproxy_ips YOUR_PROXY_SERVER_IP_LIST_OR_ONE_IP
# which ips are forwarding requests to us
RPAFsethostname Off
# let rpaf update vhost settings
# allows to have the same hostnames as in the "real"
# configuration for the forwarding Apache
RPAFproxy_ips 127.0.0.1
RPAFheader X-Real-IP
Небольшая настройка PHP
В файле /etc/httpd/conf.d/php.conf строчку AddType text/html .php заменяем на
AddType application/x-httpd-php .php
Настройка сайта
Чтобы разрешить именованные сайты, в файле /etc/httpd/conf/httpd.conf заменяем строчку #NameVirtualHost *:80 на
NameVirtualHost *
После этого в каталоге /etc/httpd/conf.d/ создадим файл mysite.ru.conf следующего вида:
ServerName mysite.ru
ServerAlias www.mysite.ru
DocumentRoot /home/mysite.ru/www
ErrorLog /home/mysite.ru/logs/mysite.ru.error_log
<Directory "/home/mysite.ru/www">
AllowOverride All
Options +Includes
</Directory>
php_admin_value open_basedir /home/mysite.ru/
php_admin_value doc_root /home/mysite.ru/www
php_value session.save_path /home/mysite.ru/sessions
php_admin_value upload_tmp_dir /home/mysite.ru/tmp/
php_value display_errors 1
php_admin_value magic_quotes_gpc 0
</VirtualHost>
Пока мы не настроили пользователей и права, мы должны учитывать, что все действия мы производим от root, в то время как Apache работает от имени другого пользователя.
Разбираться с правами мы пока не будем, поэтому служебные папки для Apache создадим с правами для всех:
Проверка и запуск
Напоследок проверим конфигурацию:
service httpd configtest
Syntax OK
И запустим Apache
service httpd start
nginx
Файлы конфигурации nginx находятся в каталоге /etc/nginx/.
Настройка форвардинга
В файле /etc/nginx/nginx.conf полностью удаляем секцию server (перед её началом комментарий вида # The default server)
Создадим в каталоге /etc/nginx/conf.d/ файл mysite.ru.conf следующего вида:
# A virtual host using mix of IP-, name-, and port-based configuration
#
server {
listen mysite.ru:80;
server_name www.mysite.ru;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
log_not_found off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Проверка и запуск
Теперь мы, при условии, что изменения DNS, выполненные нами ранее, уже разошлись по серверам DNS, можем проверить работоспособность конфигурации:
service nginx configtest
И стартовать его
service nginx start
Проверка настроек
На данном этапе должна уже корректно работать связка nginx + Apache + PHP.
Проверить это можно, создав файл /home/mysite.ru/www/index.php следующего содержания:
Заходим на сайт. Должна появиться информация PHP о нашей связке.
Проверьте, что
- В секции Apache Environment переменная REMOTE_ADDR указывает на Ваш IP. Это означает корректную настройку nginx и mod_rpaf.
- Секция eAccelerator присутствует. Это означает, что PHP будет работать с высокой производительностью.
- Присутствуют секции mysql и mysqli. Это означает корректную установку MySQL для PHP.
MySQL
Все настройки сервера находятся в файле /etc/my.conf.
Первичная настройка
Стартуем MySQL
в первую очередь надо сменить пароль администратора для MySQL
Вход по умолчанию
В будущем нам полезно будет заходить на консоль mysql без указания данных из консоли, поэтому создадим файл /root/.my.cnf с таким содержимым.
Подготовка к тюнингу
Скачиваем с http://www.day32.com/MySQL/ скрипт MySQL Performance Tuning Primer Script.
Положим его в /root и сделаем пробный запуск:
В результате должен появится некий набор информации. Пока важно, чтобы самой первой строкой там было
mysqld is alive
После того, как мы запустим сайт, через некоторое время этот скрипт сможет дать хорошие рекомендации по тюнингу нашего MySQL-сервера.
Создание базы данных
CREATE DATABASE mysite;
GRANT ALL PRIVILEGES ON mysite.* TO 'mysite_user'@'localhost' IDENTIFIED BY 'mysite_user_password';
\q
Теперь мы имеем БД mysite, доступную только с этой VPS пользователю mysite_user с паролем mysite_user_password.
Можно начинать работать.
Оптимизация
GZip-сжатие
Дописываем эти строки после начала определения сервера в файле /etc/nginx/conf.d/mysite.conf
gzip_min_length 1024;
gzip_types text/html text/xml text/css application/x-javascript text/javascript;
Теперь выходные данные этих mime-типов будут сжиматься перед передачей, если клиент способен корректно сжатые данные понять.
Отдача статики через nginx
Предположим, у нас есть три варианта статичных файлов, - периодически изменяемые, никогда не изменяемые и редко изменяемые.
Периодически изменяемые лучше отдавать без особых ухищрений.
Предположим, мы хотим отдавать так скрипты из соответственно ссылок /js, /jss и /jsv.
Причём для редко изменяемых файлов запрос к файлу идёт как, например, /jsv/myscript.js|v2 (номер версии задаётся в тэге script[src], и при изменении файла надо этот номер версии каким-то образом инкрементировать), и каждая версия отдаётся как expires max.
Физически мы расположим эти файлы в каталогах
- /home/mysite.ru/static/js
- /home/mysite.ru/static/jss
- /home/mysite.ru/static/jsv0
Тогда в файле /etc/nginx/conf.d/mysite.conf выше строки location / { разместим следующие строки
Естественно, файлы надо физически поместить в этих каталогах:
Теперь эти файлы будут грамотно отдаваться через nginx.
После каждой модификации конфигурации нужно отдавать команду на её перечитывание
Увеличение лимитов Apache
В файле /etc/httpd/conf/httpd.conf ищем секцию и немного увеличиваем значения (MaxRequestsPerChild лучше наоборот уменьшить). Например, таким образом (по умолчанию настройки слишком зажаты, мы же здесь увеличим лимиты, съедая попутно больше оперативной памяти):
MinSpareServers 5
MaxSpareServers 15
ServerLimit 30
MaxClients 30
MaxRequestsPerChild 200
MaxKeepAliveRequests 50
KeepAliveTimeout 5
И, как, обычно, после этого необходимо выполнить
Оптимизация MySQL
Через несколько дней после начала работы с базами данных запустите вышеописанный скрипт тюнинга MySQL и следуйте его рекомендациям.
Обычно этого достаточно.
Что дальше
Самая главная задача после начала работы сайта - создание политики резервного копирования данных.
После этого мы рассмотрим политику обеспечения безопасности с использованием отдельных пользователей и групп.
И, наконец, создание набора ftp-доступов к сайту.
Комментарии
Кстати, капните мне немного кармы на Хабре, там запостю линк.
http://akzhan.habrahabr.ru/
Капнул.
А не расскажите, как мемкешед на мастерхосте поставить и настроить?
Пробовал стандартными средствами, на моменте конфигурации слетает, а глубже не разумею
мм, сейчас посмотрю.
я просто пока использовал встроенный кэш данных в eAccelerator.
P.S.: спасибо за карму. как-то с целях эксперимента залил холиварную статью на Хабр, теперь вот отозвалось
service memcached start
yum install php-pecl-memcache
service httpd restart
всё, секция Memcache появилась в phpinfo.
мм.. не понял, а где конкретно у вас возникли проблемы?
Добавил 127.0.0.1:11211 в список серверов.
вроде всё ок.
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";
Вывод:
Server's version: 1.2.3
P.S.: настройки, если что, тут: /etc/sysconfig/memcached
полезно прописать
Что разрешит доступ к memcached только с этой VPS.
Капнул.
Не планируется ли на Мастерхосте уже несколько кастомизированный "друпалоVPS"?
Планирую выложить несколько скриптов, автоматизирующих настройку VPS и создание на нём доменов.
Но это уже после третьей статьи. Сперва введение в background.
Спасибо. Буду пробовать.
Большое спасибо!
После действий, описанных в статье, решатся мои проблемы с созданием директорий ( http://www.drupal.ru/node/23726 ) ?
Неправильное решение тут было.. Это для CGI, я просто по своему опыту с Perl предложил )
создали пользователя akzhan (вам не надо).
добавили пользователя akzhan в группу apache.
uid=501(akzhan) gid=501(akzhan) groups=501(akzhan),48(apache)
проверили.
Это сработает, если каталоги и файлы создаются с нужными правами для группы, а не только для владельца.
да, и на всякий случай в коде конфигурирования (конфиг друпала, к примеру), вставьте просто вызов
Это заставит PHP создавать файлы и каталоги с правами на всё для группы.
Простите ради бога, что развожу тут форум, да ещё и с тупым вопросом, просто ситуация ну очень подходящая.
В целом, всё просто, но у меня мемкеша нет в репозитории. Так что я делаю так:
cd /usr/local/src
wget http://danga.com/memcached/dist/memcached-1.2.6.tar.gz
tar zxvf memcached-1.2.6.tar.gz
cd memcached-1.2.5
./configure
make
make install
И на стадии конфигурации мы не хотим собираться под CentOS
Может как-то можно yum'у указать где скачать мемкэшед?
Можно и так, и эдак.
В случае установки из RPM нужно предварительно собрать libevent.
Но можно просто добавить дополнительный репозиторий для yum.
http://dag.wieers.com/rpm/packages/rpmforge-release/
мне больше нравится второй подход, его и опишу.
Сперва смотрим http://dag.wieers.com/rpm/packages/rpmforge-release/ и находим нужную редакцию rpm-пакета. То есть - не * пишем в команде, а что-то для вас актуальное.
wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-*.rpm
rpm --install rpmforge-release-*.rpm
а теперь можно
я вместо rpaf добавил в index.php код:
конечно лучше поставить модуль, но иногда такой вариант может быть оправдан
Согласен с Вами. При понимании всех ограничений и такой вариант подходит.
Не подскажите как решить проблему - ВПС: сделал всё как в этой статье - домен заработал. Добавил ещё один домен и проделал требуемые операции. При просмотре этого второго домена из броузера - грузиться контекст первого домена тем не менее в вирутал сексии явно прописано ServerName seconddomain.ru
DocumentRoot /home/seconddomain.ru/www
ErrorLog /home/seconddomain.ru/logs/seconddomain.ru.ru.error_log
AllowOverride All
Options +Includes
- днс прописывал в мастерхосте аналонгично первому домену следующего ввида:
@ IN A 90.156.000.000
www IN CNAME seconddomain.ru.
Куда смотреть - в чём проблема?
Вы прописали всё одинаково и для nginx, и для Apache?
У меня на VPS сейчас крутится 6-9 доменов по вышеуказанной технике, всё OK.
Важно понимать, что разделение хостов идёт по имени, в конфигурации nginx, которые прописывает заголовок Host и кидает далее в Apache, который, в свою очередь, смотрит это имя в своей конфигурации.
Прописано должно быть одинаково в обоих демонах (nginx и Apache).
вроде бы всё верно - меня больше волнует вопрос корректности записи днс в мастерхосте - возможна ли там ощшибка которая приводит к описанной проблеме. в описанной технике есть помоему небольшие опечатки - например при прописывани в апаче вирутального хоста необходима дописывать порт 8080 а также в параметре NameVirtualHost * - по крайней мере я дописал но эффект прежний. 2 домен но оба ссыдлаются на один и тот же корень сайта - хотя в конфигах апача указано всё верно.
DNS-запись вида A в masterhost просто устанавливает соответствие между именем и IP-адресом. Если резолвится правильно (проверяемо по tracert имядомена), то записьсделана Вами корректно.
Сервер nginx получит запрос с этого адреса, но в запросе (согласно стандарту HTTP) также присутствует и имя хоста, которое и используется далее.
В Апаче никакого порта в имени хоста прописывать не нужно. За то, чтобы Апач читал только то, что он должен, отвечает директива Listen localhost:8080.
Ясно. сейчас немного локализовал проблему - второй домен работает нормально(грузит свой контектс) если я не использую www в начале домена. Сейчас сравниваю записи двух доменов - пока не вижу ошибок - правда в отличие от Вашей статьи в конфигах nginx пишу так в свойстве server_name
listen seconddomain.ru:80;
server_name seconddomain.ru www.seconddomain.ru;
ServerName mysite.ru
ServerAlias www.mysite.ru
...
Чёрт, забыл про эту директиву, сейчас поправлю статью.
Спасибо!
Последний совет с алиасом исправил ошибку - спасибо. Хотелось бы чтобы данный цикл статьи продолжился описанием настройки почты
Бррр, честно, почту я пока описывать не собирался
Есть как минимум несколько возможных решений вопроса, и я пока ньюп во всех известных решениях
Акжан, могут ли настройки, приведенные в статье, нарушить работу VDS (чтобы после рестарта сервер VDS не "поднялся")?
Немного не так. В статье не описано включение nginx в init.d, поэтому он не стартует автоматически при рестарте VPS.
Я просто не помню, как я это сделал
Если проблема в этом, то ситуацию разрешит команда service nginx start.
А что я делал в init.d - придётся вспоминать )))
Как праивльно прописать в автозапуск nginx mysqld и httpd - мастерхост без уведомлений перезапускает полностью весь сервис. Пытаюсь прописать в rc.local строку /usr/sbin/nginx - но не срабатывает.
Разобрался - ссылку nginx-а надо переменоватьь из "K" в "S" - тогда на третьем уровне rc3.d он будет запускаться сам - аналогично и для mysql
rm K36mysqld
ln -s ../init.d/mysqld S36mysqld
Сервер всё что начинается с "S" - запускает сам на 3-ем уровне.
Сейчас посмотрел, у меня так же, с уровнем S.
Спасибо, допишу об этом в следующей статье
Можно, кстати, одной командой
Не требуется ничего в rc*.d править руками! В Fedora для этого есть утилита chkconfig, которая позволяет добавлять сервисы в автозапуск и убирать их оттуда. Эта утилита присутствует обычно и в других RedHat-based дистрибутивах (в Gentoo этой задачей занимается rc-update, в Debian-based - update-rc.d).
Спасибо за хорошую статью!
Скорее было бы продолжение
Большое спасибо за статью и комментарии Akzhan'у и всем остальным!
Я сталкиваюсь с настройкой VPS впервые и прошу помочь в таком вопросе:
Есть сайт, который крутится на обычном тарифе, доменное имя указывает на него. Готовится новая версия на drupal'е, для чего был приобретен VPS на .masterhost'е (Fedora), однако, пока сайт не будет целиком настроен и протестирован, вносить изменения в DNS-зоны нельзя. Подскажите, пожалуйста, как настроить nginx и apache, чтобы они работали пока по ip-адресу в url'ах, а не по доменному имени? Или какой-либо другой вариант (возможно с использованием домена третьего уровня, типа test.example.com).
И еще вопрос - почему в статье файлы веб-севера предлагается хранить в папке /home, а не в /var/www/что-то_там?
От себя добавлю (может кому пригодится) комментарий к посту axel'а:
делается это так (для Fedora):
chkconfig --level 345 httpd on
chkconfig --level 345 mysqld on
Здравствуйте, Акжан!
Такой вопрос:
Есть VPS на мастерхосте, Fedora 7, 768МБ оперативки, с установленным плеском.
На VPS висит 18 доменов, из которых активно используются от силы 5, плюс они имеют некоторое количество поддоменов
Суть проблемы:
VPS очень уж жрёт ресурсы и быстродействие крайне страдает.
Хочется поставить фронтэндом nginx, а апач оставить бэкэндом.
делал по вашей инструкци, но появились проблемы:
как только добавляю в /etc/httpd/conf.d/ файл имя_сайта.ru.conf
httpd отрубается
вместо сайтов отображается тестовая страничка Федоры (причём, почему-то именно Федоры, а не nginx'а)
Странно... попробуйте создать чистый VPS и с нуля всё сделать по инструкции.
Ведь как был сконфиририрован ранее ваш сервер, я не знаю, вполне могут быть конфликты конфигурационных файлов.
К сожалению, нет возможности взять новый VPS, хотел уже имеющийся перевести на nginx.
Также хотел узнать, есть ли возможность сохраниять PLESK работающим в этой связке nginx+apache?
В конфигурации nginx я вписал то что в данной инструкции было дано:
listen mysite.com:80;
server_name www.mysite.com;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
log_not_found off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
а как грамотно отдавать статику Drupal в связке с Apache? у каго какие настройки?
Если делаю так
После этого в каталоге /etc/httpd/cond.d/ создадим файл mysite.ru.conf следующего вида:
не работает - если так
После этого в каталоге /etc/httpd/conf.d/ создадим файл mysite.ru.conf следующего вида:
Тогда работает
Еще в информации о php отображает не мой ip - делал все как у Вас единственное mod_rpaf тоже поместил в conf.d/
спасибо за поправки! неизвестно, как .d пропало...
касательно rpaf, - на расстоянии туго ставить диагноз.
Подскажте, как со всем этим делом настроить доступ к phpMyAdmin? (ставил по вашему мануалу)
А какое отношение имеет phpMyAdmin ко всему что выше?
Скачайте его, распакуйте и всё, самый просто вариант
Я его поставил через репы, однако как мне к нему обратиться из инета? Как настроить это?
/phpmyadmin, скорей всего