Предполагается, что на сервере ещё не установлено ничего, поэтому – сначала устанавливаем 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
, и заменить пользователя и директории.