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 можно почитать здесь:
- suEXEC Support in Apache 1.3
- suEXEC Support in Apache 2.0
- suEXEC Support in Apache 2.2
- suEXEC Support in Apache 2.4
- suEXEC Support in Apache current
Установка 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. Дополнительную инфу по этой теме можно глянуть тут:
- [Solved] mod_fcgid cannot allocate memory - The FreeBSD Forums
- apache2 - mod_fcgid: No space left on device - Server Fault
Если ничего не помогает, то в 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>