如何设置Apache2与mod_fcgid和PHP5在Mandriva 2009.1

如何设置Apache2与mod_fcgid和PHP5在Mandriva 2009.1 本教程介绍如何使用mod_fcgid安装Apache2 和PHP5上...

如何设置Apache2与mod_fcgid和PHP5在Mandriva 2009.1

本教程介绍如何在Mandriva 2009.1上安装带有mod_fcgid和PHP5的Apache2。 mod_fcgid是旧的mod_fastcgi的兼容替代方案。 它允许您使用其所有者的权限执行PHP脚本,而不是Apache用户。

我不会保证这将为您工作!

1初步说明

我在本教程中使用Mandriva 2009.1服务器,主机名为server1.example.com ,IP地址为192.168.0.100

我将在本教程www.example1.comwww.example2.com中创建两个Apache vhost,以演示mod_fcgid的用法。

2安装Apache2 / mod_fcgi / PHP5

首先我们更新我们的包数据库:

urpmi.update -a

我们可以如下安装Apache2,mod_fcgid和PHP5(mod_fcgid需要apache-mpm-worker而不是apache-mpm-prefork ,所以如果当前安装了apache-mpm-prefork ,那么依赖它的Apache模块会被删除,作为apache-mod_php ):

urpmi apache-mpm-worker apache-mod_fcgid php-fcgi

[root @ server1〜]#urpmi apache-mpm-worker apache-mod_fcgid php-fcgi
必须删除以下软件包才能升级其他软件包:
apache-mod_perl-2.0.4-5mdv2009.1.x86_64
(由于与apache-mpm-worker-2.2.11-10.5mdv2009.1.x86_64冲突)
apache-mod_php-5.2.9-1mdv2009.1.x86_64
(由于与apache-mpm-worker [> = 2.2.8]的冲突)(y / N) < - y
要满足依赖关系,将安装以下软件包:
包版本版本
(中等“主要更新”)
apache-base 2.2.11 10.5mdv2009.1 x86_64
apache-mod_ssl 2.2.11 10.5mdv2009.1 x86_64
apache-modules 2.2.11 10.5mdv2009.1 x86_64
apache-mpm-prefork 2.2.11 10.5mdv2009.1 x86_64
apache-mpm-worker 2.2.11 10.5mdv2009.1 x86_64
php-fcgi 5.2.9 6.2mdv2009.1 x86_64
(中等“Contrib”)
apache-mod_fcgid 2.2 6mdv2009.1 x86_64
6MB的磁盘空间将被释放。
将检索到977KB的包。
继续安装7个软件包? (Y / n) < - Y

接下来我们打开/etc/php.ini ...

vi /etc/php.ini

...并在文件末尾添加行cgi.fix_pathinfo = 1

[...]
cgi.fix_pathinfo = 1

然后重新启动Apache:

/etc/init.d/httpd restart

3为www.example1.com和www.example2.com创建Vhosts

现在我将创建两个vhosts: www.example1.com (使用文档root / var / www / web1 / web )和www.example2.com (使用文档root / var / www / web2 / web )。 www.example1.com将由用户和组web2由用户和组web1www.example2.com所有。

首先我们创建用户和组:

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

我们将使用suExec运行PHP; suExec的文档根目录是/ var / www ,如下所示:

/usr/sbin/suexec -V

[root@server1 ~]# /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_SUEXEC_UMASK=077
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"
[root@server1 ~]#

因此,我们不能直接调用PHP二进制文件( / usr / bin / php-fcgi ),因为它位于suExec的文档根目录之外。 由于suExec不允许符号链接,解决问题的唯一方法是为/ var / www子目录中的每个网站创建一个包装脚本; 然后包装脚本将调用PHP二进制文件/ usr / bin / php-fcgi 。 包装器脚本必须由每个网站的用户和组拥有,因此我们需要每个网站的一个包装器脚本。 我将在/ 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

vi /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-fcgi

vi /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-fcgi

PHPRC行包含php.ini文件所在的目录(即/ etc /转换为/etc/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

现在我们为www.example1.comwww.example2.com创建Apache vhosts。 在/etc/httpd/conf/httpd.conf的末尾添加以下两个vhosts:

vi /etc/httpd/conf/httpd.conf

[...]
NameVirtualHost *:80

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

  <IfModule mod_fcgid.c>
    SuexecUserGroup web1 web1
    PHP_Fix_Pathinfo_Enable 1
    <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 webmaster@example2.com
  DocumentRoot /var/www/web2/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web2 web2
    PHP_Fix_Pathinfo_Enable 1
    <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