Настройка SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6

archive view archive save

Настройка SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6 SuExec позволяет выполнять/запускать CGI (PHP 5.3) скрипты/программы внутри веб-каталога от имени конкретного пользователя, которому принадлежит этот веб-каталог, а не от имени пользователя/группы Apache 2.2 от которого работает сам web-сервер Apache 2.2 в CentOS 5,6.

SuExec - это один из способов решить конфликт прав на файлы и каталоги при совместном их использовании между пользователем и веб сервером Apache в CentOS 5,6. Кроме SuExec ещё существует mod_suphp, а также анонирование с группами и установкой umask 002 на процессы httpd, sftp, ftp что позволит выставлять на все файлы 664 и на каталоги 775, что даст возможность предоставить доступ на чтение и запись для файлов пользователя и веб сервера входящего в группу пользователя.

SuExec является частью веб сервера Apache 2.2 и его поддержка активизируется непосредственно при компиляции самого веб сервера Apache 2.2 в CentOS 5,6 примерно следующим образом:

./configure --help
./configure --with-apxs2=/usr/sbin/apxs --enable-suexec --with-suexec-bin=/usr/sbin/suexec \
    --with-suexec-caller=apache --with-suexec-userdir=www --with-suexec-docroot=/home --enable-so
make install clean

Компиляция Apache 2.2 в CentOS 5,6 здесь рассматриваться не будет, ибо нет особого смысла, так как обычно поддержка SuExec уже имеется в распространяемых, скомпилированных версиях Apache для CentOS 5,6, а если кому охота повозиться с компиляцией, то милости просим: How to Install Apache 2.4.2 from Source on CentOS 6.2 with SSL

Полномочия SuExec и сервера в частности ограничены каталогом указанным при компиляции в --with-suexec-docroot=DIR и --with-suexec-userdir=DIR, значение которого по умолчанию равно /var/www и public_html соответственно, а если нам нужно выполнять SuExec в другом (chroot) каталоге/окружении (--with-suexec-docroot=DIR), то нам нужно будет перекомпилировать/переконфигурировать Apache 2.2 с нужными нам настройками/ключами! Полный список ключей смотрим тут: Configure the source tree - Apache HTTP Server

SuExec работает только при выполнении CGI и SSI и для того чтобы PHP 5.3 мог работать под SuExec в CentOS 5,6 нам потребуется наличие php-common, mod_fcgid, httpd скомпилированный с поддержкой SuExec, загрузка модуля mod_suexec.so в конфиге /etc/httpd/conf/httpd.conf, выполнять/подключать PHP 5.3 не как модуль, а как Fast CGI.

Про поддержку SuExec в Apache можно почитать здесь:

Установка php-common, mod_fcgid, httpd в CentOS 5,6

Проверяем и устанавливаем недостающие компоненты:

[root@remotehelp ~]# yum list | grep php-common
php-common.i386 5.3.15-7.el5.art installed
 
[root@remotehelp ~]# yum list | grep mod_fcgid
mod_fcgid.i386 2.3.6-3.el5.art atomic
mod_fcgid-selinux.i386 2.3.5-2.el5.art atomic
 
[root@remotehelp ~]# yum install mod_fcgid
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* atomic: mir01.syntis.net
* base: mirror.netcologne.de
* extras: mirror.netcologne.de
* rpmforge: nl.mirror.eurid.eu
* updates: be.mirror.eurid.eu
Excluding Packages from Red Hat Enterprise Linux 5 - i386 - ATrpms
Finished
Reducing Red Hat Enterprise Linux 5 - i386 - ATrpms to included packages only
Finished
Excluding Packages from Red Hat Enterprise Linux 5 - i386 - ATrpms testing
Finished
Reducing Red Hat Enterprise Linux 5 - i386 - ATrpms testing to included packages
only
Finished
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mod_fcgid.i386 0:2.3.6-3.el5.art set to be updated
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
mod_fcgid i386 2.3.6-3.el5.art atomic 76 k
 
Transaction Summary
================================================================================
Install 1 Package(s)
Upgrade 0 Package(s)
 
Total download size: 76 k
Is this ok [y/N]: y
Downloading Packages:
mod_fcgid-2.3.6-3.el5.art.i386.rpm | 76 kB 00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : mod_fcgid 1/1
 
Installed:
mod_fcgid.i386 0:2.3.6-3.el5.art
 
Complete!
[root@remotehelp ~]#

Если mod_fcgid в вашем репозитории не оказалось, то mod_fcgid можно найти по этим ссылкам mod_fcgid для CentOS 5 и mod_fcgid для CentOS 6. Обычно по умолчанию httpd уже должен быть скомпилирован и установлен с поддержкой SuExec:

[root@remotehelp ~]# httpd -V
Server version: Apache/2.2.3
Server built: Jun 6 2012 10:00:36
Servers Module Magic Number: 20051115:3
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
 
[root@remotehelp ~]# 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 Apache 2.2 под PHP 5.3 ака Fast CGI в CentOS 5,6

ВНИМАНИЕ!!! Неверное подключение и конфигурация PHP 5.3 ака Fast CGI в CentOS 5,6 может дать анонимный доступу к содержимому файлов конфигурации как например conf.php, configuration.php и т.д., отображая их содержимое в браузере или предлагая сохранить на диске!

Если настройка SuExec Apache 2.2 под PHP 5.3 ака Fast CGI в CentOS 5,6 выполняется на рабочем, общедоступном хосте, то перед началом в целях безопасности рекомендуется добавить в конец главного /etc/httpd/conf/httpd.conf файла такие строки:

<FilesMatch "conf[a-z]*\.(php[3-6]*|ini)$">
    Order allow,deny
    Deny from all
</FilesMatch>

Это позволит закрыть доступ (403 - форбайден:) к файлам конфигурации. Добавьте сюда имена и расширения других важных включаемых конфигурационных файлов, к которым не должно быть прямого обращения через браузер.

Теперь когда php-common, mod_fcgid, httpd в CentOS 5,6 установлены, забэкапим php.conf файл с настройками подключения PHP 5.3 как модуля, а на случай утери/удаления php.conf ниже приводится его содержимое:

mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.bak
 
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
<IfModule prefork.c>
    LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
    LoadModule php5_module modules/libphp5-zts.so
</IfModule>
 
#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php
 
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
 
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

Теперь создаём файл fcgid.conf с настройками подключения PHP 5.3 как CGI/FCGI (Fast CGI):

vi /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.html
 
LoadModule fcgid_module modules/mod_fcgid.so
 
# Use FastCGI to process .fcg .fcgi & .fpl scripts
# Don't do this if mod_fastcgi is present, as it will try to do the same thing
<IfModule mod_fcgid.c>
    DirectoryIndex index.php index.phtml
 
    PHP_Fix_Pathinfo_Enable 1
    IPCCommTimeout 180
    MaxProcessCount 150
    DefaultMaxClassProcessCount 15
    DefaultMinClassProcessCount 5
 
    Alias /fcgi-bin/ /var/www/cgi-bin/
    <Location /fcgi-bin/>
        SetHandler fcgid-script
        Options +ExecCGI
    </Location>
 
    AddHandler php-fcgi .php .php3 .php4 .php5 .phtml
    Action php-fcgi /fcgi-bin/php-fcgi-wrapper
    FCGIWrapper /var/www/cgi-bin/php-fcgi-wrapper .php
 
    # Sane place to put sockets and shared memory file
    SocketPath /var/run/mod_fcgid
    SharememPath /var/run/mod_fcgid/fcgid_shm
</IfModule>

Создадим fcgi wrapper (обертка) по умолчанию:

# vi /var/www/cgi-bin/php-fcgi-wrapper
#!/bin/sh
export PHPRC=/etc
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=1
exec /usr/bin/php-cgi
 
# chmod 755 /var/www/cgi-bin/php-fcgi-wrapper

Дира /etc/httpd/conf.d/ предназначена для файлов конфигурации модулей/демонов Apache и там лучше не хранить файлы конфигурации для виртуальных хостов - мало ли чего шальные ручонки там могут удалить!:) Немного подправим главный /etc/httpd/conf/httpd.conf уберём оттуда виртуальный хост по умолчанию в отдельную директорию /etc/httpd/conf.v, которую создадим специально под файлы конфигурации виртуальных хостов, а в конец /etc/httpd/conf/httpd.conf добавим Include conf.v/*.conf для авто подключения всех файлов настройки виртуальных хостов:

mkdir /etc/httpd/conf.v
vi /etc/httpd/conf.v/default.conf
 
NameVirtualHost *:81
 
<VirtualHost *:81>
    ServerAdmin support@remotehelp.pp.ua
    DocumentRoot /var/www/html/
    ServerName localhost
    <Directory /var/www/html/>
        AllowOverride All
    </Directory>
</VirtualHost>

Теперь добавим пользователя, создадим каталог для пользователя, веб каталог public_html, каталог для лог файлов, каталог под fcgi wrapper (обертка), создадим сам fcgi wrapper (обертка), пользовательский php.ini и присвоим всему этому делу соответствующих хозяина и группу:

# Add user
adduser wrs
 
# Create directory
mkdir /var/www/wrs /var/www/wrs/public_html /var/www/wrs/logs /var/www/wrs/php
 
# Create fcgi wrapper
vi /var/www/wrs/php/php-fcgi-wrapper
 
#!/bin/sh
export PHPRC=/var/www/wrs/php
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=1
exec /usr/bin/php-cgi
 
# Create user php.ini
touch /var/www/wrs/php/php.ini
chown -R root:wrs /var/www/wrs/php/php.ini
chmod 640 /var/www/wrs/php/php.ini
 
# Set user permission
chown -R wrs:wrs /var/www/wrs
chmod 750 /var/www/wrs/php/php-fcgi-wrapper

Создаём файл wrs.conf настройки виртуального хоста:

 

Секция с настройками виртуального хоста скрыта от гостей, чтоб гостям жизнь мёдом не казалась!:)) Теперь ещё нужно создать wrs.conf файл конфигурации для Nginx, проверить конфигурацию и перезапустить сервера:

[root@remotehelp ~]# vi /etc/nginx/conf.d/wrs.conf
 
server {
    limit_conn addr 10;
    listen 80;
    server_name itadmin.org.ua www.itadmin.org.ua;
 
    #charset koi8-r;
 
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|mp3|zip|rar|gz|tgz)$
    {
        expires 1d;
        add_header Cache-Control public;
        proxy_pass http://localhost:81;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
 
    location / 
    {
        proxy_pass http://localhost:81;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
 
    #error_page 404 /404.html;
 
    #location = /404.html {
    # root /usr/share/nginx/html;
    #}
 
    # redirect server error pages to the static page /50x.html
    #
    #error_page 500 502 503 504 /50x.html;
    #location = /50x.html {
    # root /usr/share/nginx/html;
    #}
 
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    # proxy_pass http://127.0.0.1;
    #}
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    # root html;
    # fastcgi_pass 127.0.0.1:9000;
    # fastcgi_index index.php;
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # include fastcgi_params;
    #}
 
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    # deny all;
    #}
}
 
[root@remotehelp ~]# httpd -t
Syntax OK
 
[root@remotehelp ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 
[root@remotehelp ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[root@remotehelp ~]# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
[root@remotehelp ~]#

Проверка работоспособности SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6

Для проверки работоспособности SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6 создаём в веб каталоге /var/www/wrs/public_html файл, например test.php такого содержания:

<?php 
echo "I am running as user=";
system("whoami");
echo "<P>I can write here= ";
system("pwd");
$fname="write_test.txt";
if (file_exists($fname)) {
    echo "<P> I found file $fname and will delete it";
    unlink($fname);
    echo "...Done";
}
echo "<P>I'm writing new file $fname";
system ("touch $fname");

Открываем в браузере наш виртуальный хост itadmin.org.ua, или как он там у вас называется, и если видим такой результат:

I am running as user=wrs 
 
I can write here= /var/www/wrs/public_html 
 
I'm writing new file write_test.txt

то это значит, что настройка SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6 прошла успешно, а для подтверждения выполняем:

[root@remotehelp ~]# ls -la /var/www/wrs/public_html
total 16
drwxr-xr-x 2 wrs wrs 4096 Aug 19 13:47 .
drwxr-xr-x 5 wrs wrs 4096 Aug 19 11:02 ..
-rw-r--r-- 1 wrs wrs 17 Aug 19 09:02 index.html
-rw-r--r-- 1 wrs wrs 334 Aug 19 09:55 index.php
-rw-r--r-- 1 wrs wrs 0 Aug 19 13:47 write_test.txt

Ещё раз убеждаемся, что настройка SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6 прошла успешно, тестовый файл write_test.txt создан с правильными правами wrs:wrs, а не apache:apache, теперь же просто радуемся:))

Проблемы с настройкой SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6

Бывает, что что-то, где-то закосячило или руки или файлы или ещё что случилось приключилось и фокус с настройкой SuExec в Apache 2.2 не удался;( Ниже перечислены известные проблемы с настройкой SuExec в Apache 2.2.

Неизвестно почему SuExec в Apache 2.2 не работает!;((

Откройте /var/log/httpd/error_logи поищите там строку [notice] suEXEC mechanism enabled (wrapper: /path/to/suexec), где /path/to/suexec полный путь к SuExec, обчно в CentOS 5,6 это /usr/sbin/suexec. Если такой строки там не наблюдается, то возможно на /usr/sbin/suexec нет root привилегий или нет доступа для apache - Configuring & Installing suEXEC, Enabling & Disabling suEXEC. Должно выглядеть примерно так:

[root@remotehelp ~]# ls -la /usr/sbin/suexec
-r-s--x--- 1 root apache 11608 Jun 6 18:04 /usr/sbin/suexec
 
или же:
 
[root@remotehelp ~]# chgrp apache /usr/sbin/suexec
[root@remotehelp ~]# chmod 4750 /usr/sbin/suexec
[root@remotehelp ~]# ls -la /usr/sbin/suexec
-rwsr-x--- 1 root apache 11608 Jun 6 18:04 /usr/sbin/suexec

(104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server

В лог файлы /var/log/httpd/error_log и /var/log/httpd/suexec.log получаем мессаги:

/var/log/httpd/error_log

[Sun Aug 19 09:32:07 2012] [warn] [client 127.0.0.1] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
[Sun Aug 19 09:32:07 2012] [error] [client 127.0.0.1] Premature end of script headers: php-fcgi
................

/var/log/httpd/suexec.log

[2012-08-19 09:32:07]: uid: (5004/wrs) gid: (5005/5005) cmd: php-fcgi
[2012-08-19 09:32:07]: target uid/gid (5004/5005) mismatch with directory (0/0) or program (0/0)
................

Либо отсутствует каталог /var/www/wrs/php/ для FCGIWrapper /var/www/wrs/php/php-fcgi-wrapper или же на него нет соответствующих полномочий chown -R wrs:wrs /var/www/wrs и chmod 750 /var/www/wrs/php/php-fcgi-wrapper

Can't create shared memory for size 1200712 bytes

Проблемы с распределением памяти, в /var/log/httpd/error_log нам пишут:

[Mon Aug 20 03:41:28 2012] [emerg] (2)No such file or directory: mod_fcgid: Can't create shared memory for size 1200712 bytes

Причин может быть много, от нехватки памяти до проблем с модулями. Возможно нет прав для веб сервера на каталог /var/run/mod_fcgid. Хозяином каталога должен быть apache и иметь права 755. Дополнительную инфу по этой теме можно глянуть тут:

Если ничего не помогает, то в fcgid.conf вместо run/mod_fcgid указываем полный путь /var/run/mod_fcgid :))

# Sane place to put sockets and shared memory file
SocketPath /var/run/mod_fcgid
SharememPath /var/run/mod_fcgid/fcgid_shm
# или
FcgidIPCDir /var/run/mod_fcgid
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm

Непобеждаемое Warning: mktime() [function.mktime]

Warning: mktime() [function.mktime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Moscow' for 'MSK/4.0/no DST' instead in /var/www/.../public_html/libraries/joomla/utilities/date.php on line 117

phpinfo(); говорит что файл /var/www/wrs/php/php.ini используется и физически присутствует в /var/www/wrs/php/, date.timezone установлена в date.timezone = "Europe/Kiev", а лыжи всё равно не едут!;( Не едут лыжи потому, что хозяином php.ini должен быть root и группа пользователя:

chown root:wrs /var/www/wrs/php/php.ini

mod_fcgid: HTTP request length 134743 (so far) exceeds MaxRequestLen (131072), referer: ....

В браузер получаемHTTP 500 — Внутренняя ошибка сервера, а в error_log сервера получаем ошибку:

[Wed Sep 12 09:17:39 2012] [warn] [client 94.27.108.90] mod_fcgid: HTTP request length 134743 (so far) exceeds MaxRequestLen (131072), referer: http://.....

Эта ошибка возникает при попытке передачи, например из форм, больших объемов данных. По умолчанию значение директивы FcgidMaxRequestLen (MaxRequestLen) равно FcgidMaxRequestLen 131072. Для устранения ошибки в конфигурацию виртуального хоста или в главный конфиг сервера нужно добавить:

<IfModule mod_fcgid.c>
    FcgidMaxRequestLen 1000000
</IfModule>
 
или:
 
<IfModule mod_fcgid.c>
    MaxRequestLen 1000000
</IfModule>

Полезные ссылки по настройке SuExec Apache 2.2 + Nginx под PHP 5.3 ака Fast CGI в CentOS 5,6

Автор: Олег Головский


Об авторе
АдМинь БагоИскатель
АдМинь БагоИскатель ярый борец за безглючную работу любых механизмов и организмов во всей вселенной и потому пребывает в вечном поиске всяческих багов, а тот кто ищет как известно всегда находит. Когда что-то или кого-то вылечить не в состоянии, то со словами "Я в аду, а вы все черти" уходит в запой выйдя из которого снова берётся лечить неизлечимое.
Ещё статьи автора
Комментарии в блоге
Новое на форуме