Установка Apache2 с mod_fcgid и PHP5 в Fedora 14

Содержание материала

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

FedoraЭто руководство описывает, как Вы можете установить Apache2 с mod_fcgid и PHP5 на Fedora 14. mod_fcgid является совместимой альтернативой старшего mod_fastcgi. Это позволяет выполнять PHP -скрипты с разрешения их владельцев, а не пользователя Apache.

Предварительные замечания

В данном учебном материале я использую сервера на Fedora 14 с именем хоста server1.example.com и IP-адрес 192.168.1.101. В этом учебнике я создам два виртуальных домена Apache, www.example1.com и www.example2.com , чтобы продемонстрировать использование mod_fcgid. Прежде чем начать, убедимся, что SELinux отключен. Откроем /etc/selinux/config ...

  • nano /etc/selinux/config

... и проверим SELINUX на отключение :

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Выполним:

  • setenforce 0

... чтобы изменения вступили в силу.

Установка Apache2 / mod_fcgi / PHP5

Мы можем установить Apache2, mod_fcgid, и PHP5 следующим образом:

  • yum install httpd mod_fcgid php-cli

Если Apache2 уже был установлен с PHP5 как модуль Apache, отключим модуль PHP5 сейчас - откроем /etc/httpd/conf.d/php.conf ...

  • nano /etc/httpd/conf.d/php.conf

... и закомментировать все в этом файле:

#
# 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

Затем мы создаем авто запуск с системой для Apache и запустим его:

  • chkconfig --levels 235 httpd on
  • /etc/init.d/httpd restart

Далее мы откроем /etc/php.ini ...

  • nano /etc/php.ini

... и раскомментировуем строку cgi.fix_pathinfo = 1 :

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]

Откроем /etc/httpd/conf.d/fcgid.conf ...

  • nano /etc/httpd/conf.d/fcgid.conf

... и добавьте строку PHP_Fix_Pathinfo_Enable 1 (эта строка не должна входить в <VirtualHost> раздел, потому что тогда Вы получите сообщение об ошибке: PHP_Fix_Pathinfo_Enable cannot occur within <VirtualHost> section) :

# 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
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

PHP_Fix_Pathinfo_Enable 1

Затем перезагрузите Apache:

  • /etc/init.d/httpd reload

Создание виртуальных хостов

Сейчас я создам два виртуальных домена, www.example1.com (с корнем документа в /var/www/web1/web ) и www.example2.com (с корнем документа в /var/www/web2/web ). www.example1.com будет принадлежать пользователю и группе web1, а www.example2.com к пользователю и группе web2.

Сначала мы создаем пользователей и группы:

  • groupadd web1
  • groupadd web2
  • useradd -s /bin/false -d /var/www/web1 -m -g web1 web1
  • useradd -s /bin/false -d /var/www/web2 -m -g web2 web2
  • chmod 755 /var/www/web1
  • chmod 755 /var/www/web2

Затем мы создаем корневые каталоги и сделать их принадлежащих пользователям / группам web1 и web2:

  • mkdir -p /var/www/web1/web
  • chown web1:web1 /var/www/web1/web
  • mkdir -p /var/www/web2/web
  • chown web2:web2 /var/www/web2/web

Мы будет работать с PHP использую Suexec; Suexec корневым документом /var/www, как показано в следующей команде:

  • /usr/sbin/suexec -V
[root@localhost ~]# /usr/sbin/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"
[root@localhost ~]#

Поэтому мы не можем вызывать PHP файлы (/usr/lib/cgi-bin/php) напрямую, потому что они располагаются за пределами корневой директории suExec. Так как suExec не позволяет создавать символические ссылки, единственным способом решения проблемы является создание «скрипта - обертки» для каждого сайта в подкаталогах /var/www. «Скрипт – обертка» затем будет вызывать PHP файлы /usr/lib/cgi-bin/php. «Скрипт - обертка» должен принадлежать пользователю и группе каждого сайта, поэтому нам необходим «скрипт – обертка» для каждого сайта. Я создам «скрипт - обертку» в подкаталогах /var/www/php-fcgi-scripts, например /var/www/php-fcgi-scripts/web1 и /var/www/php-fcgi-scripts/web2. Выполняем следующие команды:

  • mkdir -p /var/www/php-fcgi-scripts/web1
  • mkdir -p /var/www/php-fcgi-scripts/web2
  • nano /var/www/php-fcgi-scripts/web1/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi
  • nano /var/www/php-fcgi-scripts/web2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

Строка PHPRC указывает на каталог, где находится файл php.ini (/etc/php5/cgi/ переводится как /etc/php5/cgi/php.ini). PHP_FCGI_MAX_REQUESTS э то максимальное число запросов, после чего fcgid процесс запускается и создается новый. PHP_FCGI_CHILDREN определяет количество PHP файлов, которые будут запущенны.

Скрипты php-fcgi-starter должны выполняться и они (и каталоги где они находятся) должны принадлежать пользователю и группе сайта. Выполняем следующие команды:

  • chmod 755 /var/www/php-fcgi-scripts/web1/php-fcgi-starter
  • chmod 755 /var/www/php-fcgi-scripts/web2/php-fcgi-starter
  • chown -R web1:web1 /var/www/php-fcgi-scripts/web1
  • chown -R web2:web2 /var/www/php-fcgi-scripts/web2

Теперь мы создаем через Apache виртуальные домены для www.example1.com и www.example2.com:

  • nano /etc/httpd/conf/httpd.conf
[...]
NameVirtualHost *:80

<VirtualHost *:80>
  ServerName www.example1.com
  ServerAlias example1.com
  ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  DocumentRoot /var/www/web1/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web1 web1
    <Directory /var/www/web1/web/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/web1/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

<VirtualHost *:80>
  ServerName www.example2.com
  ServerAlias example2.com
  ServerAdmin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  DocumentRoot /var/www/web2/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web2 web2
    <Directory /var/www/web2/web/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/web2/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

Убедитесь, что Вы правильно указали пути (и правильно пользователей и групп в SuexecUserGroup строках). После чего перезапустим Apache:

  • /etc/init.d/httpd reload

Тестирование

Теперь мы создадим небольшой php файл (info.php), к примеру для сайта www.example1.com:

Создаем файл:

  • nano /var/www/web1/web/info.php
<?php
phpinfo();
?>

И теперь перейдем в браузере по адресу http://www.example1.com/info.php. Если все выполнено правильно, то Вы увидите вот такую страницу и в строке Server API увидите CGI/FastCGI.

mod_fcgid в Fedora 14

Пользовательских php.ini для каждого веб-сайта

Так как каждый Web сайт имеет свой собственный php-fcgi-starter скрипт, то можно определить различные php.ini файлы для различных Web сайтов. Чтобы продемонстрировать это, я буду копировать php.ini по умолчанию ( /etc/php.ini ) в /var/www/web2/ каталог и сделаю php.ini выполняемым для www.example2.com из /var/www/web2/ каталога:

  • cp /etc/php.ini /var/www/web2/
  • chown web2:web2 /var/www/web2/php.ini

(Теперь Вы можете изменить /var/www/web2/php.ini как Вам нравится.)

Тогда мы открываем /var/www/php-fcgi-scripts/web2/php-fcgi-starter ...

  • nano /var/www/php-fcgi-scripts/web2/php-fcgi-starter

... и посестим /var/www/web2/ в PHPRC строку:

#!/bin/sh
PHPRC=/var/www/web2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

Перезапустим Apache

  • /etc/init.d/httpd reload

Создадим новый phpinfo(); файл для www.example2.com ...

  • nano /var/www/web2/web/info.php
<?php
phpinfo();
?>

Переходим в браузере по адресу http://www.example1.com/info.php. Если все выполнено правильно, то Вы увидите вот такую страницу и в строке Server API увидите CGI/FastCGI.

mod_fcgid в Fedora 14


Обмениваться, хранить, передавать Ваши файлы стало просто как никогда.
yandex-disk
Читать подробнее: для чего Yandex-Диск проекту Mini-Server. Практика установки, настройки и использования сетевого хранилища на Ubuntu server LTS 12.04 в статье Резервное копирование сервера Ubuntu на Яндекс Диск.

>> Ubuntu 12.04 + Nginx Скачать сервер
>> Fedora 15 Скачать сервер
>> Простой Debian 6.0.6 Скачать сервер
>> CentOS 6.0 и
+ (5.6) другой
Скачать сервер
>> OpenSUSE 11.4
MAX
Скачать сервер

Вход на сайт

ВНИМАНИЕ!

Регистрация на сайте только по согласованию с администратором ресурса. Обращаться через форму обратной связи.