本教程将引导你在Ubuntu 10.04 server上安装以mod_fcgid方式运行的LAMP虚拟主机。
假定VPS已正确设置了主机名和IP。
输入以下命令,进入root特权模式:
sudo su
1、安装前准备
确保 /bin/sh的符号连接至 /bin/bash ,而不是连接到 /bin/dash
dpkg-reconfigure dash
Install dash as /bin/sh? <-- 选择No
为了保证安装成功,需要禁用AppArmor
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
aptitude remove apparmor apparmor-utils
2、安装 Apache2/mod_fcgi/PHP5
aptitude install apache2 apache2-suexec libapache2-mod-fcgid php5-cgi
Apache默认以模块方式运行PHP,需要输入以下命令禁用此模式
a2dismod php5
然后启用以下模块
a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid
编辑/etc/php5/cgi/php.ini文件
vi /etc/php5/cgi/php.ini
将cgi.fix_pathinfo = 1一行前的分号(注释符号)删掉
在/etc/apache2/mods-available/fcgid.conf中插入一行“PHP_Fix_Pathinfo_Enable 1”,插入后如下:
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 20
PHP_Fix_Pathinfo_Enable 1
</IfModule>
重启Apache
/etc/init.d/apache2 restart
3、创建虚拟主机(站点)
拟将创建2个虚拟主机(站点):
www1.sudu.cn(站点根目录/var/www/vh123456/web)
www2.sudu.cn(站点根目录/var/www/vh654321/web)
为两个站点创建用户(组)
groupadd vh123456
groupadd vh654321
useradd -s /bin/false -d /var/www/vh123456 -m -g vh123456 vh123456
useradd -s /bin/false -d /var/www/vh654321 -m -g vh654321 vh654321
为两个站点创建目录
mkdir -p /var/www/vh123456/web
chown vh123456:vh123456 /var/www/vh123456/web
mkdir -p /var/www/vh654321/web
chown vh654321:vh654321 /var/www/vh654321/web
以suExec方式运行PHP,suExec默认限定应用程序只能打开/var/www目录下的文件,使用以下命令可查看:
# /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"
由于PHP二进制程序的路径(/usr/lib/cgi-bin/php)在suExec限定的范围之外,suExec也不允许通过符号连接来访问,唯一的解决方法是在每一个站点目录下(即/var/www的子目录)创建一个wrapper脚本,由该脚本完成PHP二进制程序的调用,该脚本文件的属主和属组必须设定为该网站的用户账号。
例如,在/var/www/php-fcgi-scripts目录下创建这些脚本文件
mkdir -p /var/www/php-fcgi-scripts/vh123456
mkdir -p /var/www/php-fcgi-scripts/vh654321
vi /var/www/php-fcgi-scripts/vh123456/php-fcgi-starter
vi /var/www/php-fcgi-scripts/vh654321/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
PHPRC参数表示包含php.ini配置文件的目录路径,稍后介绍自定义php.ini会用到。
PHP_FCGI_MAX_REQUESTS参数表示一个fcgid进程结束前,另外一个进程开始之前,能够执行的最大请求数目。
PHP_FCGI_CHILDREN参数定义子进程的数量。
php-fcgi-starter scripts要保证权限为可执行:
chmod 755 /var/www/php-fcgi-scripts/vh123456/php-fcgi-starter
chmod 755 /var/www/php-fcgi-scripts/vh123456/php-fcgi-starter
chown -R vh123456:vh123456 /var/www/php-fcgi-scripts/vh123456
chown -R vh654321:vh654321 /var/www/php-fcgi-scripts/vh654321
接下来,为www1.sudu.cn和www2.sudu.cn两个站点,在Apache上创建配置文件,这里只列出一个站点的配置细节:
vi /etc/apache2/sites-available/vh123456
<VirtualHost *:80>
ServerName www1.sudu.cn
ServerAlias 1.sudu.cn
ServerAdmin [email protected]
DocumentRoot /var/www/vh123456/web/
<IfModule mod_fcgid.c>
SuexecUserGroup vh123456 vh123456
<Directory /var/www/vh123456/web/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/vh123456/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>
输入以下命令,启用该站点
a2ensite vh123456
同样的方法设置好另外一个站点后,重新加载Apache配置
/etc/init.d/apache2 reload
4、测试
vi /var/www/vh123456/web/env.php
<?php
phpinfo();
?>
在浏览器中请求这个文件(http://www1.sudu.cn/env.php),如果Server API一行显示CGI/FastCGI则表示成功。
5、自定义php.ini
将默认php.ini文件拷贝至网站目录下
cp /etc/php5/cgi/php.ini /var/www/vh123456/
chown vh123456:vh123456 /var/www/vh123456/php.ini
将上文提到的/var/www/php-fcgi-scripts/vh123456/php-fcgi-starter文件,PHPRC参数修改如下:
vi /var/www/php-fcgi-scripts/vh123456/php-fcgi-starter
#!/bin/sh
PHPRC=/var/www/vh123456/
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
检查phpinfo,http://www1.sudu.cn/env.php
Loaded Configuration File一行会显示加载的php.ini路径,如果自定义php.ini成功,这个参数应该是/var/www/vh123456/php.ini