Быстрая, пошаговая установка Apache + PHP на FreeBSD


1. Качаем Apache (http://archive.apache.org/dist/httpd/apache_1.3.29.tar.gz)

2. Качаем PHP (http://ru2.php.net/get/php-4.3.4.tar.gz/from/ru.php.net/mirror)

3. Кладем в одну папку. Пусть это будет /usr/distribut. И переходим в нее ("cd /usr/distribut")

4. Распаковываем: "tar xvfz apache_1.3.29.tar.gz && tar xvfz php-4.3.4.tar.gz"

5. Конфигурируем Apache: "/usr/distribut/apache_1.3.29/configure --prefix=/usr/local/apache --enable-module=so". (--prefix=/usr/local/apache указывает куда ставить Apache. --enable-module=so включает поддержку DSO)

6. Собираем и устанавливаем Apache: "cd /usr/distribut/apache_1.3.29 && make && make install"

7. Конфигурируем PHP: "/usr/distribut/php-4.3.4/configure --with-mysql --with-apxs=/usr/local/apache/bin/apxs". (--with-mysql включает поддержку MySQL, --with-apxs=/usr/local/apache/bin/apxs грит куда прописать модуль (DSO) php)

8. Собираем и устанавливаем PHP: "cd /usr/distribut/php-4.3.4 && make && make install"

9. Кладем файл настройки куда нужно: "cp php.ini-dist /usr/local/lib/php.ini"

10. В файле httpd.conf (/usr/local/apache/conf/httpd.conf) должны быть следующие строки:

LoadModule php4_module libexec/libphp4.so
AddType application/x-httpd-php .php .phtml .php3

если их нет, добавте их вручную

11. "/usr/local/apache/bin/apachectl start". Все :)

25.7.5.2.2. mod_php
Написал Tom Rhodes.

PHP, также известный как ''Препроцессор гипертекста'' (''Hypertext Preprocessor''), -- это скриптовый язык общего назначения, в основном предназначенный для веб разработки. Этот язык может быть встроен в HTML, его синтаксис заимствован из C, Java™ и Perl, и он позволяет веб разработчикам быстро писать динамически генерируемые страницы.

Добавление поддержки PHP5 к веб серверу Apache производится путем установки порта www/mod_php5.

Этот порт устанавливает и настраивает модули, необходимые для поддержки динамических PHP веб страниц. Убедитесь, что в файл /usr/local/etc/apache/httpd.conf были добавлены следующие секции:
LoadModule php5_module libexec/apache/libphp5.so
AddModule mod_php5.c
<IfModule mod_php5.c>
DirectoryIndex index.php index.html
</IfModule>
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
</IfModule>

Для загрузки модуля PHP после этого просто вызовите команду apachectl с параметром graceful:
# apachectl graceful

Поддержка PHP в FreeBSD построена по модульному принципу, поэтому базовая установка обладает очень ограниченной функциональностью. Дополнительная функциональность может быть легко добавлена при помощи порта lang/php5-extensions, управляющего набором расширений PHP через меню, либо просто путем установки дополнительных портов.

Например, для добавления поддержки MySQL к PHP5, просто установите порт databases/php5-mysql.

После установки новых расширений сервер Apache должен быть рестартован, чтобы изменения в конфигурации вступили в силу:

Apache2 + php5 + mod_fastcgi

Автор: lissyara.

Пришла пора переходить на второй апач и пятый php (навеяно грядущим завершением поддержки php4 и будущим выходом php6). Пора ловить глюки на новой платформе :) Было решено заменить на своём сервере старую связку на более новую. Ввиду того, что все кричат более медленную работу php5 и apache2, да и крутится это будет не на FreeBSD 4.11, как в прошлый раз, а на FreeBSD 6.2, решил как-то всё это ускорить. Решение подсказали давно, тока опробовать не доходили руки. Дошли :)
Однако, предложенное там решение с полпинка не завелось - а разбираться было лениво - выходной всё же, порылся в портах, и нашёл другой модуль, его и будем ставить. Поехали - рихтуем /etc/make.conf, добавляем туда такие опции:# default PHP version
DEFAULT_PHP_VER=5
PORTSDIR?= /usr/ports

# apache2
.if ${.CURDIR} == ${PORTSDIR}/www/apache20
# SSL - кому надо - включат - мне на этой машине не нужен
WITHOUT_SSL= YES
# Включение поддержки suExec
WITH_SUEXEC= YES
# Корневая директория suExec
SUEXEC_DOCROOT= /
# Cубдиректория пользователя
SUEXEC_USERDIR= www
# Файл лога suExec
SUEXEC_LOGFILE= /var/log/httpd/suexec.log
.endif

После чего ставим софт (подразумевается что установка чистая - иначе вначале снесите php4 и апачу 1.3) на машину. Апач:host% make -C /usr/ports/www/apache20/ install clean

PHP:host% make -C /usr/ports/lang/php5/ install clean

Лезет окошко, где выбираем такие опции - опять же - мне не нужна CLI версия, и я её не выбрал - вам может быть нужна:+----------------------------------------------------------------+
| Options for php5 5.2.3 |
| |
|[ ] CLI Build CLI version |
|[X] CGI Build CGI version |
|[ ] 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 |
+----------------------------------------------------------------+

Также ставим сам модуль mod_fastcgi:host% make -C /usr/ports/www/mod_fastcgi install clean

Проверяем PHP:host% echo '<?php echo "test string "; ?>' | php-cgi
X-Powered-By: PHP/5.2.3
Content-type: text/html

test string
host%

Работает. Раскомментируем строчку установленного модуля в конфиге апача:host% grep " fastcgi_module " /usr/local/etc/apache2/httpd.conf
LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so

После чего в конец конфига апача дописываем такое:# added by lissyara 2007-07-19 in 23:36

# конфиг модуля
<IfModule mod_fastcgi.c>
# конфиг модуля.
# полный список опций - доступен по следующему адресу
# http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
# тут приведены лишь те, которые я заюзал
# -singleThreshold - Целое число, мжду 0 и 100, используеммое
# для определения, может ли быть завершён последний экземпляр
# приложения FastCGI. Если менеджер процессов, вычисляет, что
# фактор загрузки для приложения меньше заданного порога, то
# последний экземпляр завершается. Для работы приложения в
# режиме "idle" долгого времени, вы должны задать значение
# ближе к 1, однако, если более приоритетна память, или время
# CPU, более применимо значение 100. Значение 0 предотвращает
# завершение последнего экземпляра приложения; это - значение
# по умолчанию, и менять его не рекомендуется (особенно, если
# установлена -appConnTimeout)
# -minProcesses - минимальное общее число динамических приложений
# FastCGI, разрешённых к работе в любое время, без убивания
# менеджером процессов.
# -restart - заставляет менеджер процессов повторно запускать
# приложения в случае сбоя (подобно статическим приложениям)
# -idle-timeout - число секунд бездействия приложения FastCGI,
# до прерывания запроса и логгирования события. Таймер бездейстаия
# применяется лишь к долго висящим соединениям приложений FastCGI.
# Если запрос будет находиться в очереди к приложению, но
# приложение не отвечает (путём записи и сброса) в течение этого
# периода, то запрос будет прерван. Если связь с приложением
# успешно завершается, но не завершается с клиентом, (ответ -
# buffered), таймаут не применяется.
# -killInterval - Определяет, как часто менеджером процессов
# применяется политика завершения динамических экземпляров
# приложения. Меньшее число приводит к более агессивной политике,
# большее - к менее агрессивной.
# -autoUpdate - вызывает проверку модулем mod_fastcgi проверку
# времени модификации приложения на диске до обработки каждого
# запроса. Если приложение на диске изменилось, уведомляется
# менеджер процессов и все работающие экземпляры программы
# уничтожаются. Вообще, предпочтительно, чтобы этот тип
# функциональности был встроен в приложение (например, каждый
# 100-й запрос проверяет, есть ли новая версия на диске, и выходит
# если это так). Могут быть ошибки, если эта опция применяется с
# опцией -restart
# -pass-header - имя заголовка запроса HTTP для передачи среде
# request. Эта опция делает доступным содержимое заголовков,
# которые обычно недоступны (например, Authorization) в окружении GCI.
FastCgiConfig -singleThreshold 30 -minProcesses 2 -restart
-idle-timeout 400 -killInterval 200 -autoUpdate
-pass-header HTTP_AUTHORIZATION
# используетс ядля включения враппера
FastCgiWrapper /usr/local/sbin/suexec
# директория где хранятся сокеты
FastCgiIpcDir /var/run/fastcgi
# предпринимаемые для такого типа файлов действия
Action application/x-httpd-fastphp /php-fcgi/php.sh
Action application/x-httpd-php /php-fcgi/php.sh
# добавляем типы файлов - у меня нету типа .php4 .php5 и т.д.
# если у вас есть - добавльте через пробелы в этой строке
AddType application/x-httpd-fastphp .php
# Обработка файлов апачем
<Location /php-fcgi/>
Options ExecCGI FollowSymLinks
SetHandler fastcgi-script
</Location>
</IfModule>

# директория с данными
<Directory "/usr/home/*/www/data">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order deny,allow
Allow from all
</Directory>
# директория скриптов пользователя
<Directory "/usr/home/*/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

# какие файлы считать индексными в директориях
# (выше, в конфиге есть такая же директива - я её закомментил)
DirectoryIndex index.php index.html index.htm

# включаем виртуалхосты основанные на именах
NameVirtualHost *:80

# первый виртуальный хост. Он будет показываться вместо всех
# несконфигирирвоанных виртуалхостов, при обращении к этому серверу
<VirtualHost *:80>
ServerAdmin admin@my-domain.ru
# AliasMatch ^/~([^/]+)(/.*)* /usr/home/$1/data$2
DocumentRoot /usr/home/my-domain/www/data
ServerName host.my-domain.su
SuexecUserGroup my-domain my-domain
Alias /php-fcgi/ /usr/home/my-domain/www/cgi-bin/
CustomLog /var/log/httpd/httpd-access.log combined
ErrorLog /var/log/httpd/httpd-error.log
</VirtualHost>

# остальные сайты. Мне удобней, когда конфиги лежат в одном месте:
Include /usr/local/etc/apache2/configs/*.conf

Эти конфиги повторяют конфиг первого виртуалхоста, который приведён в предыдущем листинге. Где-то в процесе установки, не забываем создать юзера, от которого будет работать дефолтовый виртуалхост. У меня он называется 'my-domain'. Также, для каждого виртуалхоста пишем скрипт такого виду:host% more /usr/home/my-domain/www/cgi-bin/php.sh
#!/bin/sh

PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
#PHP_FCGI_MAX_REQUESTS=5000
#export PHP_FCGI_MAX_REQUESTS

exec /usr/local/bin/php-cgi

Делаем соответствующего пользователя его владельцем, и делаем его исполняемым:host% chown my-domain:my-domain /usr/home/my-domain/www/cgi-bin/php.sh
host% chmod 555 /usr/home/my-domain/www/cgi-bin/php.sh
host%

Добавлям строчки в rc.conf:# apache 2
apache2_enable="YES"

Также, нужно в группу пользователя добавить пользователя www:host% pw groupmod my-domain -m www

Остаются ограничения, описанные в прошлой статье - 16 групп, и, соответтсвенно максимум 15 пользователей. Лечится также - в исходниках ядра правим такую строку:host% grep NGROUPS_MAX /usr/src/sys/sys/syslimits.h

Соответсвенно сюда вписываем нужное число, и пересобираем ядро. (Обещщают с семёрки сделать чтобы менялось штатными средствами, но пока не сделали...) Как вариант - возможно включение ACL на разделе - но это замедлит рбоату с ФС (не пробовал, но по идее должно замедлять :)). Ну и всё. Можно создавать директорию для конфигов отсутствующих пока хостов, и запускать:host% mkdir /usr/local/etc/apache2/configs
host% /usr/local/etc/rc.d/apache2.sh start
Starting apache2.
host% ps -aux | grep http
root 54653 0,0 1,1 4572 2872 ?? Ss 20:09 0:00,02 /usr/local/sbin/httpd
www 54654 0,0 1,1 4512 2828 ?? S 20:09 0:00,00 /usr/local/sbin/httpd
www 54655 0,0 1,2 4580 2904 ?? S 20:09 0:00,00 /usr/local/sbin/httpd
www 54656 0,0 1,2 4580 2904 ?? S 20:09 0:00,00 /usr/local/sbin/httpd
www 54657 0,0 1,2 4580 2904 ?? S 20:09 0:00,00 /usr/local/sbin/httpd
www 54658 0,0 1,2 4580 2904 ?? S 20:09 0:00,00 /usr/local/sbin/httpd
www 54659 0,0 1,2 4580 2904 ?? S 20:09 0:00,00 /usr/local/sbin/httpd
root 54661 0,0 0,2 1520 560 p1 R+ 20:09 0:00,00 grep http
host% ps -aux | grep php-cgi
my-domain 54663 5,1 4,1 17584 10440 ?? S 20:09 0:00,21 /usr/local/bin/php-cgi
my-domain 54662 1,6 2,6 14268 6676 ?? Ss 20:09 0:00,09 /usr/local/bin/php-cgi
my-domain 54664 0,0 2,7 14268 6688 ?? S 20:09 0:00,00 /usr/local/bin/php-cgi
my-domain 54665 0,0 2,7 14268 6688 ?? S 20:09 0:00,00 /usr/local/bin/php-cgi
my-domain 54666 0,0 2,7 14268 6688 ?? S 20:09 0:00,00 /usr/local/bin/php-cgi
root 54669 0,0 0,3 1604 880 p1 S+ 20:09 0:00,00 grep php-cgi
host% sockstat | grep /var/run/fastcg
my-domain php-cgi 54666 0 stream /var/run/fastcgi/dynamic/01922bbd806480551bf38bec
my-domain php-cgi 54665 0 stream /var/run/fastcgi/dynamic/01922bbd806480551bf38bec
my-domain php-cgi 54664 0 stream /var/run/fastcgi/dynamic/01922bbd806480551bf38bec
my-domain php-cgi 54663 0 stream /var/run/fastcgi/dynamic/01922bbd806480551bf38bec
my-domain php-cgi 54662 0 stream /var/run/fastcgi/dynamic/01922bbd806480551bf38bec
www httpd 54654 12 stream /var/run/fastcgi/dynamic/01922bbd806480551bf38bec
host%

Такой листинг вы увидите лишь если будет хоть одно обращение. Иначе - тока работающий апач. В случае любых проблем - уровень логов в конфиге - дебаг, и смотрим логи.

P.S. По итогам пары дней тестирования: Прилично быстрей чем в режиме чистого cgi.

Обновлено: 13.03.2015