Предполагается, что на сервере ещё не установлено ничего, поэтому – сначала устанавливаем Epel (т.к. в base нет mod_fcgid
).
Отключаем SELinux.
Устанавливаем набор (+ модули php
по своему вкусу):
# rpm -qa | grep -iE "http|mod_fcgid|php*"
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
Copyright © 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2010 Zend Technologies
# php -v
Copyright © 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2010 Zend Technologies
Server version: Apache/2.2.15 (Unix)
Server built: Apr 3 2014 23:56:16
# chkconfig httpd on# chkconfig --list | grep httpdhttpd 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
общий вид:
cat /etc/httpd/conf.d/fcgid.conf
# This is the Apache server configuration file for providing FastCGI support
# through mod_fcgid
#
# Documentation is available at
# http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.htmlLoadModule fcgid_module modules/mod_fcgid.so# Use FastCGI to process .fcg .fcgi & .fpl scripts
AddHandler fcgid-script fcg fcgi fpl# Sane place to put sockets and shared memory file
FcgidIPCDir /var/run/mod_fcgid
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shmDirectoryIndex index.php
PHP_Fix_Pathinfo_Enable 1
Кроме того, редактируем файл /etc/php.ini
, находим и раскомментируем в нём строку:
cgi.fix_pathinfo=1
Настраиваем обработчик (“wrapper“, тут скорее не обработчик, а правильнее “обёртка”, но так проще) FastCGI
.
Проверяем настройки suEXEC
:
# suexec -V
-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
, тогда как файлы будут принадлежать пользователю user1
).
Параметр AP_DOC_ROOT
указывает на рабочую директорию suEXEC
. Тогда как php-cgi
расположен в директории /usr/bin
:
# which php-cgi
/usr/bin/php-cgi
Следовательно – suEXEC
не сможет напрямую вызывать php-cgi
.
Для того, что бы он смог корректно работать – создадим обработчик.
Так как для каждого пользователя (aka сайта) потребуется файл отдельный файл-обработчик (т.к. он должен приндалжеать пользователю, php
-скрипты которого будут обрабатываться FastCGI
) – то создадим отдельную директорию, в которой будем хранить эти файлы:
# mkdir /var/www/user1
И в ней – каталог для первого сайта:
# mkdir /var/www/user1/php-cgi/
В каталоге создаём файл /var/www/user1/php-cgi/php.cgi с таким содержанием:
#!/bin/sh
PHPRC=/var/www/user1/php-cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=500
exec /usr/bin/php-cgi
Строка PHPRC
тут задаёт путь поиска файла php.ini
. Можно изменить её на /var/www/user1/php-cgi/ и создать в нём отдельную копию php.ini
с настройками под этот конкретный сайт.
Обязательно устанавливаем права и владельца:
# chmod 755 /var/www/user1/php-cgi/php.cgi
# chown -R user1:user1 /var/www/user1/php-cgi/
Создаём каталоги и файлы
Предполагается, что пользователь у нас уже есть.
Нам нужен каталог для файлов сайта:
# mkdir -p /var/www/user1/site/test.t/
В каталог /var/www/user1/site/test.t/ помещаем пока один файл – index.php
с таким содержимым:
<?php echo phpinfo(); ?>
Меняем пользователя:
# chown -R user1:user1 /var/www/user1/site/test.t/
Создаём файлы логов:
# touch /var/www/user1/logs/test.t.access.log
# touch /var/www/user1/logs/test.t.error.log
Создаём файл описания виртаулхоста /etc/httpd/conf.d/test.t.conf с таким содержимым:
<VirtualHost *:8080>
ServerAdmin webmaster@test.t
DocumentRoot /var/www/user1/site/test.t
ServerName test.t
ServerAlias www.test.t
ErrorLog /var/www/user1/logs/test.t.error.log
CustomLog /var/www/user1/logs/test.t.access.log common
<IfModule mod_fcgid.c>
SuexecUserGroup user1 user1
<Directory /var/www/user1/site/test.t>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/user1/php-cgi/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/www/user1/logs/test.t.access.log
____________________
Чтобы с сайта можно было скачать файл с определённым расширением, добавим в .htaccess следующую запись:
AddType application/octet-stream .doc .pdf .sh
теперь файлы с данным расширением будут скачиваться