Директива UserDir включает поддержку пользовательских каталогов. Эта директива определяет общее название подкаталога в домашних каталогах всех пользователей. По умолчанию используется каталог public_html. Данная возможность очень удобна при использовании ее в большой корпорации, где каждый сотрудник имеет собственную страничку. Раньше эта возможность часто использовалась на серверах, предоставляющих бесплатный хостинг. Может быть, помните адреса вида http://www.chat.ru/~mypage? Сейчас же все чаще используется технология виртуальных серверов, которую мы рассмотрим в следующем пункте, но знать что такое каталоги пользователей и как с ними работать тоже не помешает. Тем более, что домашние каталоги настраиваются намного быстрее и проще, чем виртуальный сервер — нужно всего лишь определить директиву UserDir и указать месторасположения домашних каталогов.
Доступ к файлам, расположенным в этих каталогах, производится с помощью указания через наклонную черту пользователя после имени сервера. Например, пусть имя сервера www.server.com, имя пользователя — denis, тогда URL-адрес будет выглядеть так: http://www.server.com/~denis/. При этом сервер самостоятельно определит, где именно расположен домашний каталог пользователя. Если домашний каталог пользователя /home/den, то сервер передаст клиенту файл /home/den/public_html/index.html.
12.4. Виртуальный HTTP-сервер
Концепция виртуальных хостов позволяет серверу Apache поддерживать несколько Web-узлов. Получается, что один Web-сервер заменяет несколько серверов, и вместо одного узла пользователи видят отдельные Web-узлы. Это очень удобно, если нужно организовать персональные Web-узлы пользователей или собственные Web-узлы подразделений компании, например, develop.mycompany.com.
Сервер Apache можно настроить несколькими способами: чтобы запускался один сервер, который будет прослушивать ВСЕ обращения к виртуальным серверам, или запускать отдельный процесс для каждого виртуального сервера. В первом случае один сервер будет одновременно обслуживать все виртуальные. Если вас интересует такой вариант, нужно настраивать виртуальные сервера с помощью директивы VirtualHost. Настройка отдельных процессов для каждого сервера осуществляется с помощью директивы Listen и BindAddress.
В этом разделе я буду рассматривать именно первый случай. Внутри блока директивы VirtualHost можно использовать любые директивы, кроме ServerType, BindAddress, Listen, NameVirtualHost, ServerRoot, TypesConfig, PidFile, MinRequestPerChild, MaxSpareServers, MinSpareServers, так как некоторые из них относятся к основному HTTP-серверу (например, ServerType), а некоторые — ко второму варианту настройки виртуальных серверов и здесь неприемлемы. Обязательно должны присутствовать директивы ServerName, DocumentRoot, ServerAdmin и ErrorLog.
В зависимости от версии и от настроек Apache виртуальные узлы могут прописываться или в файле httpd.conf, или в файле vhosts.conf. Виртуальные серверы можно идентифицировать по имени или по IP-адресу.
12.4.1. Виртуальные серверы с идентификацией по имени
Идентификация по имени имеет существенное преимущество перед идентификацией по IP-адресу: вы не ограничены количеством адресов, имеющемся у вас в распоряжении. Вы можете использовать любое количество виртуальных серверов, и при этом вам не потребуются дополнительные адреса. Такое возможно благодаря использованию протокола HTTP/1.1. Данный протокол поддерживается всеми современными браузерами.
Поддержка виртуальных хостов обеспечивается директивами VirtualHost и NameVirtualHost. Если ваша система имеет только один IP-адрес, его нужно указать в директиве VirtualHost. Внутри блока директивы VirtualHost записывается директива ServerName. Эта директива задает доменное имя для создаваемого виртуального сервера. Это обязательно нужно сделать, чтобы избежать поиска службой DNS — вы же не хотите, чтобы при неудачном поиске виртуальный сервер был заблокирован? Все директивы VirtualHost используют один и тот же IP-адрес, заданный директивой NameVirtualHost. В блоке VirtualHost записываются параметры виртуального сервера, причем они записываются для каждого виртуального сервера отдельно. Пример приведен в листинге 12.9.
Листинг 12.9. Два виртуальных сервера — www 121– и libServerName den.dhsilabs.com
ServerName www.dhsilabs.com
ServerAdmin [email protected]
DocumentRoot /var/httpd/www/html
Error Log /var/https/www/logs/error.log
TransferLog logs/access.log
ServerName lib.dhsilabs.com
ServerAdmin [email protected]
DocumentRoot/var/httpd/lib/html
ErrorLog /var/https/lib/logs/error.log
TransferLog logs/access.log
Если ваша система имеет только один IP-адрес, доступ к основному серверу станет невозможным, то есть вы не сможете использовать его напрямую. Можно основной сервер использовать в качестве виртуального, что я и сделал в листинге 12.9: основной сервер www является виртуальным. При наличии двух IP-адресов можно один присвоить основному серверу, а другой — виртуальному.
Сервер Apache позволяет использовать несколько доменных имен для доступа к одному серверу, например:
ServerAlias www.dhsilabs.com www2.dhsilabs.com
При этом запросы, посланные по IP-адресам, которые присвоены вашим виртуальным хостам, должны соответствовать одному из указанных доменных имен. Чтобы зафиксировать запросы, не соответствующие ни одному их этих имен, нужно с помощью опции default:* создать виртуальный хост, который будет обслуживать такие запросы:
Обратите внимание на то, что в рассмотренном примере адреса www.dhsilabs.com и lib.dhsilabs.com должны быть прописаны в DNS.
12.4.2. Виртуальные серверы с идентификацией по IP-адресу
В директиве VirtualHost в качестве адресов можно использовать доменные имена, но лучше указывать IP-адрес, причем действительный, а не виртуальный. В этом случае вы не будете зависеть от DNS при разрешении имени. Также потребуется один IP-адрес для вашего основного сервера. Если же распределить все адреса между виртуальными серверами, то нельзя будет получить доступ к основному серверу.
Листинг 12.10. Идентификация по IP-адресу
ServerName www.dhsilabs.com
ServerAdmin [email protected]
DocumentRoot /var/httpd/www/html
ErrorLog /var/https/www/logs/error.log
ServerName lib.dhsilabs.com
ServerAdmin [email protected]
DocumentRoot /var/httpd/lib/html
ErrorLog /var/https/lib/logs/error.log
В приведенном примере (см. листинг 12.10) сконфигурированы два виртуальных сервера с идентификацией по IP-адресу. Один из них использует сам IP-адрес, а другой — доменное имя, соответствующее IP-адресу.
При конфигурировании виртуальных серверов можно использовать опцию ExecCGI, которая разрешает выполнение CGI-скриптов на виртуальном сервере. Ниже приведен пример для почтового Web-интерфейса (листинг 12.11).
Листинг 12.11. Подключение почтового Web-интерфейса# Файл httpd.conf
order deny,allow
deny from all
allow from localhost
allow from 192.168
allow from 123.123.123.123
Options ExecCGI
# Файл vhosts.conf
ServerAdmin [email protected]
DocumentRoot /home/httpd/mail
ServerPath /mail
ServerName wwwmail.dhsilabs.com
ErrorLog logs/error_log
TransferLog logs/access_log
ErrorDocument 403 http://www.dhsilabs.com/messages/error403.html
# Error 403 — доступ извне, то есть почтовый интерфейс будет доступен только
# из локальной сети
12.5. SSL и Apache
12.5.1. Установка SSL
SSL (Secure Sockets Layer) является методом шифрования, разработанным компанией Netscape для обеспечения безопасности в Интернет. Этот метод поддерживает несколько способов шифрования и обеспечивает аутентификацию как на уровне клиента, так и на уровне сервера. SSL работает на транспортном уровне и поэтому обеспечивает надежное шифрование всех типов данных. Более подробно о реализации SSL можно прочитать на сайте компании Netscape — http://home.netscape.com/info/security-doc.html
Протокол S-HTTP является еще одним «безопасным» Интернет-протоколом. Он был разработан для предоставления конфиденциальности данных, передаваемых через соединение. Конфиденциальность нужна, например, при передаче номеров кредитных карточек и прочей важной информации.
Модуль mod_ssl реализует в сервере Apache слой SSL, который осуществляет шифрование всего потока данных между клиентом и сервером. Для всех остальных частей Web-сервера модуль mod_ssl является прозрачным. Для работы в этом режиме требуется браузер, поддерживающий механизм SSL (этому условию удовлетворяют все современные распространенные браузеры).
Что касается установки, то вам необходимо установить пакет OpenSSL (http://www.openssl.org), хотя возможно у вас в системе уже установлен этот пакет. Для проверки этого введите openssl, и если вы увидите в ответ приглашение OpenSSL>, значит — OpenSSL уже установлен. В противном случае для установки OpenSSL выполните следующие шаги (перед этим выполните команду su для того, чтобы приобрести привилегии суперпользователя):
1. Распакуйте последнюю версию OpenSSL командой:
tar zxvf openssl-x.у.z.tar.gz (x.y.z — номер версии).
2. Перейдите в каталог openssl-x.y.z и выполните команду:
./config.
3. Если все нормально (нет ошибок), введите команду:
make
Примечание. При возникновении ошибок, скорее всего вам придется установить недостающие пакеты.
4. Затем нужно ввести команды make install и ldconfig. Перед выполнением команды ldconfig убедитесь, что в файле /etc/ld.so.conf прописан путь к библиотекам OpenSSL (по умолчанию это /usr/local/ssl/lib).
12.5.2. Подключение SSL к Apache
Теперь осталось подключить mod_ssl к Apache. При этом следует учитывать, что вам нужна версия mod_ssl, которая совместима с вашей версией Apache. Иначе модуль mod_ssl будет некорректно работать или вообще откажется что-либо делать. Последние цифры в названии модуля указывают на совместимость с определенной версией Apache. Например, для Apache 1.3.14 нужен файл mod_ssl-2.7.1-1.3.14.tar.gz. Здесь 2.7.1 — версия mod_ssl. Распакуйте модуль командой:
tar zxvf mod_ssl-x.у.z-2.0.0.tar.gz
и выполните команду:
./configure –with-apache=../apache_1 .3.14 –with-ssl=../openssi-0.9.5
В данном примере я использую OpenSSL 0.9.5. Теперь перейдите в каталог с Apache, откомпилируйте его и установите сертификат:
cd ../apache-1.3.14
make
make certificate
make install
Таким образом вы установите Apache в каталог, указанный в опции — prefix (по умолчанию /usr/local/apache). Теперь попробуйте запустить Apache. Это можно сделать с помощью команды:
usr/local/apache/bin/apachectl startssl
Параметр startssl необходим для включения SSL. Сервер Apache уже функционирует, однако обратиться по протоколу https вы еще не можете. Для этого вам нужно сконфигурировать виртуальные хосты, которые будут использовать протокол https. Но для начала необходимо настроить Apache для прослушивания порта 443. С этой целью откройте любым редактором файл /etc/httpd/conf/httpd.conf и добавьте в него следующие строки:
Listen 443
NameVirtualHost x.x.x.x:443
Примечание. Порт 443 — это стандартный порт для протокола HTTPS. Именно по этому порту Apache будет прослушивать виртуальные хосты.
Теперь непосредственно приступите к созданию виртуального сервера, работающего по протоколу https, для чего продолжите редактирование файла /etc/httpd/conf/httpd.conf. Пример того, что необходимо при этом ввести, приведен в листинге 12.12:
Листинг 12.12. Виртуальный https-cepвep
# Эти строки нужны для поддержки SSL
SSLEngine on
SSLLogLevel warn
SSLOptions+StdEnvVars
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key
SSLLog /usr/local/apache/logs/ssl_engine_log
# -----------------------
ServerName www.dhsilabs.com
ServerAdmin [email protected]
DocumentRoot /var/httpd/www/html
ErrorLog /var/https/www/logs/error.log
После таких строк вы можете конфигурировать свой виртуальный хост как обычно. Теперь нужно перезапустить сервер httpd. При запуске Apache потребует ввести пароль. Если вы не хотите вводить его при каждом запуске системы — перейдите в каталог, где находится файл ssl.key и выполните следующие команды:
cp server.key server.key.org
openssl rsa –in server.key.org –out server.key
chmod 400 server.key
Почти все готово! Теперь сервер не должен запрашивать пароль и будет работать в нормальном режиме. При обращении https://host.domain браузер запросит вас на предмет использования сертификата.
Чтобы Apache по умолчанию стартовал с поддержкой SSL, исправьте в файле bin/apachectl условие start на startold, a startssl на просто start. Затем, находясь в каталоге .usr/local/bin, установите ссылку openssl:
ln –s /usr/local/ssl/bin/openssl openssl
12.5.3. Генерирование сертификатов
Сертификат гарантирует безопасное подключение к Web-серверам и (или) удостоверяет личность владельца. Идентификация обеспечивается путем применения личного ключа, известного только пользователю данной системы. Когда пользователь посещает защищенный узел для передачи секретной информации (например, номеров кредитных карточек) по протоколу https, узел автоматически пошлет ему сертификат.
Итак, давайте приступим к генерированию сертификатов. Для этого сначала выполните команду:
openssl genrsa –des3 –out server.key 1024
Она создаст файл server.key. После этого вы должны подать запрос в службу верификации:
openssl req –new –key server. key –out server.csr
Здесь вам придется ответить на вопросы. Если вы ошибетесь — ничего страшного, все можно будет повторить заново. В том случае, если запрос сгенерирован правильно, вы должны получить такую надпись:
You now have to send this Certificate Signing Request (CSR) to a Certifying Authority (CA) for signing
Отвечая на вопросы, будьте очень внимательны — ваши ответы увидит весь мир.
По всем правилам, вы сейчас должны подписать сертификат у доверенного лица, но за неимением желания платить за это деньги, подпишите сами себя:
openssl genrsa –des3 –out ca.key 1024
openssl req –new –x509 –days 365 –key ca.key –out ca.crt
В данном случае у вас получится «самоподписанный» сертификат. Если вы хотите получить полноценный сертификат, то вам придется заплатить за подпись деньги. Для этого добро пожаловать на сайт www.thawte.com. В России представителем этого сайта является solutions.rbc.ru. Компания ThawTe занимается генерированием полноценных сертификатов. Получить сертификат от ThawTe можно, естественно, за деньги. На сайте же solutions.rbc.ru просто перепродают услуги компании ThawTe.
Возвращаясь к генерированию сертификата, скопируйте sign.sh из пакета mod_ssl в каталог с ключами и подпишите себя:
./sign.sh server.csr
Если на экране появится надпись:
Now you have two files: server.key and server.crt.
These now can be used as following
то это означает, что все собрано правильно. Затем скопируйте новые файлы server.key и server.crt на место старых. Выполните команду make в каталоге с .crt-файлом.
В заключении вы получите полностью работающий Apache, защищенный SSL. Для сбора полной информации о работе SSL введите:
openssl s_client –connect localhost:443 –state –debug
12.6. Пример файла httpd.conf