Пошаговое руководство по настройке сервера для хостинга сайтов
Виталий «root» Чернов (vital@real.xakep.ru)
Думаю, каждый из нас пытался сделать из своего компа веб-сервер. Кто-то для этого ставил под виндой пакет со всеми прелестями (Apache+PHP+MySQL), кто-то компилил тарболлы из сырцов под фрю, но все без исключения вдумчиво вкуривали мануалы. В Сети полно документации по каждому из пакетов в отдельности, но чтобы собрать полнофункциональный сервак, порой требуется не одна неделя. Сегодня я хочу показать, как можно быстро установить и настроить связку Apache+OpenSSL+PHP+MySQL+Phpmyadmin+ProFTPd с чистого листа. Все это составляющие классического веб-сервера для хостинга сайтов.
Содержание:
- Что потребуется
- Установка Apache+OpenSSL+PHP+MySQL
- Установка ProFTPd
- Настройка
- Пару слов о безопасности
- Добавление новых сайтов
- Заключение
Для экспериментов нам понадобится настроенный и рабочий Linux. В настоящее время любой дистрибутив имеет в своем арсенале продвинутый менеджер пакетов, но мы откажемся от его использования. Все будем ставить исключительно из исходных текстов. На это есть ряд причин. Во-первых, мы всегда сможем иметь самые свежие версии пакетов. Во-вторых, так появляется гибкость при конфигурировании. В-третьих, зависимость от системы — это подход Майкрософт. При установке из исходников название дистрибутива нам вообще должно быть безразлично.
Лично у меня собрано 2 сервера на ALT Linux. Аптайм грамотно настроенного сервера на нормальном железе достигает нескольких лет, да и то, все проблемы, как правило, от уборщиц и электромонтеров :).
Все пакеты на момент написания статьи я качал самые свежие из стабильных, а именно: httpd-2.2.6, php-5.2.4, mysql-5.0.45, proftpd-1.3.1, openssl-0.9.8g, mod_ssl-2.8.30 (весь упомянутый софт можно найти на прилагаемом к журналу диске). В принципе, все вышеуказанное ты можешь поставить из прекомпилированных для своей системы пакетов, но в таком случае расположение конфигов и каталогов может отличаться от описываемых в статье.
Установка Apache+OpenSSL+PHP+MySQL
Начинать лучше с OpenSSL. Переходим в каталог с архивом и вводим следующее:
# tar -xf openssl-0.9.8g.tar.gz # cd openssl-0.9.8g # ./config # make; make test; make install
Теперь поставим для web-сервера, собственно, сам SSL-модуль. Внимание! При конфигурировании нужно обязательно указывать путь к исходникам Apache и OpenSSL, соответственно, оба архива уже должны быть распакованы:
# tar -xf httpd-2.2.6.tar.gz # tar -xf mod_ssl-2.8.30-1.3.39.tar.gz # cd mod_ssl-2.8.30-1.3.39 # ./configure --with-apache=../httpd-2.2.6 --with-ssl=../openssl-0.9.8g --with-crt=/usr/local/apache2/conf/ssl.crt/server.crt --with-key=/usr/local/apache2/conf/ssl.key/server.key --prefix=/usr/local/apache2
Далее по списку идет Apache. Собираем исходники и устанавливаем самым примитивным способом, но уже с сертификатами:
# cd ../httpd-2.2.6 # ./configure --enable-ssl # make; make certificate; make install
Все собирается без проблем, при условии, что отсутствуют неудовлетворенные зависимости. Если в процессе компиляции возникают ошибки, ни в коем случае нельзя компилировать с опцией ‘-i’ (игнорирование ошибок при сборке). В таком случае сервер долго не проживет, и, естественно, никак нельзя гарантировать его безошибочную и стабильную работу.
После установки в каталоге /usr/local/apache2 у нас появился установленный апач, конфиг которого лежит в подкаталоге conf. Открываем httpd.conf и добавляем три строки в начало файла:
# vi /usr/local/apache2/conf/httpd.conf
SSLEngine on
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
Теперь запускаем Apache следующим образом:
# /usr/local/apache2/bin/httpd -startssl
И честно отвечаем на задаваемые вопросы.
Теперь если в браузере перейти по http://localhost/, должна появиться страница с сообщением «It works!». То же самое происходит при переходе по https://localhost/. Это означает, что демон вполне работоспособен. Если на попытку запуска демон выдает ошибку, возможно, что-то уже висит на 80 или 443 порту. Проверить можно так:
# netstat -p tcp -a --numeric-ports | grep *:80 # netstat -p tcp -a --numeric-ports | grep *:443
Если порт действительно занят, виновный процесс можно убить по PID или по имени, которые возвратят эти команды.
В любом другом случае ошибки не должно произойти — по умолчанию конфиг настроен наипростейшим образом, а права на файлы расставлены корректно.
Следующий шаг — инсталляция MySQL:
# tar -xf mysql-5.0.45.tar.gz # cd mysql-5.0.45/ # ./configure # make; make install
Теперь создадим группу и пользователя, с правами которого будет работать демон:
# groupadd mysql # useradd -g mysql mysql
Далее у нас идет создание служебных баз данных и таблиц. Для этого переходим в подкаталог scripts и запускаем файл mysql_install_db:
# ./mysql_install_db
Проследи внимательно результат стандартного вывода скрипта на наличие ошибок. Если все ОК, стартуем демон:
# /usr/local/bin/mysqld_safe &
По умолчанию администратором баз данных является пользователь root без пароля. Это не есть гуд. В целях безопасности мы должны сразу установить свой пароль:
# /usr/local/bin/mysqladmin -u root password 'новый пароль'
Все, MySQL больше не трогаем. Так как Apache и MySQL уже инсталлированы, при сборке PHP следует указать пути до apxs и mysql:
# tar -xf php-5.2.4.tar.bz2; cd php-5.2.4/ # ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local # make; make test; make install
Теперь мы должны заставить Apache распознавать PHP-файлы как исполняемые скрипты, а не просто выводить их содержимое в виде текста. Для этого идем в его конфиг и добавляем в начало файла три директивы AddType:
# vi /usr/local/apache2/conf/httpd.conf
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php-source .phps
После чего ищем строку «DirectoryIndex index.html» и меняем ее на «DirectoryIndex index.html index.html.var index.php». Перезапускаем httpd-демон:
# /usr/local/apache2/bin/apachectl restart
Далее создаем в /usr/local/apache2/htdocs каталог phpmyadmin и копируем в него все файлы из тарболла phpMyAdmin-2.10.2. Теперь можно проверить работоспособность Apache в связке с PHP+MySQL. Скопируем файл config.sample.inc.php в config.inc.php (тот, что лежит в /usr/local/apache2/htdocs/phpmyadmin), раскомментируем в нем строки controluser и controlpass, впишем туда пользователя root и его пароль и добавим в blowfish_secret любую строку из произвольных символов (она используется для идентификации cookie). Теперь идем на http://localhost/phpmyadmin/ и, если все правильно собрано, оказываемся в админке базы данных! Все, с установкой веб-сервера разобрались. Переходим к FTP.
В качестве FTP-сервера я давно для себя выбрал ProFTPd. Единственная проблема при его использовании — если закачка файлов производилась с Windows-машин, то из названий русских файлов вырезаются буквы «ыьэюя». Дело в том, что ProFTPd пропускает весь свой трафик через Telnet, который воспринимает символы с кодами 251-255, как управляющие последовательности, и вырезает их. Но не стоит отчаиваться — такое поведение можно исправить небольшим вмешательством в файл src/netio.c. Просто удали из него строки:
switch (mode) {
case IAC:
[[ часть кода пропущена ]]
mode = cp;
continue;
}
break;
}
После этого смело компилируй:
# ./configure # make; make install
Файл запуска установился как /usr/local/sbin/proftpd. Запусти его и проверь в ftp-клиенте адрес ftp://localhost/. Если каталог открылся, значит, установка прошла успешно.
Вот и все! Но в практическом плане пока наш сервер ничего собой не представляет. Для того чтобы запускать его в продакшн, необходима дальнейшая настройка.
Для начала следует определиться, что нам действительно необходимо получить на выходе. Нарисуем примерно такую картину:
- Наш сервер имеет доменное имя myservak.ru.
- На сервере может располагаться любое количество сайтов, доменные имена которых Apache должен распознавать.
- Сервер имеет статический IP-адрес с выходом в интернет через интерфейс eth0.
- Снаружи должны быть видны следующие порты — http(80), ftp(21).
- Все остальные порты должны быть закрыты на интерфейсе eth0, но открыты на всех остальных для администрирования сервера из доверенных сетей.
- Право на редактирование каталога с web-файлами по FTP будут иметь только пользователи-владельцы сайтов под своими паролями.
- Редактировать главный сайт компании myservak.ru по FTP будет только пользователь admin.
- Все сервисы должны запускаться автоматически после перезагрузки системы.
Итак, создадим каталог /srv, где будем хранить наш сайт, и два подкаталога cgi-bin и htdocs для cgi-скриптов и для html-документов, соответственно. Добавляем пользователя admin, которому в качестве домашнего каталога назначаем /srv, не забыв поменять владельца:
# mkdir -p /srv/{cgi-bin,htdocs}
# useradd -d /srv admin
# passwd admin
# chown admin /srv
# chmod 775 /srv
Теперь идем в /usr/local/etc/proftpd.conf и полностью удаляем секцию <Anonymous>. Таким образом мы перекроем кислород всем анонимным пользователям. Перезапускаем proftpd:
# killall proftpd # /usr/local/sbin/proftpd
И пробуем зайти. После того, как доступ по FTP открыт, можно смело закидывать html-документы в каталог /srv/htdocs. Теперь займемся настройкой Apache.
Открываем /usr/local/apache2/conf/httpd.conf и правим так: ServerAdmin — сюда пишем свой ящик; везде, где встречается /usr/local/apache2/htdocs, меняем на /srv/htdocs, а /usr/local/apache2/cgi-bin на /srv/cgi-bin. После внесенных изменений снова перезапускаем демон:
# /usr/local/apache2/bin/apachectl restart
Теперь внимание! Команда «chmod 775 /srv» в нашем случае решающая. Так как владельцем каталога у нас является admin, а группа — root, доступ для них должен быть открыт полностью, чтобы можно было свободно манипулировать файлами по ftp и локально. Для всех остальных пользователей выставляются права только на чтение и на запуск скриптов. Только в этом случае можно гарантировать корректную работу и должный уровень безопасности.
Хотя *nix-серверы и считаются надежными, от перезагрузок не застрахован никто. И будет тоскливо, если после каждого включения нам придется стартовать все демоны вручную. Чтобы избежать проблем в будущем, лучше сразу развентилировать этот вопрос, поместив все стартовые файлы в каталог /etc/init.d. Кроме того, у нас появится возможность элегантно управлять сервисами (к примеру, service apache restart/stop/start).
В случае с Apache все решается достаточно просто — выполни команду:
# cp /usr/local/apache2/bin/apachectl /etc/init.d/apache
Для MySQL строка установки демона в качестве сервиса будет выглядеть так:
# cp /usr/local/bin/mysqld_safe /etc/init.d/mysql
К сожалению, для ProFTPD разработчики не позаботились выложить готовый скрипт для init.d, поэтому его код мы приводим на диске.
Если ты не хочешь, чтобы все новые сервисы стартовали по умолчанию на пятом уровне запуска, создай ссылки в соответствующих rc.d вручную. Лично у меня все поднимается на третьем runlevel’е. После этого можешь смело перезагрузиться и протестировать работу.
Не уделить внимание безопасности мы просто не можем. Ведь от того, как грамотно настроен доступ снаружи к нашему серверу, будет зависеть и жизнь сайтов, которые у нас будут хоститься.
В первую очередь, стоит обратить внимание на открытые порты. Совсем ни к чему, например, оставлять открытым порт на MySQL. Самый эффективный способ отфильтровать возможные вторжения — это использовать Iptables:
# iptables -A INPUT -i eth0 -p tcp -m multiport --dports 3306,... <Здесь через запятую можно указать порты, которые мы не будем оставлять открытыми наружу> -j REJECT --reject-with icmp-port-unreachable
Естественно, это будет работать только в том случае, если интерфейс eth0 смотрит в Интернет.
Вот еще несколько советов по безопасности:
- Ни в коем случае не используй простые пароли! Стойкий пароль должен состоять, как минимум, из 8-ми символов, которые чередуются заглавными, строчными буквами, спецсимволами и цифрами.
- Не устанавливай для разных административных задач одинаковые пароли.
- Подумай несколько раз, прежде чем устанавливать права на файлы или каталоги. 777 — это далеко не лучшие права.
Итак, у нас есть каталог /srv, в котором мы храним наш главный сайт, но в случае хостинга, одним сайтом, естественно, не обойтись. Можно, конечно, создать каталоги для других сайтов внутри /srv и обращаться к ним «http://myservak.ru/pupkin», но это очень неудобно, тем более что Apache обладает всеми возможностями для решения этой проблемы с помощью виртуальных хостов. Есть два вида виртуальных хостов — отдельные для каждого IP адреса и использующие один IP (name-based хосты). Мы будем использовать последние. Теперь представим, что нам дали заказ на хостинг сайта «number2.ru».
В первую очередь, мы должны добавить группу для новых пользователей и создать в этой группе соответствующего пользователя:
# groupadd hosting # useradd -d /home/number2 -g hosting number2 # passwd number2
Естественно, имя юзера не обязательно должно соответствовать названию сайта. Теперь создадим для пользователя домашний каталог и установим на него владельца и соответствующие права:
# mkdir /home/number2 # chown number2 /home/number2 # chmod 775 /home/number2
В этом каталоге нужно создать каталог htdocs для хранения файлов сайта, cgi-bin для скриптов и журнальные файлы error.log и access.log:
# mkdir /home/number2/{htdocs,cgi-bin}
# chown number2 /home/number2/{htdocs,cgi-bin}
# chmod 775 /home/number2/{htdocs,cgi-bin}
# echo '###Log file for error logging###' | tee /home/number2/error.log
# echo '###Log file for access logging###' | tee /home/number2/access.log
Далее переходим в конфиг Apache и добавляем несколько строчек:
# vi /usr/local/apache2/conf/httpd.conf
#number2
<VirtualHost number2>
ServerAdmin admin@number2.ru
ServerName number2
DocumentRoot «/home/number2/htdoc»
ScriptAlias /cgi/ «/home/number2/cgi-bin»
ErrorLog /home/number2/error.log
CustomLog /home/number2/access.log common
</VirtualHost>
И немного подправим /etc/hosts, добавив туда локальный и внешний IP-адрес нашего сайта:
# vi /etc/hosts
127.0.0.1 number2
my.ext.ip.addr number2
В конфиге ProFTPd при этом никаких изменений делать не надо. Все, после этого можно смело заходить на http://number2.ru и на ftp://number2.ru.
После того как фундамент готов, можно добавлять панель управления хостингом, почтовый сервер и много других примочек на твое усмотрение. Все зависит только от твоей фантазии. От себя могу только пожелать удачи в этом нелегком, но очень прибыльном начинании. Может быть, ты мне когда-нибудь подаришь метров 100 халявного хостинга :).
Статья опубликована в декабрьском номере журнала «Xakep» за 2007 год.




