avatar Ubuntu Настройка WEB сервера: Apache,PHP(с использованием mod_fcgid) в Ubuntu 10.04

В статье рассказывается, как установить web сервер Apache2 c mod_fcgid и PHP5 на ubuntu 10.04
mod_fcgid –является более современной альтернативой mod_fastcgi. Одним из его неоспоримых полюсов, это возможность выполнять php скрипы с правами владельца скрипта, а не пользователя от имени которого работает Apache.

Подготовка:
Для примера будет использоваться Ubuntu 10.04 с установленными последними обновлениями. Также в качестве наглядности будет подняты виртуальные хосты с именами example1.org и example2.org

Заходим в систему как root:
sudo su


Перенастраиваем пакет dash

dpkg-reconfigure dash

В открывшимся окне выбираем НЕТ

dash

Для нормальной работы, нам необходимо остановить и затем и убрать из системы AppArmor:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
aptitude remove apparmor apparmor-utils


Устанавливаем необходимые пакеты – Apache, PHP5, mod_fcgi
aptitude install apache2 php5-cgi libapache2-mod-fcgid apache2-suexec


Лирическое отступление, если в вашей системе уже установлен Apache2 с PHP5, то нам необходимо отключить модуль PHP.
Теперь нам необходимо активировать –mod_rewrite, suexec, include, fcgid

a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid


редактируем файл /etc/php5/cgi/php.ini

nano /etc/php5/cgi/php.ini


найти и снять комментарий со строки
cgi.fix_pathinfo=1
сохраняем изменения, выходим
Далее нам необходимо отредактировать файл /etc/apache2/mods-available/fcgid.conf

nano /etc/apache2/mods-available/fcgid.conf


Необходимо добавить строку PHP_Fix_Pathinfo_Enable 1
Чтобы секция <IfModule mod_fcgid.c> выглядила как указано ниже ( в отличии от предыдущих версий ubuntu)

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
  PHP_Fix_Pathinfo_Enable 1
</IfModule>


Перезапускаем Apache
/etc/init.d/apache2 restart

Если все прошло без ошибок идем дальше.

Создаем виртуальные хосты для сайтов: example1.org и example2.org
Для начала, добавим в систему новых пользователей и группы, отключив им доступ к командной строке (в целях безопасности)

groupadd example1
groupadd example2
useradd -s /bin/false -d /var/www/example1 -m -g example1 example1
useradd -s /bin/false -d /var/www/example2 -m -g example2 example2


Создадим домашние директории нашим пользователям
mkdir -p /var/www/example1/web
chown example1:example1 /var/www/example1/web
mkdir -p /var/www/example2/web
chown example2:example2 /var/www/example2/web


Попробуем запустить PHP используя suExec с помощью команды:
/usr/lib/apache2/suexec –V

Должно выдать, то что указано ниже, корневая директория WEB сервера находится /var/www/

  • root@ubuntu:/home/admin# /usr/lib/apache2/suexec -V
  • -D AP_DOC_ROOT="/var/www"
  • -D AP_GID_MIN=100
  • -D AP_HTTPD_USER=«www-data»
  • -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
  • -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
  • -D AP_UID_MIN=100
  • -D AP_USERDIR_SUFFIX=«public_html»
  • root@ubuntu:/home/admin#

Для справки:
Данная система не может использовать бинарнарники, которые находятся в /usr/lib/cgi-bin/php т.к. они находятся вне корневой директории сайта. suExec-не поддерживает использование символических ссылок (symlinks) по этому мы будем создавать для каждого сайта отдельную директорию для выполнения скриптов, хозяином которой будет являться пользователь, от имени которого эти скрипты выполняются.

mkdir -p /var/www/php-fcgi-scripts/example1
mkdir -p /var/www/php-fcgi-scripts/example2


nano /var/www/php-fcgi-scripts/example1/php-fcgi-starter

Добавляем в него следующее содержимое

#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php


Для второго сайта тоже самое:
nano /var/www/php-fcgi-scripts/example2/php-fcgi-starter


#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php


php-fcgi-starter скрипт должен быть исполняемым, а директории в которых он находится, должны быть открыты для записи.
chmod 755 /var/www/php-fcgi-scripts/example1/php-fcgi-starter
chmod 755 /var/www/php-fcgi-scripts/example2/php-fcgi-starter
chown -R example1:example1 /var/www/php-fcgi-scripts/example1
chown -R example2:example2 /var/www/php-fcgi-scripts/example2

Создаем виртуальные хосты Apache2 для сайтов example1.org и example2.org
nano /etc/apache2/sites-available/example1


<VirtualHost *:80>
  ServerName example1.org
  ServerAlias www.example1.org
  ServerAdmin webmaster@example1.org
  DocumentRoot /var/www/example1/web/

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

  ErrorLog /var/www/example1/error.log
  CustomLog /var/www/example1/access.log combined
  ServerSignature Off

</VirtualHost>


nano /etc/apache2/sites-available/example2


<VirtualHost *:80>
  ServerName example2.org
  ServerAlias www.example2.org
  ServerAdmin webmaster@example2.org
  DocumentRoot /var/www/example2/web/

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

  ErrorLog /var/www/example2/error.log
  CustomLog /var/www/example2/access.log combined
  ServerSignature Off

</VirtualHost>


Активируем виртуальные хосты
a2ensite example1
a2ensite example2


Перезапускаем Apache, чтобы изменения вступили в силу:
/etc/init.d/apache2 reload


Теперь необходимо все это протестировать
Создаем в каждой директории тестовый скрипт
nano /var/www/example1/web/test.php


С таким содержимым:

<?php
phpinfo();
?>


Теперь мы можем зайти на наш сервер, набрав example1.org/test.php
( если у вас еще нет домена, а потренироваться очень хочется, то можно добавить запись в файл hosts, XXX.XXX.XXX.XXX example1.org -где XXX. IP вашего виртуального сервера)

В секции Server API видно с помощью чего выполняются php скрипты.

test2

Легкий тюнинг, файла php.ini
Т.к. у нас скрипты выполняются из разных директорий, то и настройки PHP у них должны быть свои, на примере сайта example2.org рассмотрим эту ситуацию.

cp /etc/php5/cgi/php.ini /var/www/example2/
chown example2:example2 /var/www/example2/php.ini


Теперь можно модифицировать совершенно спокойно фал /var/www/example2/php.ini
Он для данного виртуального хоста свой и не зависит от основного файла.

Теперь нам необходимо открыть /var/www/php-fcgi-scripts/example2/php-fcgi-starter
nano /var/www/php-fcgi-scripts/example2/php-fcgi-starter

И заменить значения на наши:

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

сохраняем и выходим

перезапускаем Apache
/etc/init.d/apache2 reload


Создаем тестовый файл
nano /var/www/example2/web/test.php

С содержимым
<?php
phpinfo();
?>


Протестируем наш сайт example2.org/test.php, нас интересует строка Loaded Configuration File в которой будет указано место расположения /var/www/example2/php.ini

test3

Изменение настроек PHP
nano /var/www/php-fcgi-scripts/example2/php-fcgi-starter

( для примера если необходимо отключить magic_quotes_gpc, для сайта example2.org добавляем в файл)

#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php -d magic_quotes_gpc=off


перезапустим Apache
/etc/init.d/apache2 reload


Снова заходим на наш тестовый сайт example2.org/test.php
И находим строку magic_quotes_gpc теперь она у нас в положении OFF, т.е. выключено.

php.ini

Тоже самое можно проделать и с первым виртуальным хостом, тогда сайты будут работать независимо друг от друга и иметь собственные настройки php.

7 комментариев

комментарий был удален
avatar
/usr/lib/apache2/suexec –V
suexec policy violation: see suexec log for more details
Если не сложно, помогите разобрать в чем проблема?

suexec.log
[2012-03-10 18:16:37]: too few arguments

error.log
[Sat Mar 10 18:03:24 2012] [notice] Apache/2.2.20 (Ubuntu) configured -- resuming normal operations
[Sat Mar 10 18:03:33 2012] [error] [client 10.0.0.100] File does not exist: /var/www/favicon.ico
[Sat Mar 10 18:05:10 2012] [notice] caught SIGTERM, shutting down
[Sat Mar 10 18:05:11 2012] [notice] suEXEC mechanism enabled (wrapper: /usr/lib/apache2/suexec)
[Sat Mar 10 18:05:11 2012] [notice] Apache/2.2.20 (Ubuntu) mod_fcgid/2.3.6 configured -- resuming normal operations
[Sat Mar 10 18:08:40 2012] [error] [client 10.0.0.100] File does not exist: /var/www/favicon.ico


Ubuntu 11.10
До этого момента все один в один.

locate suexec — пусто
avatar
Так в чем проблема?
Опишите более развернуто…
avatar
подскажите пожалуйста! все сделал как у вас, только не очень понятно с правами www-data на корень сайта:
useradd -s /bin/false -d /var/www/example1 -m -g example1 example1
mkdir -p /var/www/example1/web
chown example1:example1 /var/www/example1/web
если я делаю так, то апач пишет
You don't have permission to access / on this server.
avatar
Что в логах?
avatar
в логи апача ничего не пишет, можете написать на какие папки должны быть права www-data?
avatar
На все директории по пути /var/www/example1/web необходимы права как минимум-на чтение.
Есть что добавить? Регистрируйся и оставляй комментарии!