Ключевые слова:http, ftp, proftpd, virtual, apache, (найти похожие документы)
From: Denis Kolisnichenko <http://dkws.narod.ru>
Date: Wed, 24 Feb 2008 18:21:07 +0000 (UTC)
Subject: Конфигурирование виртуальных HTTP и FTP-серверов
Оригинал: http://dkws.narod.ru/linux/servers/vs.html
В статье пойдет речь о конфигурировании виртуальных HTTP- и
FTP-серверов. В качестве HTTP сервера будет рассмотрен Apache, а
создание виртуального FTP-сервера будет происходить с использованием
FTP-сервера ProFTP.
Для начала определимся что такое виртуальный сервер? Как и
подразумевает слово "виртуальный", наш сервер не будет существовать
физически, но пользователь будет считать, что он работает с реальным
сервером.
- Установка виртуального Web-сервера
- Идентификация по имени
- Идентификация по IP-адресу
- Подключение почтового интерфейса
- Установка виртуального FTP-сервера
- Директивы файла конфигурации FTP-сервера
Виртуальный 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-адресу.
Виртуальные сервера с идентификацией по имени
Идентификация по имени имеет существенное преимущество перед
идентификацией по IP-адресу: вы не ограничены количеством адресов,
имеющемся у вас в распоряжении. Вы можете использовать любое
количество виртуальных серверов и при этом вам не потребуются
дополнительные адреса. Такое возможно благодаря использованию
протокола HTTP/1.1. Данный протокол поддерживается всеми современными
броузерами.
Поддержка виртуальных хостов обеспечивается директивами VirtualHost и
NameVirtualHost. Если ваша система имеет только один IP-адрес, его
нужно указать в директиве VirtualHost. Внутри блока директивы
VirtualHost записывается директива ServerName. Эта директива задает
доменное имя для нашего виртуального сервера. Это обязательно нужно
сделать, чтобы избежать поиска службой DNS - мы же не хотим, чтобы при
неудачном поиске виртуальный сервер был заблокирован? Все директивы
VirtualHost используют один и тот же IP-адрес, заданный директивой
NameVirtualHost. В блоке VirtualHost записываются параметры
виртуального сервера, причем они записываются для каждого виртуального
сервера отдельно.
Пример 1.1. Создадим два виртуальных сервера - www и lib
ServerName den.dhsilabs.com
<NameVirtulaHost 192.168.1.1>
<VirtualHost 192.168.1.1>
ServerName www.dhsilabs.com
ServerAdmin webmaster@den.dhsilabs.com
DocumentRoot /var/httpd/www/html
ErrorLog /var/https/www/logs/error.log
TransferLog logs/access.log
</VirtualHost>
<VirtualHost 192.168.1.1>
ServerName lib.dhsilabs.com
ServerAdmin webmaster@den.dhsilabs.com
DocumentRoot /var/httpd/lib/html
ErrorLog /var/https/lib/logs/error.log
TransferLog logs/access.log
</VirtualHost>
Если ваша система имеет только один IP-адрес, доступ к основному серверу станет невозможным,
то есть вы не сможете использовать его напрямую. Можно основной сервер использовать в качестве
виртуального, что я и сделал в примере 1.1.: основной сервер www является виртуальным. При наличии двух
IP-адресов можно один присвоить основному серверу, а другой - виртуальным.
Apache позволяет использовать несколько доменных имен для доступа к одному серверу:
ServerAlias www.dhsilabs.com www2.dhsilabs.com
Запросы, посланные по IP-адресам, которые присвоены нашим виртуальным хостам, должны соответствовать
одному из указанных доменных имен. Чтобы зафиксировать запросы, не соотвествующие ни одному их этих имен,
нужно с помощью опции default:* создать виртуальный хост, который будет обслуживать такие запросы:
<VitrualHost _default_:*>
Обратите внимание на то, что адреса www.dhsilabs.com и lib.dhsilabs.com должны быть
прописаны в DNS
Виртуальные сервера с идентификацией по IP-адресу
В директиве VirtualHost в качестве адресов можно использовать доменные имена, но лучше указывать IP-адрес,
причем действительный, а не виртуальный. В этом случае вы не будете зависеть от DNS при резолвинге. Также
потребуется один IP-адрес для вашего основного сервера. Если распределить все адреса между виртуальными
серверами, то нельзя будет получить доступ к основному серверу.
Пример 1.2.
<VitrualHost 192.168.1.2>
ServerName www.dhsilabs.com
ServerAdmin webmaster@den.dhsilabs.com
DocumentRoot /var/httpd/www/html
ErrorLog /var/https/www/logs/error.log
</VirtualHost>
<VirtualHost lib.dhsilabs.com>
ServerName lib.dhsilabs.com
ServerAdmin webmaster@den.dhsilabs.com
DocumentRoot /var/httpd/lib/html
ErrorLog /var/https/lib/logs/error.log
</VirtualHost>
В приведенном примере сконфигурированы два виртуальных сервера и идентификацией по IP-адресу. Один из
них использует сам IP-адрес, а другой - доменное имя, соответствующее IP-адресу.
При конфигурировании виртульных серверов можно использовать опцию ExeсCGI, которая разрешает
выполнение CGI-скриптов на виртуальном сервере. Ниже приведен пример для почтового Web-интерфейса:
Пример 1.3. Подключение почтового Web-интерфейса
# Файл httpd.conf
<Directory /home/httpd/mail>
order deny,allow
deny from all
allow from localhost
allow from 192.168
allow from 123.123.123.123
Options ExecCGI
</Directory>
# Файл vhosts.conf
<VirtualHost 123.123.123.123>
ServerAdmin webmaster@den.dhsilabs.com
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
</VirtualHost>
# Error 403 - доступ извне, то есть почтовый интерфейс будет доступен только
# из локальной сети
Виртуальный FTP-сервер
Рассмотрим конфигурирование виртуального FTP-сервера на примере ProFTP. Демон proftpd позволяет обслуживать
сразу несколько FTP-узлов. Виртуальные FTP-узлы нужны когда мы, например, хотим организовать несколько FTP-узлов -
один для одной рабочей группы, другой - для второй, в третий может быть анонимным и т.д.
Настройка виртуального FTP-узла очень похожа на настройку виртуального Web-сервера -
даже используется та же директива VirtualHost. Linux может поддерживать несколько Ip-адресов, благодаря чему
мы можем создать виртуальные узлы. Дополнительные IP-адреса, которыми вы располагаете можно использоваться
виртуальными узлами. При конфигурировании виртуальных FTP-узлов каждому виртуальному узлу нужно присвоить
отдельный IP-адрес.
Для конфигурирования виртуального FTP в файл proftpd.conf нужно добавить директиву VirtualHost, содержащую
IP-адрес.
<VirtualHost 192.168.1.5>
ServerName "Virtual FTP Server"
</VirtualHost>
В блок VirtualHost можно другие вставить директивы, например, директиву Anonymous, которая создаст
гостевой узел. Можно также задать каталог или порт.
Пример 2.1.
<VirtualHost ftp.library.com>
ServerName "Online library"
MaxClients 15
MaxLoginAttempts 1
DeferWelcome on
<Limit LOGIN>
Allow from 192.168.1
Deny from all
</Limit>
<Limit WRITE>
AllowUser libadmin
DenyAll
</Limit>
<Anonymous /var/ftp/library/books>
User library
Group library
AnonRequirePassword on
<Anonymous /var/ftp/library>
User ftp
Group ftp
UserAlias anonymous ftp
</Anonymous>
</VirtualHost>
В примере 2.1 приведена конфигурация виртуального сервера ftp.library.com. В директиве VirtualHost используется
доменное имя, которое должно быть прописано в сервере DNS. IP-адрес должен указывать на узел сети, на котором
запущен демон proftpd. В конфигурации 2.1 также конфигурируются две анонимных учетных записи - library и ftp. Причем
учетная запись library требует ввода пароля при регистрации. Пароль должен совпадать с паролем того пользователя,
который запустил демон. Доступ к виртуальному серверу разрешен только для нашей подсети (192.168.1.0). Записывать
данные на сервер может только пользователь libadmin.
Директивы конфигурации сервера ProFTP
AccessGrantMsg message
Ответное сообщение, которое будет отправлено пользователю в случае
его регистрации или получения анонимного доступа. Символы %u будут заменены
на имя пользователя, которое он ввел при регистрации.
Allow from all | host | network [,host | network[, ...]]
Используется внутри блока Limit. Ограничивает доступ к серверу (а именно
разрешает доступ). По умолчанию allow from all
AllowAll
Разрашает доступ к блокам Directory, Anonymous, Limit
AllowForeignAddress on | off
Разрешает клиенту указывать при соединении соединения адрес, который
не соответствует ему. По умолчанию off. Может использоваться в блоках VirtualHost,
Anonymous, <Global>
AllowGroup group_list
Разрешает доступ определенным группам. Используется в блоке Limit
AllowUser user_list
Разрешает доступ определенным группам. Используется в блоке Limit
AnonRequirePassword on | off
Требует пароль при анонимной регистрации. Пароль должен совпадать с
паролем того пользователя, который запустил демон. По умолчанию опция выключена.
<Anonymous directory>
Создает анонимную учетную запись, directory - корневой каталог анонимного
сервера.
AuthGroupFile path
Позволяет указать путь к альтернативному файлу group. По умолчанию
используется файл /etc/group
AuthUserFile path
Указывает альтернативный файл passwd
Bind address
Разрешает привязку дополнительного IP-адреса к основному или виртуальному
хосту.
DefaultRoot directory
Задает корневой каталог по умолчанию
Deny from all | host | network
Запрещает доступ к серверу. Блок Limit
DenyAll
Запрещает анонимным пользователям доступ к объектам, указанным в блоке Limit
DenyUser user_list
Запрещает доступ определенным пользователям
<Directory> path
Используется в VirtualHost, Anonymous для того, чтобы определить особенные
параметры доступа к каталогу и его подкаталогам
DisplayFirstChdir filename
Текстовый файл filename будет выводиться, когда пользователь впервые
за время сеанса войдет в данный каталог. Используется в VirtualHost, Directory,
Anonymous
DisplayLogin filename
Этот файл будет отображен, когда пользователь зарегистрируется
<Global>
Используется для задания параметров, которые будут использоваться как
основным, так и всеми виртуальными серверами
<Limit command>
Ограничение на выполнение данной FTP-команды, например LOGIN, WRITE
MaxClients number | none | message
Ограничение на количество клиентов. Message будет отображено, если
пользователю будет отказано в доступе. Блоки Anonymous, Global
MaxLoginAttempts
Максимальное количество попыток зарегистрироваться. По умолчанию 3.
Блоки VirtualHost, Global
Order allow, deny | deny, allow
Порядок выполнения директив Allow и Deny в блоке Limit
PersistentPassword on | off
При значении on будут использованы системные файлы /etc/passwd и /etc/group,
несмотря на то, что командой chroot корневой каталог был изменен.
RequireValidShell on | off
Разрешает или запрещает регистрацию при использовании оболочек (shells),
которые не указаны в файле /etc/shells
ServerAdmin email
Определяет email администратора сервера.
ServerType
Определяет режим работы сервера standalone (по умолчанию) или inetd.
В первом случае сервер будет запускаться автоматически из стартовых сценариев
системы, во втором - его будет запускать сервер inetd при попытке соединения.
TimeoutIdle seconds
Время в секундах, в течение которого пользователь имеет право не проявить
активности. По умолчанию 60 (1 минута).
User username
Имя пользователя, присвоенное демону ProFTP
UserAlias Alias User
Создает псевдоним (alias) для пользователя (user)
<VirtualHost address>
Создает виртуальный сервер