Покрокове керівництво по налаштуванню сервера хостингу сайтів

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

Для експериментів нам знадобиться налаштований і робочий Linux. В даний час будь-який дистрибутив має в своєму арсеналі просунутий менеджер пакетів, але ми відмовимося від його використання. Всі будемо ставити виключно з вихідних текстів. На це є ряд причин. По-перше, ми завжди зможемо мати найсвіжіші версії пакетів. По-друге, так з’являється гнучкість при конфігуруванні. По-третє, залежність від системи — це підхід Microsoft. При установці з исходников назва дистрибутива нам взагалі повинно бути байдуже.

Особисто у мене зібрано два сервера на ALT Linux. Аптайм грамотно налаштованого сервера на нормальному залозі досягає декількох років, та й то всі проблеми, як правило, від прибиральниць і електромонтерів :).

Для написання статті я качав найсвіжіші пакети з стабільних, а саме httpd-2.2.6, php 5.2.4, mysql-5.0.45, proftpd-1.3.1, openssl-0.9.8 g, mod_ssl-2.8.30 (весь згаданий софт можна знайти на прикладеному до журналу диску). В принципі, все вищевказане ти можеш поставити з прекомпилированных для своєї системи пакетів, але у такому разі розташування конфіги і каталогів, описаним у статті.
Установка Apache+OpenSSL+PHP+MySQL

Починати краще з OpenSSL. Переходимо в каталог з архівом і вводимо наступне:

# tar -xf openssl-0.9.8g.tar.gz

# cd openssl-0.9.8 g

# ./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.8 g

–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

І чесно відповідаємо на запитання.

Тепер при переході у браузері за localhost/ повинна з’явитися сторінка з повідомленням: «It works!». Те ж саме відбувається при переході з 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). Тепер йдемо на 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 і повністю видаляємо секцію. Таким чином ми перекриємо кисень усім анонімним користувачам. Перезапускаємо 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 error for 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

ServerAdmin [email protected]

ServerName number2

DocumentRoot “/home/number2/htdoc”

ScriptAlias /cgi/ “/home/number2/cgi-bin”

ErrorLog /home/number2/error.log

CustomLog /home/number2/access.log common

І трохи правимо /etc/hosts, додаючи туди локальний і зовнішній IP-адреса нашого сайту:

# vi /etc/hosts

127.0.0.1 number2

my.ext.ip.addr number2

В конфіги ProFTPd при цьому ніяких змін робити не треба. Все, після цього можна сміливо заходити на number2.ru і на ftp://number2.ru.
Висновок

Після того як фундамент готовий, можна додавати панель управління хостингом, поштовий сервер та багато інших примочок на твій розсуд. Все залежить тільки від твоєї фантазії. Від себе можу тільки побажати удачі в цій нелегкій, але дуже прибутковому починанні. Може бути, ти коли-небудь подаруєш мені метрів 100 халявного хостингу :).