|
||||||||||||||||||||||||||||||||||
|
12Сервер Apache Эта глава посвящена популярному WWW-серверу Apache. Сервер Apache разработан и поддерживается организацией Apache Project. Первоначально, сервер Apache был разновидностью сервера Web-сервера NCSA, разработанного в Национальном центре разработок суперкомпьютеров Иллинойского университета. Возникновение Apache было связано с тем, что в 1994 году ушел из проекта главный разработчик NCSA, оставив многих последователей самостоятельно разбираться в своем сервере. Со временем начали появляться исправления и дополнения к серверу NCSA — так называемые patches (патчи). А в апреле 1995 года вышла первая версия сервера Apache, основанного на версии 1.3 сервера NCSA. Первая версия Apache просто вобрала в себя все известные исправления сервера NCSA. Да и само название Apache именно от этого — «A PatCHy». Позже Apache стал самостоятельной разработкой. Сейчас сервер Apache поддерживается группой программистов-добровольцев Apache Group. Сервер Apache разрабатывался для ОС Linux и Unix, но со временем были выпущены его версии и для ОС Windows, и OS/2. Хочу также отметить, что кроме Apache, для ОС Linux существуют другие Web-серверы: Red Hat Secure Server, Apache-SSL, Netscape Enterprise Server и др. 12.1. Установка ApacheДля установки сервера Apache необходимо установить пакеты apache и apache-docs. В первом из них находится сам сервер, а во втором — документация. Желательно устанавливать самую новую версию. В последних версиях вам нужно установить еще и пакет apache-common, содержащий необходимые файлы для запуска сервера. Проще всего установку Apache можно произвести, введя следующую команду: rpm –ih apache* После установки сервер конфигурируется для запуска в режиме standalone, то есть он будет постоянно находиться в памяти. Я не рекомендую изменять этот режим. Для запуска и останова сервера Apache вы можете воспользоваться командами: /etc/re.d/init.d/httpd start /etc/re.d/init.d/httpd stop После успешной установки сервера отредактируйте файл /etc/httpd /conf/httpd.conf. В нем исправьте всего одну директиву — ServerName. При этом, на данном этапе (пока новое имя сервера Apache не зарегистрировано на вашем сервере DNS), вместо того имени, которое будет использоваться в дальнейшем (например, www.host.domain), установите обыкновенное имя вашего сервера, например, server.firma.ru. Данное имя должно быть зарегистрировано на DNS-сервере вашей сети. После этого запустите сервер. Затем откройте любой браузер и попробуйте обратиться к серверу (см. рис. 12.1): netscape http://localhost Теперь попробуйте обратиться к этому серверу с другого компьютера вашей сети: netscape http://server.firma.ru Рис. 12.1. Первое обращение к серверу Apache Если вы увидите приветствие сервера в первом и во втором случаях, значит, ваш сервер Apache нормально работает и можно приступать к его дальнейшему конфигурированию. Если в первом случае у вас произошла ошибка, значит, искать ее нужно на локальном уровне. При этом, если сеть нормально работает, то, скорее всего, вы просто забыли запустить сервер. Появление ошибки во втором случае может быть связано с неправильной установкой директивы ServerName или же используемое вами имя не прописано в системе DNS. 12.2. Файлы конфигураци исервераСервер Apache имеет три конфигурационных файла: httpd.conf, srm.conf, access.conf. Обычно эти файлы находятся в каталоге /etc/httpd/conf. Вся настройка сервера заключается в редактировании этих трех файлов. Рассмотрим, какие функции выполняют эти файлы. Файл httpd.conf — это основной файл конфигурации сервера. В нем содержится техническое описание работы сервера. В файле srm.conf задаются параметры документов, которые размещены на сервере. Файл access.conf содержит параметры доступа к серверу. Начиная с версии 1.3, рекомендуется все директивы, которые раньше находились в файлах srm.conf и access.conf, помещать в файл httpd.conf. Я использую сервер Apache версии 1.3.14-2, который входит в состав дистрибутива Linux Mandrake 7.2. В этой версии существует еще несколько конфигурационных файлов: apache-mime.types, vhosts/vhosts.conf, vhosts/Virtual Home Pages.conf, vhosts/ DynamicVHosts.conf. В файле apache-mime.types содержатся типы MIME, поддерживаемые сервером Apache. Файлы vhosts.conf, VirtualHomePages.conf, DynamicVHosts.conf относятся к конфигурированию виртуальных Web-серверов, о которых речь пойдет немного позже.
12.2.1. Файл httpd.confКак уже отмечалось ранее, этот файл содержит практически все директивы, необходимые для работы сервера. Директивы конфигурационного файла сервера Apache можно условно разделить на такие группы: 1. Общие. К общим директивам относятся глобальные директивы, влияющие на работу всего Web-сервера. Это директивы ServerName, ServerType, Port, User и Group, ServerAdmin, ServerRoot, PidFile, DocumentRoot, UserDir. 2. Директивы протоколирования: ErrorLog, TransferLog, HostnameLookups. 3. Директивы ограничения доступа: AllowOverride, Options, Limit. 4. Директивы управления производительностью: StartServers, MaxSpareServers, MinSpareServers, а также директива CacheNegotiatedDocs. 5. Директивы обеспечения постоянного соединения с клиентом: Timeout, KeepAlive, KeepAliveTimeout. 6. Директивы настройки отображения каталога. Оформить отображение каталогов можно с помощью директив настройки отображения каталогов: DirectoryIndex, FancyIndexing и AddIconByType. 7. Директивы обработки ошибок. Директивой обработки ошибок HTTP-сервера является директива ErrorDocument. С ее помощью можно установить реакцию на любую ошибку сервера, например, на ошибку 404 (документ не найден). 8. Директивы перенаправления: Redirect, Alias и ScriptAlias. 9. Директивы для работы с многоязычными документами: AddLanguage и LanguagePriority. 10. Директивы обработки MIME-типов. Настроить свой сервер для обработки различных MIME-типов можно с помощью директив DefaultType, AddEncoding, AddType, AddHandler и Action. 11. Директивы создания виртуальных узлов: VirtualHost, Listen, BindAddress. Все эти директивы редактировать вам вряд ли придется — нужно будет задать только значения директив ServerName и ServerAdmin. По умолчанию остальные директивы содержат вполне разумные значения. Далее приведено описание директив, используемых в файле httpd.conf. ServerName — директива, которая определяет имя сервера Apache. Причем, здесь должно быть задано официальное имя сервера в таком виде, в котором оно должно появляться в адресной строке браузера. Данное имя должно быть зарегистрировано на сервере DNS вашей сети. ServerType — директива, которая определяет тип сервера. По умолчанию используется значение standalone. Если вы хотите достичь максимальной производительности вашего Web-сервера, не изменяйте эту опцию. Сервер Apache для каждого соединения запускает отдельную копию, которая будет обрабатывать запросы клиента. Управлять запущенными копиями позволяют директивы StartServers, MinSpareServers, MaxSpareServers. StartServers, MaxSpareServers, MinSpareServers. Как уже отмечалось выше, для каждого нового соединения создается новая копия процесса сервера. Директива StartServers задает количество копий, которые будут созданы при запуске исходной копии сервера. При этом исходная копия сервера получает запросы и передает их свободным копиям. Это позволяет равномерно распределить нагрузку между отдельными процессами и повысить производительность сервера, однако на практике все не так хорошо, как хотелось бы. Существенного прироста производительности можно добиться только в случае большой загрузки сервера. По умолчанию запускается пять копий сервера. Если число поступающих запросов превышает количество запущенных копий сервера, запускаются дополнительные процессы-серверы. Эти процессы не завершаются после обработки своего запроса, а продолжают находиться в памяти. Директива MaxSpareServers позволяет указать максимальное число таких процессов. Если это количество превышено, то лишние процессы завершаются. Если количество «серверов на подхвате» меньше, чем задано директивой MinSpareServers, запускаются дополнительные копии. Для работы этих директив необходимо, чтобы сервер был запущен в автономном режиме. Port — директива, задающая номер порта, который будет использоваться для установки соединения. По умолчанию используется порт 80. Если вы хотите запустить сервер Apache с использованием этого или любого другого порта, номер которого меньше 1024, вы должны обладать правами суперпользователя. Но даже если у вас нет таких прав, вы можете запустить сервер для работы с портом, номер которого превышает значение 1024. Обычно используется номер 8080 или 8000. HostnameLookups on|off. Сервер apache ведет журнал доступа других компьютеров. Если вы включите данную опцию (on), то в журнал будет записано доменное имя компьютера-клиента. Если эта опция выключена (off), в журнал будет записан IP-адрес клиента. Включение данной опции замедляет работу сервера, так как требуется дополнительное время на ожидание ответа от сервера DNS. User и Group. Директивы User и Group определяют идентификаторы пользователя и группы, от имени которых будет работать сервер. Данные идентификаторы присваиваются серверу, если он запущен в автономном режиме. Можно использовать как имена пользователей, так и их числовые эквиваленты — UID. По умолчанию используется имя пользователя nobody. Из соображений безопасности не рекомендуется изменять это значение и присваивать имя реального пользователя. В этом случае Web-сервер получит доступ только к тем файлам, которые разрешены для чтения всем пользователям. Нужно заметить, что указанный пользователь и группа должны существовать в вашей системе. Ни в коем случае не запускайте сервер от имени пользователя root! ServerAdmin — директива, которая задает электронный адрес Web-мастера вашего Web-узла. Если возникнут какие-то проблемы, связанные с работой сервера, то по этому адресу будет отправлено соответствующее сообщение. Обычно используется значение webmaster@Your_Host.com. Пользователь webmaster, как правило, не существует реально в системе. Для определения имени (псевдонима) webmaster используется файл псевдонимов электронной почты /etc/aliases. Данный файл используется для определения псевдонимов пользователей (см. приложение А). Формат файла /etc/aliases следующий: псевдоним: имя После модификации этого файла нужно ввести команду newaliases. Данную команду нужно вводить, зарегистрировавшись в системе как суперпользователь. ServerRoot — в этой директиве указывается местонахождение файлов конфигурации сервера Apache. По умолчанию для этих целей используется каталог /etc/httpd. BindAddress. Данная директива используется для поддержки виртуальных хостов и применяется для сообщения серверу, какой IP-адрес следует прослушивать. Значением данной директивы может быть «*» (любой адрес), IP-адрес или полное имя домена. ErrorLog и TransferLog — эти директивы определяют расположение журналов сервера Apache. Обычно для этих целей используется каталог /etc/httpd /logs, который является ссылкой на каталог /var/log/httpd или на любой другой. В журнале errorlog протоколируются диагностические сообщения, а также сообщения об ошибках, которые порождают CGI-сценарии. В журнале transferlog протоколируются запросы клиентов. Если включена директива HostNameLookups, то вместо IP-адреса клиентов будут регистрироваться имена компьютеров. PidFile — с помощью этой директивы указывается имя файла, в котором исходный процесс сервера будет регистрироваться. Этот файл содержит свой идентификатор процесса (PID). Данную информацию можно использовать для останова или перезапуска сервера при написании собственных сценариев. Данный файл будет создан, только если сервер Apache запущен в автономном режиме. CacheNegotiatedDocs — данная директива позволяет прокси-серверу, например SQUID, не кэшировать документы, которые не генерируются автоматически, то есть в процессе выполнения различных сценариев. Согласно протоколу НТТР/1.0, сервер Apache с каждым пакетом посылает заголовок Pragma: no-cache прокси-серверу, что позволяет отключить кэширование документов (в протоколе НТТР/1.1 вместо Pragma используется Cache-Control). Если вы включите данную директиву, то вы разрешите прокси-серверу кэшировать документы. К сожалению, далеко не все прокси-серверы отключают кэширование после получения данного заголовка. При написании своего CGI-сценария, вам, скорее всего, придется самому выводить заголовок Pragma (или Cache-Control) и мета-тэги, которые указывают на дату последнего обновления документа. Timeout — задает промежуток времени в секундах, в течение которого сервер продолжает попытки возобновления приостановленной передачи данных. Значение директивы Timeout распространяется не только на передачу, но и на прием данных. Если вам нужно получать большие файлы, рекомендую увеличить данное значение. KeepAlive — разрешает постоянные соединения, то есть такие соединения, в которых производится более одного запроса за один раз. KeepAliveTimeOut — данная директива определяет тайм-аут для постоянного соединения. MaxClients. Иногда поступающих запросов настолько много, что компьютеру не хватает ресурсов для загрузки новых копий сервера в память и их выполнения. Директива MaxClients (значение по умолчанию — 150) определяет максимальное число копий сервера, которые могут выполняться одновременно. MaxRequestsPerChild. После обработки определенного количества запросов, указанного в директиве MaxRequestsPerChild, копия сервера завершается, а вместо нее запускается новая. Listen — позволяет вам связывать Apache с определенным IP-адресом и (или) дополнительными портами. DocumentRoot — директива, определяющая местонахождение корневого каталога документов вашего сервера. UserDir — эта директива задает названия подкаталога в домашнем каталоге пользователя, из которого берутся документы. В этом случае, вы активизируете возможность использования пользовательских каталогов. Если вы не хотите включать эту возможность, укажите UserDir DISABLED. Более подробно эта директива будет рассмотрена позже. DirectoryIndex — позволяет задать название документа, который будет возвращен по запросу, который не содержит имя документа. С помощью данной директивы можно задать несколько имен файлов. Значениями по умолчанию являются index.html index.php index.htm index.shtml index.cgi Default.htmdefault.htm index.php3. Например, если вы введете в строке адреса браузера http://localhost, то будет возвращен один из указанных в директиве DirectoryIndex документов. FancyIndexing. При получении запроса, не содержащего имя документа, сервер передаст один из файлов, указанных в директиве DirectoryIndex. Если такой файл не существует, клиенту будет возвращено оглавление каталога. При включении директивы FancyIndexing, в оглавлении каталога будут использованы значки и описания файлов. Если директива FancyIndexing выключена, оглавление будет представлено в более простом виде. AddIconByType — сопоставляет значок с типом файла. Значок будет использоваться при выводе каталога, если включена директива FancyIndexing. Директива AddIconByType имеет следующий формат: AddIconByType (TEXT, URL) mime-type Параметр TEXT определяет текстовое описание типа, которое увидят пользователи, использующие текстовый браузер или пользователи, у которых отключено отображение рисунков. Параметр URL определяет адрес значка, а параметр mime-type — это тип файла, с которым нужно сопоставить значок. Полный перечень MIME-типов приведен в файле apache-mime. types. В качестве имени файла можно задать не только MIME-тип, но и символы, которыми заканчивается имя файла (см. листинг 12.1), но для этого нужно использовать директиву AddIcon вместо AddIconByType. Листинг 12.1. Фрагмент файлаhttpd.confAddIconByType (VID,/icons/movie.gif) video/* AddIcon /icons/binary.gif .bin .exe Первая директива в листинге сопоставляет типу video значок /icons/movie.gif. Вторая директива сопоставляет бинарным файлам *.bin и *.ехе значок /icons/binary.gif. Значок по умолчанию задается директивой DefaultIcon. DefaultType. Если запрашиваемый клиентом тип не соответствует ни одному из MIME-типов, используется MIME-тип, указанный в директиве DefaultType. AddEncoding. Для сокращения времени передачи файла клиентам используется сжатие данных. Браузеры имеют встроенные программы для распаковки, запускаемые при получении архивов определенных MIME-типов. Именно эти MIME-типы и указываются в директиве AddEncoding. AddLanguage. В большинстве браузеров можно задать предпочитаемый язык. Благодаря этому вы можете предоставлять документы на разных языках. Директива AddLanguage сопоставляет расширение файла аббревиатуре языка. Для русского языка используется аббревиатура ru , для английского — еп. При этом в корневом каталоге вашего сервера могут находиться несколько индексных файлов на разных языках. Например, для русского языка нужно использовать имя файла index.html.ru, а для английского — index.html.en. LanguagePriority. Если на вашем сервере размещены документы на разных языках, то с помощью директивы LanguagePriority можно указать приоритеты различных языков. Например, вы установили директиву LanguagePriority так: LanguagePriority en ru Клиент вводит в строке адреса своего браузера адрес http://www.server.com//. Если в свойствах браузера имеется возможность задать предпочитаемый язык, то возвращен будет файл на нужном языке, если такой существует. Если браузер клиента не поддерживает такую возможность, будет возвращен файл на языке, имеющим наиболее высокий приоритет. В рассмотренном случае (см. пример) это английский язык. Если файл на нужном языке, например, на немецком, не существует, то будет возвращен файл на английском языке. Для того, чтобы сервер поддерживал нужный вам язык, предварительно установите правильное значение директивы AddLanguage. Redirect. Используйте директиву Redirect, когда нужно перенести документы в другой каталог или на другой сервер. Например, вам нужно перенести данные из каталога /users/den в каталог /den. Если при этом старый URL-адрес был http://www.host.com/users/den, то новый станет http://www.host.com/den/. Используйте для этого следующую директиву: Redirect /users/den /den Можно также перенаправить запрос на другой сервер: Redirect /users/den/ www.den.domain.com При этом допускается использование как нового, так и старого URL-адреса. Alias — с помощью директивы Alias можно предоставить доступ не только к файлам, находящимся в каталоге, указанном директивой DocumentRoot и его подкаталогах, но и в других каталогах. По умолчанию определен только псевдоним для каталога /icons. ScriptAlias — аналогична директиве Alias, но позволяет задать месторасположение каталога для CGI-сценариев. AddType — с помощью этой директивы можно добавить новый MIME-тип, который не указан в файле apache-mime, types. AddHandler и Action. Директива AddHandler позволяет сопоставить определенному MIME-типу какой-нибудь обработчик. А с помощью директивы Action можно определить какое-нибудь действие для обработчика. Например, вы можете запустить какую-нибудь программу для обработки файла данного типа. Использование этих директив, я думаю, лучше всего продемонстрировать на примере (см. листинг 12.2). Листинг 12.2. Применение директив Add Handler и ActionAddHandler text/dhtml dhtml Action text/dhtml /cgi-bin/dhtml-parse ErrorDocument — директива, сопоставляющая коды ошибок сервера URL-адресам на этом же сервере. Теперь рассмотрим директивы управления доступом к отдельным каталогам. Данные директивы очень похожи на блочные директивы сервера ProFTPD, которые обсуждались в предыдущей главе. Directory — обычно определяет свойства каталога (см. листинг 12.3). Листинг 12.3. Директива Directory<Directory /> Options Indexes Includes FollowSymLinks AllowOverride None </Directory> Свойства каталога можно указывать в директиве Directory или в файле .htaccess, который находится в том каталоге, для которого необходимо установить нужные параметры. В блоке Directory могут находиться директивы управления доступом. К ним относятся директивы AllowOverride, Options, Limit. Рассмотрим по порядку все эти директивы. Директива AllowOverride может принимать значения, указанные в табл. 12.1. Значения директивы AllowOverride Таблица 12.1
С помощью директивы Option sможно определить функции сервера, которые будут доступны для использования в определяемом каталоге. Данную директиву можно использовать как в файле httpd.conf, так и в файлах .htaccess. Допустимые опции для директивы Options представлены в табл. 12.2. Limit метод. Директива Limit ограничивает доступ к файлам в определенном каталоге. Параметр метод определяет метод передачи, например, GET или POST. Директиву Limit можно использовать внутри блоков Directory, Location или в файле .htacccess. Допустимые опции директивы Options Таблица 12.2
В блоке Limit можно использовать такие директивы: allow (разрешить), deny (запретить), order (порядок), require (требуется). Директивы allow и deny аналогичны директивам allow и deny файла конфигурации сервера ProFTPD. После директивы allow следует слово from, после которого можно указать IP-адрес, адрес сети, домен или просто имя компьютера. Слово all обозначает все компьютеры. Например, вам требуется запретить доступ всем компьютерам, кроме компьютеров, которые входят в домен ru (см. листинг 12.4). Листинг 12.4. Директивы allow, denyorder deny, allow deny from all allow from ru Следующий пример показывает, как разрешить доступ компьютерам только из вашей сети (см. листинг 12.5). Пусть, при этом, ваша сеть имеет адрес 192.168.1.0 Листинг 12.5. Разрешения доступа подсети 192.168.1.0order deny, allow deny from all allow from 192.168.1. Директива order определяет порядок выполнения директив allow и deny. Кроме значений allow, deny и deny, allow, директива order может содержать значение mutual-failure. В этом случае доступ будет отказан всем компьютерам, которые явно не указаны в списке allow. Директиву require можно использовать для защиты каталога паролем. После названия директивы должен следовать список элементов: имена пользователей, групп, которые заданы в директивах AuthUserFile и AuthGroupFile. Можно использовать параметр valid-user, который укажет серверу предоставить доступ любому пользователю, имя которого имеется в директиве AuthUserFile, если он введет правильный пароль. Пример использования директив Limit, require, AuthUserFile приведен в листинге 12.6. Листинг 12.6. Использование директивы require<Directory *> AuthUserFile /var/secure/.htpasswd AuthName Security AuthType Basic <Limit GET> order deny,allow deny form all allow from mydomain.ru require valid-user </Limit> </Directory> В листинге 12.6 для аутентификации используется файл паролей .htpasswd, который можно создать с помощью программы htpasswd. Директива Limit разрешает доступ к любому каталогу сервера только пользователям домена mydomain.ru. Кроме параметра valid-user допускается использование параметра users или grpoups. Данные параметры разрешают доступ только определенным пользователям или группам пользователей. Пример использования параметра users приведен в листинге 12.7. Листинг 12.7. Применения параметра users<Directory /users> AuthType Basic AuthUserFile /var/users/ .htpasswd AuthName UsersDir <Limit GET POST> require users denis igor evg </Limit> </Directory> Location — с помощью этой директивы можно задать определенный URL-адрес, который предназначен для обозначения каталогов, файлов или групп файлов. Обозначить группу файлов можно с помощью шаблонов, например, шаблон *.html определяет все файлы, имена которых заканчиваются на .html. В URL-адрес не включается протокол и имя сервера. Пример описания блока Location представлен в листинге 12.8. Листинг 12.8. Блок Location<Location URL> директивы управления доступом </Location> 12.2.2. Конфигурирование Apache с помощью netconfПрактически все параметры Web-сервера Apache можно установить, используя конфигуратор netconf (или linuxconf). Для этого запустите netconf и перейдите на вкладку Server Tasks, а затем нажмите на кнопку «Apache Webserver» (см. рис. 12.2). Рис. 12.2. Конфигурирование Apache с помощью netconf С помощью netconf вы легко можете установить основные параметры Apache (см. рис. 12.3), определить виртуальные хосты, установить параметры подкаталогов, определить спецификацию каталогов и модулей, а также установить параметры модуля mod_ssl (см. рис. 12.4), конфигурирование которого рассмотрено ниже в этой главе. Рис. 12.3. Основные параметры Apache Рис. 12.4. Конфигурирование модуля mod_ssl 12.3. Каталоги пользователейДиректива 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 <NameVirtualHost 192.168.1.1> <VirtualHost 192.168.1.1> ServerName www.dhsilabs.com ServerAdmin webmaster@den.dhsilabs.com DocumentRoot /var/httpd/www/html Error Log /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-адрес, доступ к основному серверу станет невозможным, то есть вы не сможете использовать его напрямую. Можно основной сервер использовать в качестве виртуального, что я и сделал в листинге 12.9: основной сервер www является виртуальным. При наличии двух IP-адресов можно один присвоить основному серверу, а другой — виртуальному. Сервер Apache позволяет использовать несколько доменных имен для доступа к одному серверу, например: ServerAlias www.dhsilabs.com www2.dhsilabs.com При этом запросы, посланные по IP-адресам, которые присвоены вашим виртуальным хостам, должны соответствовать одному из указанных доменных имен. Чтобы зафиксировать запросы, не соответствующие ни одному их этих имен, нужно с помощью опции default:* создать виртуальный хост, который будет обслуживать такие запросы: <VirtualHost _default_:*> Обратите внимание на то, что в рассмотренном примере адреса www.dhsilabs.com и lib.dhsilabs.com должны быть прописаны в DNS. 12.4.2. Виртуальные серверы с идентификацией по IP-адресуВ директиве VirtualHost в качестве адресов можно использовать доменные имена, но лучше указывать IP-адрес, причем действительный, а не виртуальный. В этом случае вы не будете зависеть от DNS при разрешении имени. Также потребуется один IP-адрес для вашего основного сервера. Если же распределить все адреса между виртуальными серверами, то нельзя будет получить доступ к основному серверу. Листинг 12.10. Идентификация по IP-адресу<VirtualHost 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> В приведенном примере (см. листинг 12.10) сконфигурированы два виртуальных сервера с идентификацией по IP-адресу. Один из них использует сам IP-адрес, а другой — доменное имя, соответствующее IP-адресу. При конфигурировании виртуальных серверов можно использовать опцию ExecCGI, которая разрешает выполнение CGI-скриптов на виртуальном сервере. Ниже приведен пример для почтового Web-интерфейса (листинг 12.11). Листинг 12.11. Подключение почтового 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 — доступ извне, то есть почтовый интерфейс будет доступен только # из локальной сети 12.5. SSL и Apache12.5.1. Установка SSLSSL (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
Теперь непосредственно приступите к созданию виртуального сервера, работающего по протоколу https, для чего продолжите редактирование файла /etc/httpd/conf/httpd.conf. Пример того, что необходимо при этом ввести, приведен в листинге 12.12: Листинг 12.12. Виртуальный https-cepвep<VirtualHost x.x.x.x:443> # Эти строки нужны для поддержки 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 webmaster@den.dhsilabs.com DocumentRoot /var/httpd/www/html ErrorLog /var/https/www/logs/error.log </VirtualHost> После таких строк вы можете конфигурировать свой виртуальный хост как обычно. Теперь нужно перезапустить сервер 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В этом разделе приведен пример стандартной конфигурации сервера Apache (см. листинг 12.13). К каждому блоку листинга сопутствуют комментарии на русском языке, которые помогут вам разобраться с различными опциями сервера. Листинг 12.13. Пример файла httpd.conf## ## httpd.conf — файл конфигурации сервера HTTP Apache ## #---------------------------------------------------------------- # Установите имя сервера ServerName www.dhsilabs.com ResourceConfig /dev/null AccessConfig /dev/null # Поддержка динамических разделяемых объектов # (Dynamic Shared Object – DSO) # Для более подробной информации о DSO прочтите файл README.DSO, # входящий в дистрибутив Apache. # Модуль расширяет возможности сервера Apache, # добавляет в его состав новые функции. # Подключить модуль можно так: # LoadModule foo_module libexec/mod_foo.so # Вы можете найти документацию по модулями в файле # "/var/www/manual/mod" #LoadModule mmap_static_module modules/mod_mmap_static.so LoadModule env_module modules/mod_env.so ### The first module activates buffered logs. # Первый модуль обеспечивает протоколирование. # Он запишет информацию в протокол, когда буфер объемом 4К # переполнится. Используется файл журнала access_log #LoadModule config_buffered_log_module modules/mod_log_config_buffered.so LoadModule config_log_module modules/mod_log_config.so LoadModule agent_log_module modules/mod_log_agent.so LoadModule referer_log_module modules/mod_log_referer.so #LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule mime_module modules/mod_mime.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule status_module modules/mod_status.so LoadModule info_module modules/mod_infо.so # Вы должны выбрать директиву mod_include или mod_include_xssi, # но не обе одновременно! Директива mod_include более безопасна, # но xxsi содержит больше функций. LoadModule includes_module modules/mod_include.so #LoadModule includes_module modules/mod_include_xssi.so LoadModule autoindex_module modules/mod_autoindex.so LoadModule dir_module modules/mod_dir.so LoadModule cgi_module modules/mod_cgi.so LoadModule asis_module modules/mod_asis.so LoadModule imap_module modules/mod_imap.so LoadModule action_module modules/mod_actions.so #LoadModule speling_module modules/mod_speling.so LoadModule userdir_module modules/mod_userdir.so LoadModule proxy_module modules/libproxy.so LoadModule alias_module modules/modalias.so # Модуль mod_jserv должен быть объявлен до mod_rewrite, <IfDefine HAVE_JSERV> LoadModule jserv_module modules/mod_jserv.so </IfDefine> LoadModule rewrite_module modules/mod_rewrite.so LoadModule access_module modules/mod_access.so LoadModule auth_module modules/mod_auth.so LoadModule anon_auth_module modules/mod_auth_anon.so #LoadModule dbm_auth_module modules/mod_auth_dbm.so #LoadModule db_auth_raodule modules/mod_auth_db.so LoadModule digest_module modules/mod_digest.so #LoadModule cern_meta_module modules/mod_cern_meta. so LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so LoadModule usertrack_module modules/mod_usertrack.so #LoadModule example_module modules/mod_example.so #LoadModule unique_id_module modules/mod_unique_id.so LoadModule setenvif_module modules/mod_setenvif.so # В полном списке модулей должны быть перечислены все доступные # модули (статических или общедоступных), чтобы достичь # правильного порядка выполнения. ClearModuleList #AddModule mod_mmap_static.с # AddModule mod_php.c # AddModule mod_php3.c #AddModule mod_php4.с #AddModule mod_perl.c # LoadModule php_module modules/mod_php.so # LoadModule php3_module modules/mod_php4.so #LoadModule php4_module modules/mod_php4.so AddModule mod_env.c AddModule mod_log_config.с #AddModule mod_log_config_buffered.с AddModule mod_log_agent.с AddModule mod_log_referer.с #AddModule mod_mime_magic.с AddModule mod_mime.с AddModule mod_negotiation.с AddModule mod_status.с AddModule mod_info.c AddModule modinclude.c #AddModule mod_include_xssi.с AddModule mod_autoindex.с AddModule mod_dir.c AddModule mod_cgi.с AddModule mod_asis.c AddModule mod_imap.c AddModule mod_actions.с #AddModule mod_speling.с AddModule mod_userdir.с AddModule mod_proxy.c AddModule mod_alias.c # Модуль mod_jserv должен быть объявлен до mod_rewrite. <IfDefine HAVE_JSERV> AddModule mod_jserv.c </IfDefine> AddModule mod_rewrite.с AddModule mod_access.с AddModule mod_auth.c AddModule mod_auth_anon.с #AddModule raod_auth_dbm.с #AddModule mod_auth_db.с AddModule mod_digest.c #AddModule mod_cern_meta.с AddModule mod_expires.с AddModule mod_headers.с AddModule mod_usertrack.с #AddModule mod_example.с #AddModule mod_unique_id.с AddModule mod_so.c AddModule mod_setenvif.c #-------------– Name Space and Server Settings ----------------- # Настройки пространства имен и сервера # В этом разделе вы определяете, какие имена будут видеть # пользователи вашего HTTP-сервера. Этот файл также определяет # настройки сервера, которые раньше содержались в отдельном файле # srm.conf. Теперь этот файл входит в состав httpd.conf. # Директива DocumentRoot определяет местонахождение # корневого каталога документов вашего сервера. DocumentRoot /var/www/html # Директива UserDir задает названия подкаталога в домашнем # каталоге пользователя, из которого берутся документы # в том случае, если вы активизируете возможность использования # пользовательских каталогов. UserDir public_html # Директива DirectoryIndex позволяет задать название документа, # который будет возвращен по запросу, который не содержит имя документа. DirectoryIndex index.html index.php index.htm index.shtml index.cgi Default.htm default.htm index.php3 # Директива FancyIndexing определяет оформление каталога – # стандартное или индексируемое. FancyIndexing on # Директивы AddIcon* указывают серверу, какие пиктограммы # использовать для показа различных типов файлов AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip AddIconByType (TXT,/icons/text.gif) text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/* AddIcon /icons/binary.gif .bin .exe AddIcon /icons/binhex.gif .hqx AddIcon /icons/tar.gif .tar AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv AddIcon /icons/compressed.gif . Z . z .tgz .gz .zip AddIcon /icons/a.gif .ps .ai .eps AddIcon /icons/layout.gif .html .shtml .htm .pdf AddIcon /icons/text.gif .txt AddIcon /icons/c.gif .c AddIcon /icons/p.gif .pi .py AddIcon /icons/f.gif .for AddIcon /icons/dvi.gif .dvi AddIcon /icons/uuencoded.gif .uu AddIcon /icons/script.gif .conf . sh .shar .csh .ksh .tcl AddIcon /icons/tex.gif .tex AddIcon /icons/bomb.gif core AddIcon /icons/back.gif .. AddIcon /icons/hand.right.gif README AddIcon /icons/folder.gif ^^DIRECTORY^^ AddIcon /icons/blank.gif ^^BLANKICON^^ # Директива DefaultIcon определяет пиктограмму по умолчанию. DefaultIcon /icons/unknown.gif # Директива AddDescription задает описание файла # Формат: AddDescription "описание" filename # Директива ReadmeName определяет имя файла README по умолчанию Формат: ReadmeName name ReadmeName README HeaderName HEADER # Директива IndexIgnore определяет набор файлов, которые # будут проигнорированы при индексировании # Формат: IndexIgnore name1 name2… IndexIgnore . ??* *~ *# HEADER* README* RCS # Директива AccessFileName определяет имя файла, содержащего # директивы управления доступом AccessFileName .htaccess # Директива TypesConfig задает местонахождение файла mime.types TypesConfig /etс/httpd/conf/apache-mime.types # С помощью директивы DefaultType можно указать MIME-тип по умолчанию , # для документов, тип которых сервер определить не может DefaultType text/plain # Директива AddEncoding разрешает вашему браузеру распаковывать # информацию "на лету" AddEncoding x-compress Z AddEncoding x-gzip gz # AddLanguage разрешает определять язык документа AddLanguage en .en AddLanguage fr .fr AddLanguage de .de AddLanguage da . da AddLanguage el .el AddLanguage it .it # Директива LanguagePriority определяет приоритет языков LanguagePriority en fr de # Директива Redirect позволяет перенаправить клиента на другой URL # Вы можете перенаправить клиента на другой url или же url, # который находится в вашем пространстве имен, то есть на любой # документ, который находится в одном из подкаталогов каталога # DocumentRoot. Вы не можете, например, перенаправить клиента # к каталогу /etc, потому что он не находится в вашем # пространстве имен. # URL – это идентификатор ресурса, поэтому вы должны его # указывать в виде протокол://адрес.домен, например, # http://www.linux.ru. Если вы укажите просто каталог, например, # /images, этот каталог должен быть подкаталогом каталога # DocumentRoot, а не корневого каталога вашей основной файловой # системы. Формат: Redirect несуществующий_url url # С помощью директивы Alias можно предоставить доступ не только # к файлам, находящимся в каталоге, указанном директивой # DocumentRoot, и его подкаталогах, но и в других каталогах, # Формат: # Alias несуществующее_имя нормальное_имя Alias /icons/ /var/www/icons/ # ScriptAlias определяет расположение каталога сценариев CGI # Формат: ScriptAlias подставное_имя настоящее_имя ScriptAlias /cgi-bin/ /var/www/cgi-bin/ ScriptAlias /protected-cgi-bin/ /var/www/protected-cgi-bin/ # С помощью директивы AddType можно добавить новый тип MIME, # который не указан в файле apache-mime.types. # Формат: AddType type/subtype ext1 # Обычно для модуля РНР3 (он не является частью Apache) # директива AddType используется так: AddType application/x-httpd-php4 .php3 .phtml .php .php4 # AddType application/x-httpd-php3-source.phps # Для PHP/FI (PHP2) : # AddType application/x-httpd-php.phtml # ScriptAlias /_php/ /usr/bin/php # Action application/x-httpd-php /usr/bin/php # Action application/x-httpd-php3 /usr/bin/php # Action application/x-httpd-php4 # Директива AddHandler позволяет сопоставить определенному # типу MIME какой-нибудь обработчик. # Формат: AddHandler action-name extl # Для использования сценариев CGI : AddHandler cgi-script .cgi # Для использования генерируемых сервером файлов HTML AddType text/html .shtml AddHandler server-parsed .shtml # Раскомментируйте нижерасположенную строку, чтобы включить # функцию Apache "отправь-как-есть" (send-as-is) #AddHandler send-as-is asis # # Если вы хотите использовать карты изображений: AddHandler imap-file map # Для включения карт типов, используйте: #AddHandler type-map var # С помощью директивы Action можно определить какое-нибудь # действие для обработчика. Например, вы можете запустить # какую-нибудь программу для обработки файла данного типа. # Формат: Action media/type /cgi-script/location # Формат: Action handler-name /cgi-script/location # Директива MetaDir определяет имя каталога, в котором сервер # Apache может найти информационные файлы meta. Эти файлы содержат # дополнительные заголовки HTTP, которые будут добавлены к # документу перед его передачей клиенту. #MetaDir .web # Директива MetaSuffix определяет имя суффикса файла, который # содержит meta-тэги. #MetaSuffix .meta # Здесь можно определить сообщения об ошибках. # Это можно сделать тремя методами: # 1) обыкновенный текст # ErrorDocument 500 "The server made a boo boo. # n.b. the (") marks it as text, it does not get output # # 2) локальное перенаправление # ErrorDocument 404 /missing.html # to redirect to local url /missing.html # ErrorDocument 404 /cgi-bin/missing_handler .pi # n.b. can redirect to a script or a document using server-side-includes. # # 3) внешнее перенаправление # ErrorDocument 402 http://some.other_server.com/subscription_info.html # <Location /manual> ErrorDocument 404 "The document you requested has not been installed on your system. Please install the apache-manual package. </Location> # Модуль mod_mime_magic позволяет серверу использовать различные # подсказки из файла для определения его типа. # MimeMagicFile /etc/httpd/conf/magic # Следующие директивы необходимы для браузеров Netscape 2.x и # Internet Explorer 4.0b2 BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 # Следующие директивы отключают ответы НТТР/1.1 для браузеров, # которые не поддерживают протокол HTTP/1.1 BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/l\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0 #------------------– Настройки доступа –-------------------- # В этом разделе определяются настройки сервера, которые управляют # доступом к серверу. Раньше эти настройки находились в файле # access.conf. # Каждый каталог, к которому Apache может получить доступ, # может быть сконфигурирован определенным образом. Можно # запретить выполнение некоторых операций, доступ определенных # пользователей или узлов сети. # Установки доступа распространяются на весь каталог и на все его # подкаталоги. # Прежде всего, конфигурируем корневой каталог для установки # полномочий доступа. <Directory /> Options Indexes Includes FollowSymLinks AllowOverride None </Directory> <Directory /home> # Здесь должны быть определены директивы "Includes", "FollowSymLinks", # "ExecCGI", "MultiViews" или любая комбинация "Indexes" Options Indexes Includes FollowSymLinks AllowOverride All # Разрешает доступ всем order allow,deny allow from all </Directory> # Каталоги /var/www/cgi-bin и /var/www/protected-cgi-bin должны быть # определены с помощью директивы ScriptAliased <Directory /var/www/cgi-bin> AllowOverride All Options ExecCGI </Directory> <Directory /var/www/protected-cgi-bin> order deny,allow deny from all allow from localhost #allow from .your_domain.com AllowOverride None Options ExecCGI </Directory> # Разрешает отчеты о состояния сервера <Location /server-status> SetHandler server-status order deny,allow deny from all allow from localhost, 127.0.0.1 # Установите здесь имя вашего домена # allow from .your_domain.com </Location> # Разрешает доступ к файлам документации для локальной машины. Alias /doc /usr/share/doc <Directory /usr/share/doc> order deny,allow deny from all allow from localhost, 127.0.0.1 # allow from .your_domain. com Options Indexes FollowSymLinks </Directory> #-------------------– Конфигурация сервера ------------------------ # Тип сервера: inetd или standalone. ServerType standalone # Если вы используете тип inetd, перейдите к директиве "ServerAdmin" # Директива Port – только для standalone-сервера. # Если вы хотите запустить сервер Apache с использованием этого # или любого другого порта, номер которого меньше 1024, # вы должны обладать правами суперпользователя. Но # даже если у вас нет таких прав, вы можете запустить сервер # для работы с портом, номер которого превышает значение 1024. # Обычно используется # номер 8080 или 8000. Port 80 # Сервер Apache ведет журнал доступа других компьютеров. # Если вы включите данную опцию, то в журнал будет записано # доменное имя компьютера-клиента. Если эта опция выключена, # то в журнал будет записан IP-адрес клиента. Включение данной # опции замедляет работу сервера, так как ему требуется # дополнительное время на ожидание ответа от сервера DNS. HostnameLookups off # Директивы User и Group определяют идентификаторы пользователя # и группы. # Данные идентификаторы присваиваются серверу, если он запущен в # автономном режиме. Можно использовать как имена пользователей, # так и их числовые эквиваленты – UID. По умолчанию используется # имя пользователя nobody или apache. Из соображений безопасности # не рекомендуется изменять это значение и присваивать имя # реального пользователя. User apache Group apache # Директива ServerAdmin задает электронный адрес вебмастера вашего # Web-узла. В случае возникновения ошибок именно по этому адресу # будет отправлено сообщение. ServerAdmin root@localhost # В директиве ServerRoot указывается местонахождение файлов # конфигурации сервера Apache. # По умолчанию используется каталог /etc/httpd. ServerRoot /etc/httpd # Данная директива используется для компьютеров, которые имеют # несколько IP-адресов. Обычно данная директива используется # для конфигурирования виртуальных хостов. # BindAddress * # Прослушивать порт 80 Listen 80 # Директивы ErrorLog и TransferLog определяют расположение # журналов сервера Apache. Обычно используется каталог # /etc/httpd/logs, который является ссылкой на каталог # /var/log/httpd или на любой другой. ErrorLog logs/error_log # LogLevel: устанавливает уровень протоколирования. # Протоколируются предупреждающие сообщения сервера (warn) # и ошибки. Если вы хотите протоколировать только ошибки, # установите error LogLevel warn # Определяет формат файлов протокола, то есть информация, # которая будет протоколироваться. Обычно их не нужно изменять. LogFormat "%h %1 %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{UserAgent}i\"" combined LogFormat "%h %1 %u %t \"%r\" %>s %b" common LogFormat "%(Referer}i –> %U" referer LogFormat "%{User-agent}i" agent # Можно определить тип протокола # Если вы хотите протоколировать общую информацию # CustomLog logs/access_log common # Если вы хотите протоколировать referer # CustomLog logs/referer_log referer # Если вы хотите протоколировать название пользовательских # агентов (браузеров) # CustomLog logs/agent_log agent # По умолчанию используется комбинированный тип протоколирования, # то есть будет протоколироваться вся информация CustomLog logs/access_log combined # С помощью директивы PidFile указывается имя файла, # в котором исходный процесс сервера будет регистрироваться. PidFile /var/run/httpd.pid # ScoreBoardFile: Этот файл используется для сохранения внутренней # информации процесса сервера. ScoreBoardFile /etc/httpd/httpd.Scoreboard # Директива LockFile определяет файл блокировки, который # используется сервером. Сервер должен быть скомпилирован с опцией # USE_FCNTL_SERIALIZED_ACCEPT или # USE_FLOCK_SERIALIZED_ACCEPT. Файл блокировки должен быть # сохранен НА ЛОКАЛЬНОМ ДИСКЕ. # LockFile /etc/ittpd/httpd.lock # Директива ServerName позволяет вам установить имя узла вашего # сервера, которое будет использоваться клиентами, # то есть установить "www" вместо реального имени сервера. # Имя, которое вы укажете, должно быть указано в сервере DNS # вашего домена. ServerName new.host.name # Директива UseCanonicalName появилась в версии Apache 1.3. # Она разрешает использовать каноническое имя для сервера узла. UseCanonicalName on # Данная директива позволяет прокси-серверу, например SQUID, # не кэшировать документы, которые не генерируются автоматически, # то есть в процессе выполнения различных сценариев. CacheNegotiatedDocs # Директива Timeout задает промежуток времени в секундах, # в течение которого сервер продолжает попытки возобновления # приостановленной передачи данных. Значение директивы Timeout # распространяется не только на передачу, но и на прием данных. Timeout 300 # Директива KeepAlive разрешает постоянные соединения, # то есть такие соединения, в которых производится более # одного запроса за один раз. KeepAlive off # MaxKeepAliveRequests: Максимальное количество запросов, # разрешенное в течение постоянного соединения. Установите 0 # для снятия ограничения. Для повышения производительности # рекомендуется установить это число сравнительно большим. MaxKeepAliveRequests 100 # Директива KeepAliveTimeout определяет тайм-аут для постоянного # соединения. KeepAliveTimeout 15 # Минимальное и максимальное число серверов в пуле MinSpareServers 8 MaxSpareServers 20 # Количество серверов для запуска StartServers 10 # Ограничивает общее количество клиентов. Когда это число будет # превышено, новые клиенты получат отказ, поэтому это число # не должно быть слишком маленьким. MaxClients 150 # После обработки определенного количества запросов, указанного # в директиве MaxRequestsPerChild, копия сервера завершается, # а вместо нее запускается новая. MaxRequestsPerChild 500 # Директивы конфигурации прокси-сервера # ProxyRequests On # Для включения кэширования, раскомментируйте строки ниже: # CacheRoot /var/cache/httpd # CacheSize 5 # CacheGcInterval 4 # CacheMaxExpire 24 # CacheLastModifiedFactor 0.1 # CacheDefaultExpire 1 # NoCache a_domain.com another_domain.edu joes.garage_sale.com #################################### # Настройки производительности SGI # #################################### # # # Для использования этой функции, раскомментируйте модуль # mod_mmap_static в разделе описания модулей. <IfModule mod_mmap_static.c> QSC on </IfModule> # Если вы хотите использовать буферизованное протоколирование, # раскомментируйте модуль mod_log_config_buffered в разделе # описания модулей. # Для использования карты памяти, раскомментируйте эту строку: # mmapfile /var/www/html/file_to_map_in_memory # # Если вы хотите настроить процессы потомки, пожалуйста, # прочитайте документацию на вашем сервере # http://localhost/manual/misс/perf-mja.html. # Эта страница объясняет как привязать определенный IP-адрес # или порт к другому процессору. # SingleListen On ####################### # Виртуальные серверы # ####################### # # Поддержка модуля perl # Замечание: не удаляйте расположенные далее строки, иначе это может # разрушить вашу конфигурацию. <IfDefine PERLPROXIED> ProxyPass /perl/ http://127.0.0.1:8200/ ProxyPassReverse /perl/ http://127.0.0.1:8200/ </IfDefine> # Файл, в котором находятся директивы конфигурирования # виртуальных узлов. Include conf/vhosts/Vhosts.conf # # # Для поддержки динамических виртуальных хостов и виртуальных # домашних каталогов, раскомментируйте следующие строки: # LoadModule vhost_alias_module modules/mod_vhost_alias.so # AddModule mod_vhost_alias.c # Include conf/vhosts/DynamicVhosts.conf # Include conf/vhosts/VirtualHomePages.conf # Директивы конфигурирования PHP Include conf/addon-modules/php.conf 12.7. Перекодирование русскоязычных документов «на лету»С тех пор, когда в русском языке появилось слово кодировка, появилась и проблема перекодировки. Стандартной кодировкой русского языка для большинства Unix-серверов является КОИ-8. Аббревиатура КОИ расшифровывается как «Код для Обмена Информацией». Все бы было хорошо, если бы существовала одна-единственная кодировка KOI8-r. Но, как всегда, найдутся добрые люди, которые захотят помочь нам кодировать наш русский язык. И таких нашлось немало. Например, всем известная Microsoft сначала использовала кодировку СР-866 (еще известную как альтернативная кодировка — ALT) в своей операционной системе DOS. ОС DOS тогда была установлена на большинстве домашних и офисных компьютеров, поэтому особой разницы, что использовать: KOI8-r или СР-866, для пользователей не было по одной простой причине: у меня отображается так же, как и у соседа. Потом та же Microsoft разработала кодировку Windows-1251 (ANSI) для своей новой операционной системы Windows. Стараясь нам «помочь», она создала проблемы с перекодировкой уже на локальном уровне: файлы, созданные в ОС DOS, без предварительного перекодирования нельзя было прочитать в Windows, и наоборот. Заметьте, об Интернет и Apache я еще не сказал ни слова. Кроме Microsoft, «облегчили» нам жизнь также компании Apple и Sun, разработав соответственно кодировки Apple и ISO8859-5. Компания IBM также не отстала от них, разработав собственную кодировку русского языка. В общем, развитие таблиц перекодирования русского языка происходило по принципу: а мы новый дом построим… А теперь представьте: все эти кодировки смешались в Интернет. Я работаю под Unix и использую KOI8, а вы под Windows и мы не можем прочитать файлы друг друга из-за проблем с кодировкой. Это довольно неудачный пример, так как средств для перекодирования из KOI8 в Windows-1251 разработано довольно много. А вот с кодировкой Apple могут возникнуть проблемы. Мне встречались браузеры, некорректно отображающие русские символы в этой кодировке. Возникает задача: настроить автоматическое перекодирование документов из одной кодировки в другую. Для начала необходимо настроить хотя бы перекодирование «на лету» из KOI8 в Windows-1251, так как большинство клиентов в Сети используют именно эту кодировку (от Windows, как от смерти, не уйдешь). Обыкновенный англоязычный Apache, входящий в состав большинства дистрибутивов, не сможет вам в этом помочь. Для корректных операций по перекодированию нужно загрузить и установить сервер Russian Apache. Или же просто установить модуль Apache-RUS. Скачать данный модуль (как и полностью Russian Apache) можно по адресу: ftp://apache.Iexa.ru/pub/apache-ras/. При этом старшая часть версии соответствует оригинальному серверу Apache, младшая — версии модуля Apache-Rus. Рассматривать процесс установки и настройки я буду на примере не очень новой версии сервера — 1.3.3/PL27.3, это не принципиально. Загрузив файл, распакуйте его: tar xvzf apache_1.3.3rusPL27.3.tar.gz После этого перейдите в каталог apache_1.3.3rusPL27.3 и запустите сценарий configure: # cd apache_1.3.3rusPL27.3 # ./configure Можно также указать некоторые параметры сценария, например, параметр –prefix=path следует использовать при необходимости установить сервер в другой каталог. Далее введите ставшие уже привычными вам команды: # make # make install После этого нужно настроить сервер, то есть отредактировать его файлы конфигурации. Настройка Russian Apache не отличается от настройки обыкновенного сервера Apache, за исключением настройки модуля перекодирования. Ниже будет рассмотрена настройка именно перекодирования «на лету», так как настройка самого сервера описана в предыдущих пунктах этой главы. Директивы перекодирования можно разделить на три группы. Первые указывают в какой кодировке хранятся файлы на диске, вторые — определяют названия кодировок, их псевдонимов, таблиц символов. Третья группа определяет порядок перекодирования документов. Приведу небольшой пример использования первой группы кодировок: CharsetSourceEnc koi8-r CharsetByExtension windows-1251.txt Эти директивы находятся в файле httpd.conf. Первая указывает на то, что все файлы на диске, кроме файлов с расширением .txt, хранятся в кодировке koi8-r. Для последних указывается кодировка — windows-1251. Данные директивы можно включать в блок Location или в файлы .htaccess. Ко второй группе относятся директивы CharsetDecl, CharsetAlias, CharsetRecodeTable и CharsetWideRecodeTable. Они находятся в блоке <IfModule mod_charset.c> — </IfModule> и не нуждаются в изменении. Необходимо только отметить (это нужно для понимания дальнейшего материала), что директива CharsetDecl используется для объявления кодировки, а CharsetAlias — для объявления псевдонима кодировки, например: CharsetDecl windows-1251 ru CharsetAlias windows-1251 win x-cp1251 cp1251 cp-1251 Название языка (ru) должно быть определено в файле conf/srm.conf в директивах Add Language и LanguagePriority. С помощью третьей, самой многочисленной, группы вы можете настроить сервер для автоматической перекодировки символов на основании информации о клиенте. Например, определив, что клиент работает в операционной системе Windows и кодировкой браузера по умолчанию является Windows-1251, сервер самостоятельно перекодирует файлы в нужную кодировку. Если сервер сделает выбор неправильно, пользователь всегда сможет сам изменить кодировку вручную. Существует три способа выбора кодировки: По каталогу, например: http://www.server.ru/koi/file.html http://www.server.ru/win/file.html По имени сервера, например: http://koi.www.server.ru/file.html http://win.www.server.ru/file.html По порту, например: http://www.server.ru:8000/file.html http://www.server.ru:8001/file.html Теперь рассмотрим каждый из этих способов. Для перекодирования по каталогу (точнее, по его префиксу) нужно добавить в блоке VirtualHost псевдоним, например: Alias /koi /www/docs Или же просто создать в нужном каталоге ссылку на самого себя: # cd /www/docs # ln –s . koi Несмотря на свою простоту, этот способ имеет множество недостатков. Если у вас небольшой сервер, вы можете использовать перекодировку по каталогу. В другом случае, лучше используйте перекодировку по имени сервера или по порту. При использовании перекодировки по имени сервера следует обратить внимание на то, чтобы указанный вами сервер был прописан на сервере DNS. После регистрации поддомена внесите следующие строки в ваш файл httpd.conf: # Естественно, укажите здесь свой IP-адрес <VirtualHost 111.111.111.1> ServerName www.server.ru ServerAlias *.www.server.ru # далее следует обычная конфигурация … </VirtualHost> В качестве имени поддомена нужно использовать один из псевдонимов кодировки, указанный с помощью директивы CharsetAlias, например, koi или win. Если же сервер DNS администрируете не вы, а кто-то другой и возможности внести изменения в записи DNS у вас нет, то используйте перекодировку по порту. Для этого удалите (закомментируйте) директиву Port в файле конфигурации httpd.conf и вместо нее добавьте следующие директивы: Listen 80 Listen 8000 Listen 8001 Listen 8002 Listen 8003 CharsetByPort koi8-r 8000 CharsetByPort windows-1251 8001 CharsetByPort ibm866 8002 CharsetByPort iso-8859-5 8003 Номера портов при этом не очень важны. Думаю, это пример настолько прозрачен, что не нуждается в особых комментариях. Правда, есть одно но: если сеть клиента защищена брандмауэром (см. гл. 14), не позволяющем обращения к выбранному вами порту, клиент не сможет установить соединение с вашим сервером. Схема (порядок) выбора кодировки определяется директивой CharsetSelectionOrder: CharsetSelectionOrder Dirprefix Useragent Portnumber Hostname UriHostname — для выбора по каталогу. CharsetSelectionOrder Hostname UriHostname Useragent Portnumber Dirprefix — для выбора по имени домена. CharsetSelectionOrder Portnumber Useragent Hostname UriHostname Dirprefix — для выбора по порту. Для начальной настройки перекодирования ваших знаний уже достаточно, а дополнительную информацию вы найдете в документации по серверу Russian Apache. продам фермерское хозяйство |
|
||||||||||||||||||||||||||||||||
Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх |
||||||||||||||||||||||||||||||||||
|