Для своих проектов держу свой мини хостинг. В статье будет описано создание связки Apache + suExec + FastCGI на FreeBSD 9.1
Что такое FastCGI можно посмотреть в Wiki.
Механизм suExec, используется для запуска скриптов и CGI-приложений с правами и идентификационными данными пользователя.
Редактируем файл /etc/make.conf, чтобы задать параметры для suExec
nano /etc/make.conf
PORTSDIR?= /usr/ports
apache22_SET+= SUEXEC
# Где будет работать suexec (ещё будет в userdir)
SUEXEC_DOCROOT=/usr/webhost/sites/
# Пользовательские директории, в которых будет работать suexec
SUEXEC_USERDIR=/usr/webhost/sites/*/cgi-bin
SUEXEC_LOGFILE=/var/log/httpd/suexec.log
Переходим в директорию, содержащую порт с Apache 2.2 и устанавливаем
cd /usr/ports/www/apache22
/usr/ports/www/apache22# make install clean
Выбираем следующие опции
SUEXEC
SUEXEC_RSRCLIMIT
SUEXEC_USERDIR
Завершилось, проверяем подхватились ли настройки?
#suexec -V
-D AP_DOC_ROOT=»/usr/webhost/sites/»
-D AP_GID_MIN=1000
-D AP_HTTPD_USER=»www»
-D AP_LOG_EXEC=»/var/log/httpd/suexec.log»
-D AP_SAFE_PATH=»/usr/local/bin:/usr/bin:/bin»
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX=»/usr/webhost/sites/*/cgi-bin»
Создаем директорию и файл логов для suExec
# mkdir /var/log/httpd/
# touch /var/log/httpd/suexec.log
Создаем директории:
Где будут храниться сайты
# mkdir /usr/webhost/sites/
Место хранения файлов конфигурации для Apache
# mkdir /usr/webhost/httpd_configs/
Редактируем конфигурациооный файл Apache
nano /usr/local/etc/apache22/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
В конце добавляю строки
AcceptFilter http none
AcceptFilter https none
Для считывания конфигурационных файлов будущих виртуальных хостов.
Include /usr/webhost/httpd_configs/*.conf
Ставим модуль FastCGI. Я поставил mod_fcgid.
# cd /usr/ports/www/mod_fcgid
/usr/ports/www/mod_fcgid# make install clean
В конце установщик попросил добавить в файл настроек Apache следующие строчки
************************************************************
To enable this module, add something like the following
lines to your server configuration file:LoadModule fcgid_module libexec/apache22/mod_fcgid.so
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
</IfModule>If you are upgrading from mod_fcgid 2.2, you have to rename
the directives you have used in the config files:
http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#upgrade
************************************************************
Добавляю, что просил установщик.
Ставим PHP5.
# cd /usr/ports/lang/php5
/usr/ports/lang/php5# make install clean
Смотрим, чтобы были выбраны опции
│ │+[x] CLI Build CLI version │ │
│ │+[x] CGI Build CGI version │ │
Все остальное по-умолчанию.
Проверяем php-cgi:
# echo '<?php echo "test string \n"; ?>' | php-cgi
X-Powered-By: PHP/5.4.19
Content-type: text/htmltest string
Работает, хорошо.
Для первого виртуального хоста создаем пользователя webuser, группу webuser
Опять настраиваем Apache
nano /usr/local/etc/apache22/httpd.conf
# включаем виртуалхосты основанные на именах
NameVirtualHost *:80
# Первый виртуал-хост
<VirtualHost *:80>
ScriptAlias /cgi-bin/ /usr/webhost/sites/webuser/cgi-bin/
ServerAdmin support@volobuev.su
SuexecUserGroup webuser webuser
DocumentRoot /usr/webhost/sites/webuser/www
ServerName volobuev.su
ServerAlias www.volobuev.su
# Директория пользователя
<Directory /usr/webhost/sites/webuser/www>
Options -Indexes FollowSymLinks MultiViews +ExecCGI
AddHandler fcgid-script .php
FcgidWrapper /usr/webhost/sites/webuser/cgi-bin/php-wrapper .php
AllowOverride All
Order deny,allow
Allow from all
</Directory>
# директория скриптов пользователя
<Directory /usr/webhost/sites/webuser/cgi-bin>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DirectoryIndex index.php index.html index.htm index.shtml
ErrorLog /usr/webhost/sites/webuser/log/error.log
CustomLog /usr/webhost/sites/webuser/log/access.log common
</VirtualHost>
После настройки апача, еще нужно создать иерархию директорий для работы сайта в домашней папке пользователя.
Создадим пользователя и группу webuser, домашняя папка у него будет /usr/webhost/sites/webuser.
Чтобы апач мог получить к этой директории доступ нужно добавить пользователя www в группу пользователя.
Создаем необходимыее папки в домашней директории
# mkdir -p /usr/webhost/sites/webuser/log
# mkdir -p /usr/webhost/sites/webuser/www
# mkdir -p /usr/webhost/sites/webuser/cgi-bin
# mkdir -p /usr/webhost/sites/webuser/tmp
Даём права на эти директории
chown -R webuser:webuser /usr/webhost/sites/webuser/
В папке log будут храниться логи виртуальных хостов, в tmp временные файлы для php, в cgi-bin скрипт и конфиг для php, а в www сами сайты. В папку cgi-bin нужно положить конфиг php.ini, и создать скрипт php-wrapper :
Создаем файлы логов.
# touch /var/log/httpd-error.log
# touch /var/log/httpd-access.log
Создаем файл /usr/local/etc/php-wrapper. Его потом будем копировать для виртуальных хостов.
# nano /usr/local/etc/php-wrapper
#!/bin/sh
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/bin/php-cgi
Копируем его в /usr/webhost/sites/webuser/cgi-bin/
# cp /usr/local/etc/php-wrapper /usr/webhost/sites/webuser/cgi-bin/php-wrapper
Копируем файл с настройками PHP
# cp /usr/local/etc/php.ini-production /usr/webhost/sites/webuser/cgi-bin/php.ini
Редактируем этот файл, вносим нужные изменения для данного виртуальнго хоста.
Так же надо дать скрипту права на запуск. Оба файла должны принадлежать пользователю, но чтобы он не смог их изменить, нужно установить дополнительные атрибуты на эти файлы.
Даем права и меняем владельца:
# chown -R webuser:webuser /usr/webhost/sites/webuser/cgi-bin/
# chmod 700 /usr/webhost/sites/webuser/cgi-bin/php-wrapper
Ставим флаги sunlnk, schg на php.ini
# chflags sunlnk /usr/webhost/sites/webuser/cgi-bin/php.ini
# chflags schg /usr/webhost/sites/webuser/cgi-bin/php.ini
Ставим флаги sunlnk, schg на php-wrapper
# chflags sunlnk /usr/webhost/sites/webuser/cgi-bin/php-wrapper
# chflags schg /usr/webhost/sites/webuser/cgi-bin/php-wrapper
Права на папки и файлы можно раздать с помощью следующей заметки.
Источники:
1) Настройка хостинга под apache + PHP + MySQL
2) Apache2 + php5 + mod_fastcgi
3) Apache + php + (mod_fcgid | mod_fastcgi)
4) Интернет