Информационные технологииStfw.Ru 🔍

Web-сервер для хостинга на одном дыхании

Пошаговое руководство по настройке сервера для хостинга сайтов Виталий «root» Чернов
🕛 28.08.2008, 14:03
Пошаговое руководство по настройке сервера для хостинга сайтов

Думаю, каждый когда-либо пытался сделать из своего компа веб-сервер. Кто-то для этого ставил под Виндой пакет со всеми прелестями (Apache+PHP+MySQL), кто-то компилил тарболлы из сырцов (сорцов?) под фрю, но все без исключения вдумчиво вкуривали мануалы. В Сети полно документации по каждому из пакетов в отдельности, но, чтобы собрать полнофункциональный сервак, порой требуется не одна неделя. Сегодня я хочу показать, как можно быстро установить и настроить связку Apache+OpenSSL+PHP+MySQL+Phpmyadmin+ProFTPd с чистого листа. Все это составляющие классического веб-сервера для хостинга сайтов.
Что потребуется

Для экспериментов нам понадобится настроенный и рабочий Linux. В настоящее время любой дистрибутив имеет в своем арсенале продвинутый менеджер пакетов, но мы откажемся от его использования. Все будем ставить исключительно из исходных текстов. На это есть ряд причин. Во-первых, так мы всегда сможем иметь самые свежие версии пакетов. Во-вторых, так появляется гибкость при конфигурировании. В-третьих, зависимость от системы - это подход Майкрософт. При установке из исходников название дистрибутива нам вообще должно быть безразлично.

Лично у меня собрано два сервера на 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.
Установка ProFTPd

В качестве 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/. Если каталог открылся, значит установка прошла успешно.

Вот и все! Но в практическом плане пока наш сервер ничего собой не представляет. Для того чтобы запускать его в продакшн, необходима дальнейшая настройка.
Настройка

Для начала следует определиться, что нам действительно необходимо получить на выходе. Нарисуем примерно такую картину:
1. Наш сервер имеет доменное имя myservak.ru. 2. На сервере может располагаться любое количество сайтов, доменные имена которых Apache должен распознавать. 3. Сервер имеет статический IP-адрес с выходом в интернет через интерфейс eth0. 4. Снаружи должны быть видны следующие порты: http(80), ftp(21). 5. Все остальные порты должны быть закрыты на интерфейсе eth0, но открыты на всех остальных для администрирования сервера из доверенных сетей. 6. Право на редактирование каталога с web-файлами по FTP будут иметь только пользователи-владельцы сайтов под своими паролями. 7. Редактировать главный сайт компании myservak.ru по FTP будет только пользователь admin. 8. Все сервисы должны запускаться автоматически после перезагрузки системы.

Итак, создадим каталог /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 смотрит в интернет.

Вот еще несколько советов по безопасности:
1. Ни в коем случае не используй простые пароли! Стойкий пароль должен состоять как минимум из восьми символов и включать чередующиеся заглавные, строчные буквы, спецсимволы и цифры. 2. Не устанавливай для разных административных задач одинаковые пароли. 3. Подумай несколько раз, прежде чем устанавливать права на файлы или каталоги. 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 халявного хостинга :).

Интернет и сети   Теги: Apache, Mysql, Php, Web, Сервер

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉