Связка Apache + FastCGI + suExec

On 11/09/2013, in Apache, by Алексей Волобуев

Для своих проектов держу свой мини хостинг. В статье будет описано создание связки 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/html

test 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) Интернет

Tagged with:  

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *