установка Apache HTTP + suEXEC + mod_fcgid

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

Thank you for reading this post, don't forget to subscribe!

Отклю­ча­ем SELinux.

Уста­нав­ли­ва­ем набор (+ моду­ли 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 © 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2010 Zend Technologies

# php -v

PHP 5.3.3 (cli) (built: Dec 11 2013 03:29:57)
Copyright © 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright © 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

общий вид:

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_shm

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, тогда как фай­лы будут при­над­ле­жать поль­зо­ва­те­лю 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
теперь фай­лы с дан­ным рас­ши­ре­ни­ем будут скачиваться