Apache HTTP: установка с suEXEC и mod_fcgid на CentOS

Автор: | 07/04/2014
 

Предполагается, что на сервере ещё не установлено ничего, поэтому — сначала устанавливаем Epel (т.к. в base нет mod_fcgid).

Отключаем SELinux.

Настройка выполняется на:

# cat /etc/redhat-release
CentOS release 6.5 (Final)

 

Устанавливаем набор (+ модули php по своему вкусу):

# yum -y install httpd php-common mod_fcgid php-cgi php

Проверяем:

# rpm -qa | grep -iE "http|mod_fcgid|php*"
php-common-5.3.3-27.el6_5.x86_64
php-5.3.3-27.el6_5.x86_64
php-cli-5.3.3-27.el6_5.x86_64
httpd-tools-2.2.15-30.el6.centos.x86_64
httpd-2.2.15-30.el6.centos.x86_64
mod_fcgid-2.3.9-1.el6.x86_64
# php-cgi -v
PHP 5.3.3 (cgi-fcgi) (built: Dec 11 2013 03:28:11)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

# php -v
PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built: Apr 3 2014 23:56:16

Добавляем Apache HTTP в автозагрузку:

# chkconfig httpd on
# chkconfig --list | grep httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

И приступаем к настройке.

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

# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.bkp

Помимо других настроек — php.conf добавлял index.php как индексный файл для сайтов, что мы ходим схранить.

Редактируем файл /etc/httpd/conf.d/fcgid.conf, и в него добавляем:

DirectoryIndex index.php

И строку:

PHP_Fix_Pathinfo_Enable 1

Кроме того, редактируем файл /etc/php.ini, находим и раскомментируем в нём строку:

cgi.fix_pathinfo=1

Настраиваем обработчик («wrapper«, тут скорее не обработчик, а правильнее «обёртка», но так проще) FastCGI.

Проверяем настройки suEXEC:

# suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"

Кратко — suEXEC позволяет Apcahe HTTP серверу запускать CGI и SSI сценарии под пользователем, отличным от пользователя самого веб-сервера (в данном случае — Apache HTTP работает под пользователем apache, тогда как файлы будут принадлежать пользователю setevoy).

Параметр AP_DOC_ROOT указывает на рабочую директорию suEXEC. Тогда как php-cgi  расположен в директории /usr/bin:

# which php-cgi
/usr/bin/php-cgi

Следовательно — suEXEC не сможет напрямую вызывать php-cgi.

Для того, что бы он смог корректно работать — создадим обработчик.

Так как для каждого пользователя (aka сайта) потребуется файл отдельный файл-обработчик (т.к. он должен приндалжеать пользователю, php-скрипты которого будут обрабатываться FastCGI) — то создадим отдельную директорию, в которой будем хранить эти файлы:

# mkdir /var/www/php-cgi

И в ней — каталог для первого сайта:

# mkdir /var/www/php-cgi/setevoy.org.ua

В каталоге создаём файл /var/www/php-cgi/setevoy.org.ua/php.cgi с таким содержанием:

#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=500
exec /usr/bin/php-cgi

Строка PHPRC тут задаёт путь поиска файла php.ini. Можно изменить её на /var/www/php-cgi/setevoy.org.ua/ и создать в нём отдельную копию php.ini с настройками под этот конкретный сайт.

В некоторых документах рекомендуется устанавливать параметр export PHP_FCGI_CHILDREN=4, но пока решено обойтись без него (вот тут>>> есть интересные наблюдения на эту тему).

Обязательно устанавливаем права и владельца:

# chmod 755 /var/www/php-cgi/setevoy.org.ua/php.cgi
# chown -R setevoy:setevoy /var/www/php-cgi/setevoy.org.ua

Создаём каталоги и файлы

Предполагается, что пользователь у нас уже есть.

Нам нужен каталог для файлов сайта:

# mkdir -p /var/www/vhosts/setevoy.org.ua

В каталог /var/www/vhosts/setevoy.org.ua помещаем пока один файл — index.php с таким содержимым:

<?php echo phpinfo(); ?>

Меняем пользователя:

# chown -R setevoy:setevoy /var/www/vhosts/setevoy.org.ua

Создаём файлы логов:

# touch /var/log/httpd/setevoy.org.ua-error.log
# touch /var/log/httpd/setevoy.org.ua-access.log

Создаём файл описания виртаулхоста /etc/httpd/conf.d/setevoy.org.ua.conf с таким содержимым:

<VirtualHost 77.***.***.20:80>
    DocumentRoot /var/www/vhosts/setevoy.org.ua
    ServerName setevoy.org.ua
    ServerAlias www.setevoy.org.ua
    CustomLog /var/log/httpd/setevoy.org.ua-access.log combined
    ErrorLog /var/log/httpd/setevoy.org.ua-error.log

    <IfModule mod_fcgid.c>
        SuexecUserGroup setevoy setevoy
        <Directory /var/www/vhosts/setevoy.org.ua>
                Options +ExecCGI
                AllowOverride All
                AddHandler fcgid-script .php
                FCGIWrapper /var/www/php-cgi/setevoy.org.ua/php.cgi .php
                Order allow,deny
                Allow from all
        </Directory>
    </IfModule>
</VirtualHost>

Проверяем синтаксис:

# httpd -t
Syntax OK

Запускаем:

# service httpd start
Starting httpd: [ OK ]

И вспоминаем, что забыли открыть 80 порт на фаерволе 🙂

Проверяем текущий список правил:

# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
...
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

REJECT у нас идёт под номером 5, значит правило добавляем перед ним — то есть с тем же номером:

# iptables -I INPUT 5 -p tcp --dport 80 -m state --state NEW -j ACCEPT

Сохраняем:

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

И проверяем сайт, логи:

# tail -f /var/log/httpd/setevoy.org.ua-error.log

и:

# tail -f /var/log/httpd/error_log
[Thu Jul 03 19:33:46 2014] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Jul 03 19:33:46 2014] [notice] Digest: generating secret for digest authentication ...
[Thu Jul 03 19:33:46 2014] [notice] Digest: done
[Thu Jul 03 19:33:46 2014] [notice] Apache/2.2.15 (Unix) DAV/2 mod_fcgid/2.3.9 configured -- resuming normal operations

suEXEC mechanism enabled — работает, ошибок нет.

Краткий HowTo для добавления новых сайтов:

# mkdir /var/www/php-cgi/newsite.com

# vim /var/www/php-cgi/newsite.com/php.cgi

# chmod 755 /var/www/php-cgi/newsite.com/php.cgi

# useradd newsite

# chown -R newsite:newsite /var/www/php-cgi/newsite.com/

# mkdir -p /var/www/vhosts/newsite.com

# echo "<?php echo phpinfo(); ?>" > /var/www/vhosts/newsite.com/index.php

# chown -R newsite:newsite /var/www/vhosts/newsite.com/

# touch /var/log/httpd/newsite.com-access.log

# touch /var/log/httpd/newsite.com-error.log

# cp /etc/httpd/conf.d/setevoy.org.ua.conf /etc/httpd/conf.d/newsite.com.conf

Отредактировать /etc/httpd/conf.d/newsite.com.conf, и заменить пользователя и директории.