Web сервер Apache 1.3 с поддержкой php5 и mod_perl (русский перевод httpd.conf)
Я понимаю, что материала на эту тему в Сети хоть отбавляй, но я хочу написать свою публикацию, изложить свои мысли и идеи. Просто записать для себя то, что знаю. Поэтому предлагаю всем желающим ознакомиться с моим вариантом создания виртуального веб хостинга на основе операционной системы FreeBSD с использованием известного всем программного обеспечения.
Краткое оглавление
- Установка Apache 1.3
- Конфигурация Apache. Русский перевод httpd.conf
- Подключение модулей PHP5 и mod_perl
Примеры конфигураций из этой статьи можно использовать для простейшего хостинга для себя или “для своих”. Скорее всего, для профессионального хостинга он потребует доработок. Тем не менее, начинать нужно с малого.
Установка Apache 1.3
В первую очередь, следует установить веб сервер. Для этих целей задействуем наиболее распространенное программное обеспечение - Apache, проекта . Если взглянуть на , можно увидеть, что Apache используется почти на 50% серверов по всему миру.
Apache по традиции, как открытое программное обеспечение, входит в стандартную коллекцию портов FreeBSD. Существует два направления разработки проекта: Apache 1.x и Apache 2. Во втором случае используется более современный вариант, однако я использую на своих машинах проверенную временем первую ветку. На сегодняшний день последняя актуальная версия 1.3.39_2.
root# cd /usr/ports root# make search name="apache-1.3" Port: ru-apache-1.3.37+30.23_1 Path: /usr/ports/russian/apache13 Info: The extremely popular Apache http server. Very fast, very clean Maint: lev@FreeBSD.org B-deps: perl-5.8.8_1 R-deps: perl-5.8.8_1 WWW: http://apache.lexa.ru/ Port: apache-1.3.39_2 Path: /usr/ports/www/apache13 Info: The extremely popular Apache http server. Very fast, very clean Maint: ache@freebsd.org B-deps: expat-2.0.0_1 perl-5.8.8_1 R-deps: expat-2.0.0_1 perl-5.8.8_1 WWW: http://httpd.apache.org/
Первый вариант я не жалую. Это проект под названием “русский Apache” и попробовав его однажды года три назад я к нему больше не вернулся. Даже сейчас и не вспомню точно в чем именно была проблема, но связана она была с неправильно отображаемыми кодировками. Как обстоят дела нынче я не знаю. Мне это неинтересно. Если Вас этот проект заинтересовал - попробуйте. Второй вариант - обычный Апач. И его то мы и задействуем.
Собираем из исходных кодов.
root# cd /usr/ports/www/apache13 root# make install clean
Cписок дополнительных опций для сборки:
# Подключить возможности suEXEC? # По-умолчанию "no". Данная возможность дает запускать пользовательские CGI скрипты от имени # пользователей, которым они принадлежат. Может пригодиться в целях безопасности. WITH_APACHE_SUEXEC=yes # Указать имя пользователя, которому будет позволено использовать возможности suEXEC. # По-умолчанию, это пользователь www APACHE_SUEXEC_CALLER=user # Указать корневую папку в которой можно будет применить возможности suEXEC. # По-умолчанию это /usr/local/www/data APACHE_SUEXEC_DOCROOT=dir # Указать путь к лог-файлу, в котором будет отображаться работа suEXEC. # По дефолту /var/log/httpd-suexec.log APACHE_SUEXEC_LOG=file # Пользовательские каталоги для работы suEXEC. По-умолчанию public_html APACHE_SUEXEC_USERDIR=dir # Минимальный идентификатор системного пользователя для которого будет разрешено использование suEXEC. # По-умолчанию, 1000 APACHE_SUEXEC_UIDMIN=uid # Аналогично - група. По-умолчанию 1000 APACHE_SUEXEC_GIDMIN=gid # "Безопасные" пути suEXEC. По умолчанию # /bin:/usr/bin:/usr/local/bin APACHE_SUEXEC_SAFE_PATH=path # Маска файлов по-умолчанию для suEXEC скриптов. # По-умолчанию совпадает с переменными процесса httpd APACHE_SUEXEC_UMASK=umask # Путь к каталогу для документов веб-сервера # По-умолчанию традиционно /usr/local/www APACHE_DATADIR=path # Корневой каталог для cgi-bin скриптов # По-умолчанию традиционно /usr/local/www/cgibin APACHE_CGIBIN_ROOT=path # Корневой каталог для документов. # По-умолчанию /usr/local/www/data APACHE_DOCUMENT_ROOT=path # Установить путь к каталогу с изменяющимися # данными. Вобщем то тут речь идет о # лог-файлах, потому что в каталоге var именно # логи и обычно хранятся. APACHE_LOCALSTATE_DIR=path # Путь к папке с логами. По-умолчанию # прописывается путь /var/log APACHE_LOGFILE_DIR=path # Максимальное число процессов httpd # По-умолчанию 512 APACHE_HARD_SERVER_LIMIT=nr # Максимальное число одновременно открытых файлов. По-умолчанию 1024 APACHE_FD_SETSIZE=nr # Можно заставить Апаче буферизировать логи, тоесть держать их какое-то время в памяти, # перед тем как записать на диск в файл. При большом количестве запущенных дочерних # процессов (children), включение опции может обернуться ошибочной статистикой сайтов на # основе анализа логов веб сервера. Потому, по-умолчанию значение "no" APACHE_BUFFERED_LOGS=yes # CFLAGS оптимизация. Включение данной опции может породить "битый код" (дословный перевод # с английского), а потому не рекомендуется на рабочих серверах. По дефолту выключено. WITH_APACHE_PERF_TUNING=yes # Создавать "жесткую" ссылку на старый лог файл WITH_APACHE_LATESTLOG=yes # Поддержка IPv6. По-умолчанию "no". WITH_APACHE_IPV6=no # Подключение модуля mod_snmp - по дефолту нет. WITH_APACHE_MODSNMP=yes # Подключение модуля mod_accel - по дефолту нет. WITH_APACHE_MODACCEL=yes # Подключение модуля mod_deflate - по дефолту нет. WITH_APACHE_MODDEFLATE=yes
Мы пока что никакие дополнительные опции выбирать не будем. А кроме того, многие из этих опций можно будет переопределить в последствии в конфигурационном файле. Тем не менее, если нам нужна, например, поддержка suexec, то в файл /etc/make.conf добавим перед компиляцией такие строки:
# Если следующей строчки в Вашем /etc/make.conf
# нет, добавьте ее.
PORTSDIR?= /usr/ports
.if ${.CURDIR} == ${PORTSDIR}/www/apache13
WITH_APACHE_SUEXEC=yes
APACHE_SUEXEC_CALLER=www
APACHE_SUEXEC_DOCROOT=/usr/local/www
APACHE_SUEXEC_LOG=/var/log/apache/httpd-suexec.log
APACHE_SUEXEC_USERDIR="/usr/local/www/users/*/*/cgi-bin"
APACHE_SUEXEC_UIDMIN=1001
APACHE_SUEXEC_GIDMIN=1001
# Можно дописать еще такие строки:
APACHE_HARD_SERVER_LIMIT=yes
WITH_APACHE_PERF_TUNING=yes
APACHE_HARD_SERVER_LIMIT=1024
.endif
Теперь можно сказать make install clean. Дожидаемся окончания процесса установки и приступаем к редактированию основного конфигурационного файла Apache, который называется httpd.conf и находится в папке по-умолчанию /usr/local/etc/apache. Точнее сказать, в этой папке находится файл httpd.conf-dist который Вам следует переименовать в httpd.conf.
Конфигурация Apache. Русский перевод httpd.conf
Вот мой вариант конфигурации Apache с переводом комментариев на русский язык.
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
Следущее, что нам предстоит сделать - проверить правильность всех путей в конфиге. Следует убедиться, что все каталоги, которые указаны в конфигурационном файле, существуют. Каталоги для сервера по-умолчанию наверняка уже имеются, потому что были созданы при инсталяции Apache. Нам нужно создать только папку /var/log/apache - для записи логов основного сервера (не забудьте выставить на нее права для пользователя www) и все необходимые каталоги виртуального хоста somesite.com. Для этого первым делом создаем системного пользователя user.
root# adduser Username: user Full name: Hosting User Uid (Leave empty for default): Login group [user]: Login group is user. Invite user into other groups? []: Login class [default]: russian Shell (sh csh tcsh false bash rbash nologin) [sh]: Home directory [/home/user]: Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : user Password : ***** Full Name : Hosting User Uid : 1003 Class : russian Groups : user Home : /home/user Shell : /bin/sh Locked : no OK? (yes/no): y adduser: INFO: Successfully added (user) to the user database. Add another user? (yes/no): n Goodbye!
Теперь создаем все необходимые каталоги для размещения сайта в каталоге user, а также выставляем права на них.
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
Права на .htaccess выставлены так нарочно. Это на тот случай, если необходимо запретить пользователю менять в нем что-либо.
А вообще, все так подробно расписано для того, чтобы те, кто сталкивается с этим впервые смогли быстро во всем разобраться. На деле обычно я делаю заготовку-каталог, со всеми необходимыми подкаталогами и файлами в них, выставляю права и помещаю в /usr/share/skel - каталог, в котором размещается все, что попадает в $HOME новосозданного пользователя. Такую заготовку, (по имени, например, vhost-template) достаточно будет просто переименовать на имя будущего сайта и выставить (через chown) владельца.
Минусы такого порядка размещения папок пользователей хостинга в том, что приходится для каждого владельца сайтов заводить системного пользователя. Тем не менее, необязательно давать ему ssh доступ. В файле /etc/ssh/sshd_config определяем специальную группу, например, sshusers. И только те, кто в нее входит, смогут запускать сеанс ssh на сервере.
root# cat /etc/ssh/sshd_config | grep AllowGroup AllowGroups sshusers
В группу sshusers вносим только тех, кому разрешаем ssh доступ.
root# cat /etc/group | grep sshusers sshusers:*:100:daemony,trustuser1,trustuser2,trustuser3
Остальные смогут прекрасно обойтись FTP.
Достоинства такой расстановки в том, что она “шаблонного типа”. По такому шаблону с использованием самописного скрипта можно автоматизировать создание и удаление аккаунтов, например, через web интерфейс (пример скрипта, я думаю, будет изложен в одной из следущих публикациях). Другое достоинство в том, что обеспечена надежная защита файлов пользователей от просмотра другим пользователями. По такой схеме только владелец файлов и пользователь www имеют доступ к каталогам /home/*/www/*/.
Следущий шаг, о котором не стоит забывать - установка квот для созданного пользователя. О том, как это делается рассказано в этой публикации.
Замечание: при вышеописанной расстановке каталогов виртуального хостинга, объем, которые будут занимать логи сайтов, также будет учитываться в квоту пользователя. Лично мне так удобнее.
Если Вы считаете иначе, то можете переконфигурировать виртуальные хосты для размещения логов в каталогах, например /var/log/apache/$USER/$VHOST/. В принципе, наверное второй вариант был бы гораздо удобнее… для пользователя.
Итак все почти готово для запуска Вашего веб сервера. Осталось только добавить в rc.conf параметр, разрешающий старт Apache при запуске системы
root# echo "apache_enable="YES" > /etc/rc.conf
Для управления сервером Apache используется утилита apachectl. Ею удобно запускать, останавливать, перезапускать сервер, а также проверять конфигурационный файл httpd.conf на наличие ошибок.
Использование apachectl <command>
- start - запустить httpd
- stop - остановить httpd
- restart - перезапуск httpd (если он запущен) посредством посылки сигнала SIGHUP или же если сервер не запущен, попытка запуска.
- fullstatus - показать расширенный статус сервера. Требуется, чтобы в системе был установлен браузер lynx и активирован модуль mod_status.
- status - показать основной статус сервера. Требуется, чтобы в системе был установлен браузер lynx и активирован модуль mod_status.
- graceful - осуществить “мягкий” перезапуск, посредством посылки сигнала SIGUSR1, либо, если сервер не запущен запустить его.
- configtest - выполнить проверку конфигурационного файла httpd.conf
- help - собственно, эта справка.
Проверяем наш конфиг.
root# apachectl configtest Syntax OK
Значит можно запускать!
root# apachectl start /usr/local/sbin/apachectl start: httpd started
Проверим, не врет ли?
root# sockstat | grep httpd www httpd 89279 22 tcp4 *:80 *:* www httpd 89278 22 tcp4 *:80 *:* www httpd 89277 22 tcp4 *:80 *:* www httpd 89276 22 tcp4 *:80 *:* www httpd 89275 22 tcp4 *:80 *:* root httpd 89274 22 tcp4 *:80 *:*
Поздравляем. Ваш Apache работает. Поместите в корневой каталог своего виртуал хоста какую-либо html страницу и попробуйте проверить, открывается ли? Если Вы получите сообщение об ошибке (HTTP 403 - Доступ запрещен, либо какую-то другую), нужно смотреть логи сервера и читать на что он ругается. (с учетом того, естественно, что у Вас уже прописаны все необходимые DNS записи для Вашего домена).
На мой взгляд, самое замечательное в Apache то, что практически всегда все свои проблемы он выкладывает в логи. Если не в лог виртуал-хоста, то в основной лог файл точно. Частая ошибка - неверно выставленные права, и Apache попросту не может получить доступ к тому или иному документу на сервере.
Подключение модулей PHP5 и mod_perl
Но все это конечно хорошо. Но если бы в Сети все сайты были на голом HTML то, по большому счету, и смотреть было бы не на что. Естественно, нам нужно подключить поддержку языка PHP чтобы иметь возможность использовать php скрипты.Устанавливать будем PHP пятой версии. Если она Вас не устраивает, Вы можете установить четвертую. Отличия будут незначительные.
Идем в порты и ищем то, что нам нужно:
root# cd /usr/ports/
root# make search name="php5-5"
Port: php5-5.2.5
Path: /usr/ports/lang/php5
Info: PHP Scripting Language
Maint: ale@FreeBSD.org
B-deps: apache-1.3.39_2 autoconf-2.61_2 autoconf-wrapper-20071109 expat-2.0.0_1
libiconv-1.11_1 libxml2-2.6.30 m4-1.4.9,1 perl-5.8.8_1 pkg-config-0.22_1
R-deps: apache-1.3.39_2 expat-2.0.0_1 libiconv-1.11_1 libxml2-2.6.30
perl-5.8.8_1 pkg-config-0.22_1
WWW: http://www.php.net/
Переходим в каталог /usr/ports/lang/php5 и говорим make install clean. Появится синее окно с опциями. Я выбираю такие:
────────────────────────────────────────────────────────────────
Options for php5 5.2.5_1
────────────────────────────────────────────────────────────────
[X] CLI Build CLI version
[X] CGI Build CGI version
[X] APACHE Build Apache module
[ ] DEBUG Enable debug
[X] SUHOSIN Enable Suhosin protection system (not for jails)
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6 Enable ipv6 support
[X] MAILHEAD Enable mail header patch
[X] REDIRECT Enable force-cgi-redirect support (CGI only)
[X] DISCARD Enable discard-path support (CGI only)
[X] FASTCGI Enable fastcgi support (CGI only)
[X] PATHINFO Enable path-info-check support (CGI only)
────────────────────────────────────────────────────────────────
[ OK ] Cancel
────────────────────────────────────────────────────────────────
Дожидаемся окончания процесса компиляции. По завершении в конфиг httpd.conf автоматически будет добавлен модуль PHP:
LoadModule php5_module libexec/apache/libphp5.so
и
AddModule mod_php5.c
А программа установки напоследок выдаст следущее сообщение:
*************************************************************** Make sure index.php is part of your DirectoryIndex. You should add the following to your Apache configuration file: AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps ***************************************************************
Последние две строчки мы должны добавить в конфигурационный файл httpd.conf. В глобальные настройки сервера добавлять их я не рекомендую. Дело в том, что среди Ваших виртуальных хостов, возможно, окажутся такие, для которых включать поддержку PHP Вы не желаете, либо нет необходимости. Поэтому, добавьте эти строки конкретно в тот контейнер VirtualHost, для которого нужно активировать PHP.
Настройки нашего виртуального сервера somesite.com приобретут такой вид:
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
Для того, чтобы Apache воспринял изменения следует выполнить:
root# apachectl restart
Проверьте, подключился ли PHP. Для этого в корневой каталог сервера somesite.com положите файл index.php, в который поместите всего одну строку:
<? phpinfo(); ?>
Это встроенная функция языка PHP, которая выдает информацию о веб сервере, о версии PHP и еще массу другой информации.
Но PHP, который мы установили, в настоящий момент “голый”. Он многое не умеет и, в принципе, далеко на нем не уедешь. Кроме самого интерпретатора нам также понадобятся его модули или, как еще говорят, расширения.
Снова отправляемся в порты и находим там вот что:
root# cd /usr/ports/ root# make search name="php5-extensions" Port: php5-extensions-1.1 Path: /usr/ports/lang/php5-extensions Info: A "meta-port" to install PHP extensions Maint: ale@FreeBSD.org ...
Это как раз то, что нам необходимо. Мета-порт, который вобщем то и не порт вовсе. Он всего лишь помогает выбрать, какие порты установить для подключения дополнительных модулей PHP.
root# cd /usr/ports/lang/php5-extensions make install clean
И здесь опять вывалится синее окошко с большим набором опций. Эти опции - расширения, которые возможно установить. Учтите, что чем больше расширений PHP установлено, тем больше памяти потребляет процесс httpd, потому что после запуска он носит их все “в себе”. В принципе, можно установить все расширения, потому что потом будет возможность какие-то отключить, а какие-то оставить. Но я обычно выбираю такие.
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
Для чего и где нужно какое расширение - Документации там на эту тему полно.
Скажу только, что расширения MYSQL и MYSQLI потянут за собой MySQL клиента. Об установке MySQL написано в этой публикации.
После того, как наши расширения будут собраны и установлены, в каталоге /usr/local/etc/php/ появится файл extensions.ini где будут перечислены (по одному в строчку) каждое подключенное расширение. Для того, чтобы Apache принял новую конфигурацию PHP, перезапустите его через apachectl restart. Если какое-то расширение необходимо запретить, закомменируйте соответствующую строку в extensions.ini и перезапустите Apache. Комментарии в extensions.ini - “точка с запятой”.
Настройки интерпретатора PHP располагаются по умолчанию в файле /usr/local/etc/php.ini. Я обычно меняю на него права (ненужно, кроме веб сервера, в него никому смотреть):
root# chmod 640 /usr/local/etc/php.ini root# chown root:www /usr/local/etc/php.ini
Для проверки того, что модули подключились благополучно, воспользуйтесь вышеупомянутым файлом с функцией phpinfo();.
Параметры интерпретатора PHP требуют в большинстве случаев дополнительной донастройки, путем внесения изменений в файл php.ini. Однако, в этой публикации это обговаривать не буду. С дефолтной конфигурацией обычно тоже проблем не возникает, если только не используются PHP скрипты с какими-либо особенными требованиями.
Осталось к нашему серверу подключить модуль mod_perl, дабы не использовать при работе системный Perl. Идем в порты, находим то, что нужно и устанавливаем.
root# whereis mod_perl mod_perl: /usr/ports/www/mod_perl root# cd /usr/ports/www/mod_perl root# make install clean
В процессе установки модуля будет установлен еще ряд дополнительных модулей. Список можно будет пронаблюдать в конце установки.
... ===> Compressing manual pages for mod_perl-1.30 ===> Registering installation for mod_perl-1.30 ===> Cleaning for p5-libwww-5.805 ===> Cleaning for p5-URI-1.35 ===> Cleaning for p5-Compress-Zlib-2.008 ===> Cleaning for p5-Net-1.22,1 ===> Cleaning for p5-HTML-Parser-3.56 ===> Cleaning for p5-Compress-Raw-Zlib-2.008 ===> Cleaning for p5-IO-Compress-Zlib-2.008 ===> Cleaning for p5-Authen-SASL-2.10_1 ===> Cleaning for p5-HTML-Tagset-3.10 ===> Cleaning for p5-Test-Simple-0.74 ===> Cleaning for p5-IO-Compress-Base-2.008 ===> Cleaning for p5-Test-Harness-3.09 ===> Cleaning for mod_perl-1.30
После установки модуля в конфигурационный файл httpd.conf автоматически будут добавлены строки:
LoadModule perl_module libexec/apache/libperl.so
и
AddModule mod_perl.c
Вам остается теперь только перезапустить сервер через apachectl restart.
Я постарался изложить материал как можно более полно по мере моих сил. Если что-то где-то забыл добавить или пропустил или недоглядел и сделал ошибку - буду рад дополнить или исправить.
В продолжении этой темы в следущих публикациях будет изложено подключение модуля для работы с протоколом https через SSL шифрование, подробное описание конфигурации php.ini и… все остальное, что следовало бы записать, дабы не забыть.
Похожие публикации
Теги: .htaccess, apache, apache freebsd, apachectl, extensions.ini, FreeBSD, hosting, httpd, httpd.conf, mod_perl, php, php.ini, php5, script, suexec, unix, virtualhost, www, русский перевод, сервер


получить свежую коллекцию портов пишем:
portsnap fetch
Это позволит автоматически слить коллекцию портов с ближайшего миррора. Если её на сервере нет, то будет создана. Если коллекция уже есть и была создана портснапом, то нужно набрать:
portsnap update
И будет скачена вся информация об обновленных портах.
Дальше, чтобы обновить ВЕСЬ софт на сервере (если он ставился из портов разумеется), нужно набрать всего одну команду:
portupgrade -ai
Запустится программа портапгрейд в интерактивном режиме. Она будет говорить какой из портов устарел и спрашивать, хотители его обновить. Я такой эксперимент провел – больше 200 портов обновились совершенно без проблем, сервер не умер и даже не перестал работать ни на минуту.
Да, ставится портапграде так:
cd /usr/ports/ports-mngt/portupgrade
make install clean
(nginx + aio асинхронные файловые операции вот это будет лучше) + php-fpm
Спасибо за статью.
правда есть ошибочка:
[code]
root# echo “apache_enable=”YES” > /etc/rc.conf
[/code]
правильней будет использовать >>
и еще поставить бекслеш перед кавычками ))
ps. глупый вопрос:
[code]
Поместите в корневой каталог своего виртуал хоста какую-либо html страницу и попробуйте проверить, открывается ли?
[/code]
как будет выглядеть адрес виртуал хоста? на вашем примере.
А теперь хочу осилить подключение модуля для работы с протоколом https через SSL шифрование!
2 unoroot
глянь httpd-error.log и сюда его
скорее всего нада добавить в /etc/hosts свой хост: ip hostname
Необязательно, если конфигурация правильная, нет шансов, что еще что-то не так… Пробуй еще раз стартовать Апач, а потом посмотри что сыпется в /var/log/httpd-error.log
все сделал:
но при команде:
пишет:
Что может быть не так? ведь конфигурация правельная…