第十一章 网页服务器

Apache 是 UNIX 系统中普遍使用的网页服务器软件。目前因特网中,有超过百分之五十的服务器是使用 apache 来提供网页浏览的服务。 这里我们将介绍如何安装一个功能完整的网页服务器。

如果你的网页服务器只要用来放纯粹的 HTML 档,不要执行其它的功能,如 PHP、MySQL、SSL等,你只需到 /usr/ports/www/apache13 的目录中,执行 make install 即可迅速的安装 apache。但是这样的服务器太过于阳春了,使用 apache 自然要使用 PHP 才有意思。PHP 是一个用来写网页程序的软件,就像 ASP、JAVA servlet、CGI 等等有类似的用途。不同的是 PHP 十分容易学习,程序代码也很简洁,速度更是没话说。如果你有些微的程序语言基础,不出二个礼拜,你就能对 PHP 有十足的认识,并且可以自己写出留言版、权限控制等简单的程序。

如果要使用 PHP,那你一定也要使用一套数据库系统做为程序后端的数据储存。在众多免费的数据库软件中,最有名的应该是 MySQL 和PostgreSQL 了。不论是 MySQL 或 PostgreSQL,它们的功能及速度都令人赞赏。使用 PHP 加上数据库软件,你可以制作出网页的各式数据库,如会员管理、产品数据库等等。总之,我十分建议使用 Apache+PHP+数据库的组合,就算目前不会用到,不久的将来也会使用它们的功能。全部一股脑的装起来,省得日后麻烦。在安装 PHP 时,我也建议你顺便安装 GD 等软件来付予 PHP 绘图的能力,例如从数据库中取出数据来绘制统计图表等。

另外,如果你要在网页上执行 CGI 的话,我们会介绍 suEXEC 的设定。传统上,当使用者执行 CGI 时,系统会以网页服务器执行者的身份来执行 CGI。内定的使用者是 nobody,这样的执行方式有一些缺点。因为所有的 CGI 程序都必须要设定为可以执行,但是如果是以 nobody 的身份执行的话,该 CGI 程序就必须要让 nobody 有执行的权限。UNIX 的权限控制有三个等级,分为档案的拥有者、和拥有者同一群组的人、其它人,而网页服务器的执行者通常不是档案的拥有者,如果系统中有其它的使用者也要执行 CGI 程序,他们都必须把 CGI 程序的权限开放给所有人,这样子在系统中的所有人都可以执行该程序。更甚者,如果 CGI 程序有要求读写档案的话(例如留言版程序),那么被读写的档案也必须让所有使用者都可以读写,也就是说其它人都可以删除别人的档案。因此,我们利用 suEXEC 来让 CGI 程序在执行时是以档案拥有人的身份执行,也就是说 CGI 程序的权限设定只要设为拥有者可以读、写及执行,不必开放给其它的人使用。总而言之,如果你的网页服务器有必要执行 CGI 的话,最好安装 suEXEC。

最后,我们也会加入 SSL 联机。一般的 http 要求都是以明码传送数据,数据传送的过程中很容易被窃听。如果你有一些需要输入密码的网页,建议改用 https 联机,也就是用 SSL 联机的方式,将数据重新编码加密,来增加安全性。

11.1 安装 MySQL

MySQL 和 FreeBSD 一样也有多种版本同时开发,例如 5.x、4.1.x、4.0.x 等,其中 4.0.x 是较稳定的版本。本文撰写时的最新的稳定版本是 mysql-4.0.18。

我们可以使用 ports 来安装 MySQL,但如果您想要使用最新版的 MySQL 而又不想更新您的 port tree,我们自行抓回原始档来编译。先到 http://www.mysql.com 取得最新版的 MySQL Source Package,读者可以在第二片光盘的 /ports/distfiles 目录中找到该档案。你也可以在国内的 FTP 站台去取得,例如 ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/ 取得 mysql-4.0.18.tar.gz。文件名称数字的部份就是版本的名称,数字越大表示版本越新。

首先,请新增一个使用者 mysql 以供 MySQL 使用,编辑 /etc/group 加入下列一行:

mysql:*:100:

执行 vipw,加入下列一行:

mysql:*:100:100::0:0:Mysql user:/usr/local/mysql:/sbin/nologin

取回档案后,执行下列指令以解压缩,并安装,下列指令中最后有 \ 表示下一行接续该行:

# tar zxvf mysql-4.0.18.tar.gz
# cd mysql-4.0.18
# ./configure --prefix=/usr/local/mysql \
# --with-low-memory \
# --with-charset=big5
# make 
# make install
# scripts/mysql_install_db
这样就完成了 MySQL 的安装了。上面指令中的 ./configure 的参数,prefix 表示要安装的目录,建议安装在 /usr/local/mysql 中。接着更改 mysql 目录的拥有者:
# chown -R mysql:mysql /usr/local/mysql

安装完成之后,接下来就试验一下可不可以执行。请启动 MySQL 并设定密码:

# /usr/local/mysql/share/mysql/mysql.server start
# /usr/local/mysql/bin/mysql mysql

若安装成功,你将看到以下画面:

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14 to server version: 4.0.18

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

MySQL 刚安装完成时,并未设定 root 的密码,因此我们接着要设定 root 的密码并实时更新设定:

mysql> UPDATE user SET password=password('你的密码') 
      where user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2  Changed: 0  Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)

如果您有其它使用者要加入也可以加入,最好不要让使有人都有对所有数据库有全部的权限。例如,我的网页数据库名称是 www,而管理者是 jack,我只要让它对 www 这个数据库有某部份的权限且密码是 mypwd,可以使用下列的设定:

mysql> GRANT SELECT,INSERT,UPDATE,DROP,CREATE,DELETE,INDEX
      ON www.* TO jack@localhost IDENTIFIED BY 'mypwd';
mysql> FLUSH PRIVILEGES;

以上指令及 MySQL 更详细的设定说明,我们会在数据库系统一章中加以说明。最后请以 exit; 来离开 MySQL。
开机时要自动执行mysql请在 /etc/rc.local 中加入:

/usr/local/mysql/share/mysql/mysql.server start

建议您以后使用 mysql.php 来管理数据库,这是一个可以从支持 PHP 的网页上直接存取数据库的程序。比起其它以 PHP 写成的 MySQL 数据库管理程序,我最喜欢这一个,因为只要将它放在网页的目录中,就可以执行了。只需一个档案,完全不须做任何设定。你可以在本书第二片光盘 /examples 中取得。

11.2 安装 apache

11.2.1使用 ports 安装

我们要开始安装 apache 了。如果您所要安装的网页服务器只是要具备 apache 基本功能,您可以使用 ports 来安装:

# cd /usr/ports/www/apache13
# make install

如果您要安装 apache 并令其支持 ssl 及 php,可以使用下列指令:

# cd /usr/ports/www/apache13-modssl
# make install
# cd /usr/ports/www/mod_php4
# make install

在安装 mod_php4 时,将会出现下列画面:

图 11-1

我们可以选取 PHP 所要附加的功能。为了使用 PHP 来绘图,我们选取了 GD,另外还要支持 MySQL、PostgreSQL 等数据库,其它选项您可以自行斟酌。选取完毕之后,就可以选择 OK 来进行安装了。

安装完毕之后,Apache 的设定档会放在 /usr/local/etc/apache/httpd.conf,接着要设定 httpd.conf 来使 php 可以运作。请在 httpd.conf 档案最后加上下列设定:

AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps

为了要在开机时能自动启动 Apache,在 /usr/local/etc/rc.d/ 目录下也有一个 apache.sh 的档案。使用 ports 安装时,预设的网页根目录位于 /usr/local/www/data,您可以经由修改 httpd.conf 来设定您的网页根目录。如果您要立刻启动 Apache,可以使用下列指令:

# /usr/local/etc/rc.d/apache.sh start

11.2.2 自行编译

自行编辑 Apache 比较麻烦,但可以有更多的弹性。首先,在 /tmp 中建立一个目录 work 并进入该目录,取得以下档案将它们放到该目录下,以便管理,这些档案在光盘二的 /ports/distfiles 目录中都可以找到:

apache_1.3.29.tar.gz
mod_ssl-2.8.16-1.3.29.tar.gz
openssl-0.9.7d.tar.gz
mod_fastcgi-2.2.14.tar.gz

以下为 PHP 所需的档案:

php-4.3.6.tar.bz2
imap-2002d.tar.Z

1.解压缩 apache:

# tar zxvf apache_1.3.29.tar.gz

2.安装 openssl:

# tar zxvf openssl-0.9.7d.tar.gz
# cd openssl-0.9.7d
# ./config
# make
# make test
# make install
# cd ..

3.编译 mod-ssl:

# tar zxvf mod_ssl-2.8.16-1.3.29
# cd mod_ssl-2.8.16-1.3.29
# ./configure --with-apache=../apache_1.3.29
# cd ..

4.先做一次 apache 的组态:

# cd apache_1.3.29
# ./configure --prefix=/usr/local/apache
# cd ..

5.安装 PHP 之前先安装 GD 及其所需档案:

# cd /usr/ports/graphics/gd
# make install
# cd /usr/ports/devel/t1lib
# make install
# tar zxvf imap-2002d.tar.Z
# cd imap-2002d
# make bsf
# cd ..
# tar jxvf php-4.3.6.tar.bz2
# cd php-4.3.6
# ./configure --with-mysql=/usr/local/mysql \
--with-apache=../apache_1.3.29 --enable-track-vars \
--with-imap=../imap-2002d \
--with-gd --enable-gd-native-ttf \
--with-t1lib --with-imap-ssl \
--with-jpeg-dir --with-png-dir \
--with-freetype-dir \
--with-zlib-dir
# make
# make install
# cp php.ini-dist /usr/local/lib/php.ini
# cd ..

6.安装 apache:

# cd apache_1.3.29/src/modules
# tar zxvf ../../../mod_fastcgi-2.4.2.tar.gz
# mv mod_fastcgi-2.4.2 fastcgi
# cd ../../

7. 设定 openssl 位置:

设定 openssl 的目录,如果您使用的 Shell 是使用 tcsh 的话:

# setenv SSL_BASE "../openssl-0.9.7d"
如果是使用 bash 的话:
# export SSL_BASE="../openssl-0.9.7d"

8.编译 apache:

# ./configure --prefix=/usr/local/apache \
--enable-shared=max \
--activate-module=src/modules/php4/libphp4.a \
--activate-module=src/modules/fastcgi/libfastcgi.a \
--enable-module=ssl --enable-suexec \
--suexec-caller=nobody \
--suexec-docroot=/usr/local/apache/htdocs \
--suexec-userdir=public_html \
--suexec-logfile=/usr/local/apache/logs/suexec_log \
--suexec-uidmin=10 --suexec-gidmin=10
# make

9. 接下来我们必须产生 Apache 所需使用的凭证:

# make certificate TYPE=custom
# 这是问您所要使用的算法为何,我们直接按 Enter 即可
Signature Algorithm ((R)SA or (D)SA) [R]:
# 接下来要产生根凭证,请输入您所在国家的数据,这个字段我们填入 TW。
1. Country Name             (2 letter code) [XY]:TW
# 这是所在的州名,我们可以填入 Taiwan。
2. State or Province Name   (full name)     [Snake Desert]:Taiwan
# 城市名称,笔者输入 Taipei。
3. Locality Name            (eg, city)      [Snake Town]:Taipei
# 这是您的组织名称,我随便输入一间公司名字,或者直接按 Enter 也可以。
4. Organization Name        (eg, company)   [Snake Oil, Ltd]:AlexWang.Inc.
# 这是您的单位名称,我们使用默认值即可。
5. Organizational Unit Name (eg, section)   [Certificate Authority]:
# 凭证要叫什么名称,您可以自己取一个名称。
6. Common Name              (eg, CA name)   [Snake Oil CA]:AlexCA
# 输入您的 Email。
7. Email Address            (eg, name@FQDN) [ca@snakeoil.dom]:alex@alexwang.com
# 凭证的有效期限。
8. Certificate Validity     (days)          [365]:
# 产生了根凭证之后,接下来我们要产生服务器所要使用的凭证。首先输入版本,请使用默认值 SSLv3。
Certificate Version (1 or 3) [3]:
# 接下来的几个字段和根凭证差不多,除了 Common Name (FQDN) 要输入您的服务器全名外。
1. Country Name             (2 letter code) [XY]:TW
2. State or Province Name   (full name)     [Snake Desert]:Taiwan
3. Locality Name            (eg, city)      [Snake Town]:Taipei
4. Organization Name        (eg, company)   [Snake Oil, Ltd]:AlexWang Inc.
5. Organizational Unit Name (eg, section)   [Webserver Team]:
6. Common Name              (eg, FQDN)      [www.snakeoil.dom]:www.alexwang.com
7. Email Address            (eg, name@fqdn) [www@snakeoil.dom]:alex@alexwang.com
8. Certificate Validity     (days)          [365]:
# 接下来会询问您是否要将这些凭证加密,请不要加密,否则在 Apache 起动时,您都必须输入一次密码。
Encrypt the private key now? [Y/n]: n
Encrypt the private key now? [Y/n]: n

10. 最后我们就可以完成安装了:

# make install
# cd ..

大致上完成了,接着要设定 /usr/local/apache/conf/httpd.conf 来使 php 可以运作。在 httpd.conf 档案最后加上:

# And for PHP 4.x, use:
#
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps

将 AddType 前的 # 拿掉并改成上面的样子,存盘离开,如果没有这一段文字则自行在 httpd.conf 档案最后自行加入。详细的 httpd.conf 设定我们会在下一节说明。

接下来执行以下指令来启动 apache:

# /usr/local/apache/bin/apachectl start

启动后,我们就可以使用浏览器连到该服务器看看是否看得到网页。如果可以的话,请使用 /usr/local/apache/bin/apachectl stop 来停止 apache 服务,再使用 /usr/local/apache/bin/apachectl startssl 来启动具 SSL 的 apache。并改以 ssl 联机到服务器看看 https://your.server/ 来看是否成功。

我们接着要试试 php 可不可以运作。在 /usr/local/apache/htdocs/ 编辑一个档名为 test.php 的文字文件,内容如下:

<?
phpinfo();
?>

再使用浏览器连到该档案,看看 php 是否正常:http://youserver/test.php。

都完成之后,若开机即要执行 apache 的话,请在 /etc/rc.local 中加入:

/usr/local/apache/bin/apachectl startssl

11.2.3 后续系统设定

后续的设定就是要修改 /usr/local/apache/conf/httpd.conf/usr/local/lib/php.ini,将它们依你的需要修改。PHP 自 4.1.0 版开始,支持一种比较安全的变量传递方式,它对于由网页所传递进来的变量有不同的取得方式。在 4.2.0 之前,预设支持新旧二种传递方式,但在 4.2.0 之后,预设就只支持新的方式。因此,如果您有旧的 PHP 程序要在服务器上执行,您一定要修改 php.ini,我们会在 php.ini 设定一节中详加说明。休息一下,我们接着几章便要说明这些档案的设定。

11.3 http.conf 说明

/usr/local/apache/conf/httpd.conf 是 Apache 的主要设定档。档案中有 # 为开头者是批注,用以说明设定的情形及方式,如果一行的开头有 # 的话,该行对 Apache 就不会产生作用。全文可以分成三个部份,第一个区段是全域设定,用来设定 apache 执行时的重要设定。第二个部份是主要主机的设定,针对主要对外提供服务的主机加以设定。第三个部份是虚拟主机的设定,你可以在一台机器上设定多个 domain name 或多个 IP ,并针对不同的 domain 来设定不同的目录及相关参数。如果你有安装 ssl,那么还有第四个部份是 ssl 的设定。

修改完 httpd.conf 后,记得使用 /usr/local/apache/bin/apachectl restart 来重新启动 Apache。如果您使用 port 安装 Apache ,请使用 /usr/local/sbin/apachectl restart 来重新启动。

11.3.1 全域设定部份

# ServerType 可以设定为 inetd 或是 standalone。
# standalone 是采独立常驻的方式,即开机时就常驻于系统中。
# 若是设定为inetd时,则是由inetd这个deamon来启动相关服务程序。
# 一般来说以standalone的方式Server的效率会比较好,
# 除非您有特别的需要,否则建议以standalone的方式即可。
ServerType standalone

# apache 的根目录,就是你安装 apache 的目录
ServerRoot "/usr/local/apache"

# 使用 NFS 时才会用到这项设定
#LockFile /usr/local/apache/logs/httpd.lock

# apache 启动时会记录 process id,并将它写在下列设定的档案中。
PidFile /usr/local/apache/logs/httpd.pid

# 设定 apache 程序的相关信息记录文件
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard

# 在 apache 1.3.6 版以前,还多了二个设定档,就是 access.conf
# 及srm.conf,新版己经不需要了
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf

# 设定和 client 几秒内仍无法连上即切断和 client 的联机
Timeout 300

# 可以设定为 On 或 Off,表示在完成 client 的联机要求后,
# 是否要立即切断联机。一般会保持联机,以服务下一次的联机
# 请求。如果设为 Off,每一次的联机要求结束后,都会关闭连结,
# 下一次的请求则要再开一个新的程序,这样速度较慢。除非你的
# 硬件真的很差,每法同时有太多的程序,否则都设为 ON,
# 以增加速度
KeepAlive On

# 同时保持联机要求的上限。如果你 KeepAlive 设为 On,这里才
# 会有作用。你可以依照自己的备配提高这个值,以提高效能。
# 如果设为 0 表示不限制
MaxKeepAliveRequests 100

# 设定持续联机时等待客户端下一个请求的时间
# 超过此时间则视为联机中断
KeepAliveTimeout 15

# Apache 会动态的依照系统系统的负载来调整所需的程序
# Apache 会定期检查有多少联机要求在等待中
# 会在这个范围中自动启动适当数目的程序来等待请求
# 这里的设定己满足大多数网站的需求,你不必做更改
MinSpareServers 5
MaxSpareServers 10

# 如果你是以 standalone 的方式启动 Apahce
# 这里是设定启动时要同时启动多少个程序来等待联机请求
StartServers 5

# 同一时间可以联机的 client 数目,这个数目不应该太小
# 你可以依自己的硬件来调高这个值
MaxClients 150

# 每个请求子程序(child process)的最大数目。太多的子程
# 序会占用内存及资源,如果设为 0 表示不限制
MaxRequestsPerChild 0

# 如果有设虚拟主机的话,你可以设定 Apache 要 listen 的
# IP或Port,当所架设的虚拟主机若不在80端口号时,您就必须
# 在这指定其它埠号提醒Apache监看某个埠号。
#Listen 3000
#Listen 12.34.56.78:80

# 虚拟主机的相关设定,设定 Apache 可以接受联机请求的
# IP 地址或Domain Name,其设定值可以是 * 、 IP 地址或
# 是完整的 Domain Name。
#BindAddress *

# Dynamic Shared Object (DSO) Support
# 动态分享对象模块。可使 Apache在执行时直接
# 加入某些需要的模块,使Apache在执行上更具弹性。
# 下列的各模块顺序很重要,最好不要随意更动
# Example:
# LoadModule foo_module libexec/mod_foo.so
LoadModule env_module         libexec/mod_env.so
.....略.....

# 是否要允许以 http://yourserver/server-status 来显示
# 服务器的设定状态,预设是 Off。如果要设为 On,还必须
# 要设定下面  的部份
#ExtendedStatus On

11.3.2 主要主机设定

### Section 2: 'Main' server configuration
# 如果你是以 inetd 的方式启动 Apache,以下的部份设定
# 并不会发生作用

# 设定 standalone 要倾听的 port,如果 port 小于 1023
# 必须要以 root 才能启动 Apache
Port 80

##  SSL 支援
##  如果有使用 SSL,设定 SSL 要听的 port

Listen 80
Listen 443


# 如果你希望启动 Apache 的使用者和跑 httpd 的使用者是
# 不同人的话,必须以 root 来启动,这里的设定就是你要使用的
# 使用者名称及其所属群组。所设的使用者必须是真的存在于系统
# 千万不要设成 root ,这对于安全上非常重要。
User nobody
Group nobody

#
# ServerAdmin: 你的信箱,这个信箱地址当网页出现错误讯息时
# 将出现在该页面上
#
ServerAdmin www@mydomain.com

#
# ServerName 让你可以设定一个主机名称,该名称和使用者联机
# 的名称不同时,会传回去给使用者。你可以设和你真实的主机
# 名称不同,例如你可以在你的主机名称前多加一个 www
#
# 请注意:你不能自己发明一个主机名称并希望它可以运作,
# 这个主机名称对你的机器而言,必须要是一个有效的 DNS name
# 如果你的主机并未拥有主机名称,你可以使用 IP address
# 例如,123.45.67.89。如果你真实的 IP 都没有,你可以使用
#  127.0.0.1,这是 TCP/IP local loop-back 的地址,
# 通常用来作 localhost
#
ServerName www.alexwang.com

#
# DocumentRoot: 这个目录是你放网页的地方,你也可以放超级链接
# 来将首页指向其它地方。
DocumentRoot "/home/www"

#
# 所有 Apache 存取的目录都可以对它们的属性加以设定
#
# 首先我们先设定预设的权限
#

    Options FollowSymLinks
    AllowOverride None


#
# 这里的设定是针对你网页存放目录及其子目录
#
# 这里可以使用的选项有 "All", "None", 或者是混合下列各项:
# "Indexes", "Includes","FollowSymLinks","ExecCGI",
# "MultiViews"
# Indexs 表示如果若找不到目录中预设的首页(DirectoryIndex
# 设定的档案) 时,Apache 会自动产生index 列出目录中的档案。
# FollowSymlinks 表示允许符号链接(Symbolic Link)功能,
# 如果没有此选项,Server会忽略系统中的连结档案。
# Includes 允许SSI(Server Side Include)可以在该目录下执行
# ExecCGI 允许执行CGI,若无此选项则该目录中无法执行CGI程序
# MultiViews 允许内容协商的 MultiViews。
# None 关闭所有的选项,只允许Read。
# All 开启所有的选项,除了MultiViews之外。
# 请注意,"MultiViews" 一定要明确写出来,使用 "Options All"
# 并未包含 MultiViews。
#

    Options Indexes FollowSymLinks MultiViews ExecCGI

#
# 这个选项是用来控制目录中的 .htaccess 档案可不可以覆盖原本
# 对该目录所设的权限。这个选项可以是 All 或是下列混合各项:
# "Options", "FileInfo", "AuthConfig", and "Limit"
# Options 允许该目录位置在.htaccess文件中使用Options功能
# FileInfo 允许该目录位置在.htaccess檔中使用AddEncoding、
# AddType、DefaultType、ErrorDocument等指令。
# AuthConfig 允许该目录在.htaccess檔中使用AuthDBMGroupFile、
# AuthDBMUserFile, AuthGroupFile、AuthName、AuthType、
# AuthUserFile…等功能。
# Limit 允许使用Limit功能。
# None 停止.htaccess的功能。
# All 允许.htaccess所有功能。
#
    AllowOverride None

#
# 控制谁可以连到这个服务器
# Order 表示先处理 allow 或是 deny。这里是先 allow 再 deny
# 这里 allow 跟 deny 的上下顺序必须跟Order中所设定的顺序
# 是一样才可以。
# Allow from all 表示任何人都可以连到服务器的这个目录来浏览
# 若是设为Allow from freebsd.org 的话,则表示只有网域是
# 在freebsd.org 的人才可以连到该目录中观看。
# 当然若不想让某些人连过来观看这个目录的网页
# 可以加一行Deny from bad.Domain.com,当然您也可
# 以使用 IP 来代替 Domaine
#
    Order allow,deny
    Allow from all


#
# UserDir: 机器中的使用者预设放网页的地方是在使用者
# 家目录的那个目录下使用者可以用
# http://www.hostname.com/~user 来连到 user 的首页
#

    UserDir public_html


#
# 控制 UserDir 目录的权限,和上述的差不多。
#
#    AllowOverride FileInfo AuthConfig Limit
#    Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
#    
#        Order allow,deny
#        Allow from all
#    
#    
#        Order deny,allow
#        Deny from all
#    
#

#
# DirectoryIndex: 当连到目录时,预设的网页是哪一个
# 你可以用空白作为间隔,设定多个档案,将依所设的顺序寻找
# 最好加入 index.htm 及 index.html,如果有使用 PHP 的话
# 应该要再加入 index.php
#

    DirectoryIndex index.html index.php index.htm


#
# AccessFileName: 目录中放置控制信息的文件名称
#
AccessFileName .htaccess

#
# 下列的设定是用来避免 .htaccess 档案被客户端使用者看到
# 既然 .htaccess 是用来控制权限的,你当然不会希望他被看到
# 另外,还有 .htpasswd 等档案是用来控制该目录密码的,
# 这里的设定也会影响其它 .ht 开头的档案
#

    Order allow,deny
    Deny from all

#
# CacheNegotiatedDocs: 这个设定是用来告诉外面的 proxy
# 不要保留我的档案,预设是批注掉,以降低流量
#
#CacheNegotiatedDocs

#
# UseCanonicalName: 使用这项设定以供 Apache 在需要时可以重
# 建自己的URL (响应该文件是从哪个 URL 出来的)。它将使用
# hostname:port 去响应要求,这个设定会影响 CGI 中的
# SERVER_NAME 及 SERVER_PORT
#
UseCanonicalName On

#
# TypesConfig 用来描述要去哪里找 mine.types 的档案
#

    TypesConfig /usr/local/apache/conf/mime.types


#
# DefaultType 是网页文件预设的 MIME type,你可以将它定义为
# "text/plain" 代表文件是 HTML 格式。如果你大多数的文件是
# binary 文件或是图形,你可以使用 "application/octet-stream"
#
DefaultType text/plain

#
# mod_mime_magic module 使服务器可以自己决定使用什
# 么 MIME type
# MIMEMagicFile 就是告诉该 module 要去哪里找这些定义
# mod_mime_magic 并不是内定的 module,你可以重新编译自行加入
# 这里的 MIMEMagicFile 只有在包含了该模块后才有作用
#

    MIMEMagicFile /usr/local/apache/conf/magic


#
# HostnameLookups: 定义在 log 文件中要记录 IP 或是 hostname
# 例如: www.apache.org (on) or 204.62.129.132 (off).
# 不要打开以节省向 DNS Server 要求解析的时间
#
HostnameLookups Off

#
# ErrorLog: 设定错误讯息的 log 要放在哪个档案
# 如果你有设定在设定虚拟主机时另外指定它的 log 档的话
# 该虚拟主机的 log 会在你所设定的地方
#
ErrorLog /var/log/apache_error_log

#
# LogLevel: 控制错误讯息的记录等级
# 可以设为: debug, info, notice, warn,error,crit,alert,emerg
# debug一般用是在程序的除错开发使用的
# info是指一般的信息,notice指通知讯息
# warn指的是提示讯息,error指的是错误的讯息
# alert是指警告讯息,emerg则是紧急讯息
#
LogLevel warn

#
# 下列是自订记录文件格式,并取一个名字给它们
# 你可以在下列的设定中决定要记录哪一种
# 这里共取了四个名字,combin,common,referer,agent
# 四种都有不同的记录内容,以 combin 最详细
#
LogFormat "%h %l %u %t \"%r\" ...略...."" combin
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

#
# 设定有人存取档案时要记录哪些东西(依 common 的设定格式)
# 并指定要存放在哪里
#
CustomLog /var/log/apache_access_log common

#
# 如果你想要再指定记录其它东西的话,可以在这里设定
#
#CustomLog /usr/local/apache/logs/referer_log referer
#CustomLog /usr/local/apache/logs/agent_log agent
#CustomLog /usr/local/apache/logs/access_log combined

#
# 设定是否将Server的版本和虚拟主机等信息加入网页中
#(通常出现在网页错误或FTP列表时),Off表示关闭,
# EMail则是会把ServerAdmin的E-Mail连结加进去。
# 只能设下列三者之一:  On | Off | EMail
#
ServerSignature On


#
# Aliases: 你可以再这里设定任何的别名,格式是
# Alias fakename realname
#

    #
    # 请注意,如果你在别名(fakename)中加入了 / ,就必须在
    # URL 中表示出来。所以这里 "/icons" 并未使用别名
    # 只有 "/icons/" 才有。如果 fakename 以 / 结束,则
    # realname 也要有,反之亦然。
    # 下面的 Options 等设定是该别名的目录设定
    #
    Alias /icons/ "/usr/local/apache/icons/"

    
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    

    #
    # ScriptAlias: 这用来控制 CGI 的连结
    # 注意需将Options的选项改为ExecCGI,才可以使用 CGI
    #
    ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

    
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    


# End of aliases.


#
# 控制服务器如何列出目录内容
#


    #
    # FancyIndexing 可以美化列出的方式,也可以使用 standard
    #
    IndexOptions FancyIndexing

    #
    # AddIcon* 控制如何依不同档案格示显示小图式
    # 是给 FancyIndexing 用的
    #
    AddIconByEncoding (CMP,/icons/compressed.gif) 略

    AddIconByType (TXT,/icons/text.gif) text/*
    .....略......
    AddIcon /icons/blank.gif ^^BLANKICON^^

    #
    # DefaultIcon 是当不知格式时用的小图式
    #
    DefaultIcon /icons/unknown.gif

    #
    # AddDescription 可以让你对该档案格式加以描述
    # 格式: AddDescription "description" filename
    #
    #AddDescription "GZIP compressed document" .gz
    #AddDescription "tar archive" .tar
    #AddDescription "GZIP compressed tar archive" .tgz

    #
    # ReadmeName 是服务器要去找的 README 文件名称
    # 预设将列出在目录的清单之后
    #
    # HeaderName 是要加在目录清单前显示的文件名称
    #
    # 如果在 Option 中有设 MultiViews 的话,服务器会先去找
    # name.html 并包含它,如果该档不存在就会去找 name.txt
    #
    ReadmeName README
    HeaderName HEADER

    #
    # IndexIgnore 是设定目录中那个档案不列出
    # 可以使用万用字符 *
    #
    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t


# End of indexing directives.

#
# 文件格式Document types.
#


    #
    # AddEncoding 设定编码形式和所对应的扩展名。
    #
    AddEncoding x-compress Z
    AddEncoding x-gzip gz tgz

    #
    # AddLanguage 让你可以设定文件所要告知浏览器使用的语言,
    #
    # Danish (da) - Dutch (nl) - English (en) - Estonian (ee)
    # French (fr) - German (de) - Greek-Modern (el)
    # Italian (it) - Korean (kr) - Norwegian (no)
    # Portugese (pt) - Luxembourgeois* (ltz)
    # Spanish (es) - Swedish (sv) - Catalan (ca) -Czech(cz)
    # Polish (pl) - Brazilian Portuguese (pt-br) -Japanese(ja)
    # Russian (ru)
    #
    AddLanguage da .dk
    ....略.....
    AddCharset UTF-8        .utf8

    # LanguagePriority 设定使用语这的先后顺序
    #

    
    LanguagePriority en tw da nl et fr de el
    

    #
    # AddType 设定 PHP 所使用的 mime.types
    #
    # 装 PHP3 的话就打开下列二行
    #
    #AddType application/x-httpd-php3 .php3
    #AddType application/x-httpd-php3-source .phps
    #
    # 下面是给 PHP4 用的
    #
    AddType application/x-httpd-php .php .phtml .php3
    AddType application/x-httpd-php-source .phps

    AddType application/x-tar .tgz

    #
    # AddHandler 设定CGI-script和所对应的扩展名。若您会
    # 使用到CGI程序,则必须将其批注拿掉打开其功能。
    # 另外,有的CGI的扩展名会用到.pl,所以最好也加入。
    #
    # To use CGI scripts:
    #
    AddHandler cgi-script .cgi

    #
    # 设定是否加入有SSI功能的HTML和所对应的扩展名。
    # 若您会使用到SSI的功能,则必须将其批注拿掉。
    #
    #AddType text/html .shtml
    #AddHandler server-parsed .shtml

    #
    # Uncomment the following line to enable Apache's
    # send-asis HTTP file feature
    #
    #AddHandler send-as-is asis

    #
    # If you wish to use server-parsed imagemap files, use
    #
    #AddHandler imap-file map

    #
    # To enable type maps, you might want to use
    #
    #AddHandler type-map var



# End of document types.

#
# MetaDir: specifies the name of the directory in which
# Apache can find meta information files. These files
# contain additional HTTP headers
# to include when sending the document
#
#MetaDir .web

#
# MetaSuffix: specifies the file name suffix for
# the file containing the meta information.
#
#MetaSuffix .meta

#
# 格式化网页错误的讯息响应 (Apache style)
#  these come in three flavors
#
#    1) plain text
#ErrorDocument 500 "The server made a boo boo.
#  注意 (") 的标志并不会显示
#
#    2) local redirects
ErrorDocument 404 /missing.html
#  设定当找不到网页时就显示 URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#
#    3) external redirects
#ErrorDocument 402 http://server.com/subscription_info.html

#
# 对各种浏览器作不同回应
#


    BrowserMatch "Mozilla/2" nokeepalive
    BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    BrowserMatch "RealPlayer 4\.0" force-response-1.0
    BrowserMatch "Java/1\.0" force-response-1.0
    BrowserMatch "JDK/1\.0" force-response-1.0


# End of 对各种浏览器作不同回应
#
# 是否允许使用 http://servername/server-status 来
# 显示服务器状态
# 将 ".your_domain.com" 改成许可连结的网域
#
# 
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
# 

#
# 是否允许使用 http://servername/server-info 来
# 显示服务器信息 (必需要有加载mod_info.c)
# 将 ".your_domain.com" 改成许可连结的网域
# 
#    SetHandler server-info
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
# 

#
# 为防止Apache一个 1.1 版以前旧bug发生,用来将错误
# 转向处理并记录的指令
# 
# Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
# 

#
# 是否使用 Apache 的 Proxy
# 
#    ProxyRequests On
#...略....
#
# </IfModule>
# End of proxy directives.

11.3.3 虚拟主机及 SSL的设定

### Section 3: Virtual Hosts
#
# VirtualHost: 你可以在一台机器上使用多个主机名称
# 或 IP,并指定使用不同的目录及设定
#

#
# 指定要使用的虚拟主机名称或IP及port
#
#NameVirtualHost *

#
# VirtualHost 范例
# 第一个设定是当未知主机名称时用的
#<VirtualHost *>
#  ServerAdmin webmaster@dummy-host.example.com
#  DocumentRoot /www/docs/dummy-host.example.com
#  ServerName dummy-host.example.com
#  ErrorLog logs/dummy-host.example.com-error_log
#  CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
# SSL 设定
##  我将省略大多数的说明
##  只写我们要改的地方
##  SSL Global Context
##
##  All SSL configuration in this context applies both to
##  the main server and all SSL-enabled virtual hosts.
##
....略....
##
## SSL Virtual Host Context
##

#  General setup for the virtual host

<VirtualHost _default_:443>

# 在这里改你的网页地址及 log 文件地址即可
#
DocumentRoot "/home/www"
ServerName www.alexwang.com
ServerAdmin jack@myserver.com
ErrorLog /var/log/apache_error_log
TransferLog /var/log/apache_access_log
</VirtualHost>

11.4 php.ini 说明

php.ini 是 PHP 的设定档,若您使用 ports 安装,则你必须将设定文件范例 /usr/local/etc/php.ini.dist 复制成 /usr/local/etc/php.ini。如使用自行编译安装,则在安装完 PHP 时,我们从 PHP 原始码中复制一份 php.ini-dist/usr/local/lib/php.ini,这样我们才可以针对 PHP 来调整成我们要的参数。档案的格式是以 ";" 为批注、以 [ ] 包起来的是区段的名称,二种都不会代表任何意义。修改完 php.ini 后,我们必须也要重跑 Apache 才可以有作用。

PHP 自从 4.1.0 开始,支持一种比较安全的变量传递方式。原本我们在写 PHP 程序时,从窗体以 POST 方式传入 PHP 程序时,PHP 可以直接拿来使用。例如,有一个窗体是下面这个样子:

<form action=test.php method=post>
<input type=text name=username size="20">
<input type=button value=送出 name=b1>
</form>

当上述的 HTML 按了送出之后,在 test.php 这个程序就会有一个变量名为 $username,其值是我们所填入的名称。

但是使用者也可以直接在网址列输入 http://url/test.php?username=myname 来设定 $username 这个变量的值为 myname。

这会有什么问题呢?让我们以 PHP 4.1.0 release note 所提出的例子来说明。假设我们有一个程序如下:

<?php
if (authenticate_user()) {
	$authenticated = true;
}
...
?>

使用者可以经由网址列输入一个变量 $authenticated=true,这样一来,不管是否通过 authenticate_user() 的检查,$authenticated 永远都是 true。

所以在 4.1.0 之后,有一个新的方式可以让我们使用,就是将传进来的变量全部都存在数组中。以第一个例子而言,我们以 POST 的方式从窗体传来变量 $username,新的取得变量方式是:$_POST["username"],也就是说所有以 POST 传递过来的变量全部存在 $_POST 这个数组中。详细说明请参考 http://www.php.net/release_4_1_0.php

在 4.2.0 之前,新旧二种方式都可以使用,但是在 4.2.0 之后,Default 只能使用新的方式来传递变量。所以如果你安装的了新 PHP 而发现无法使用旧的 PHP 程序,别惊讶。

如果您还是要以旧的方式来传递变量,请修改 php.ini (通常位于 /usr/local/lib/),将原本的 register_globals = Off 改成下列这个样子,并移除开头的批注符号 ";":

; register_globals = Off
register_globals = On

新的方式下,用来存放变量的数组有下列七种:

除此之外,我们不太需要更改 php.ini 的设定,但如果你想要对它有更深入的了解,我们会一一说明:

[PHP]
; $Id: php.ini-dist,v 1.78.2.2 2001/06/01 03:20:49 sniper Exp $

;;;;;;;;;;;;;;;;;;;
;  关于这个档案   ;
;;;;;;;;;;;;;;;;;;;
;
; 在这里设定的参数名称有大小写之分
; 例如 -  foo=bar 和 FOO=bar 所代表的意义不同
;
; 所设定的值可以是字符串、数字、PHP 的常数 (如 E_ALL 或 M_PI)
; INI 常数 (On, Off, True, False, Yes, No and None) 或是
; 一个运算表示式 (如 E_ALL & ~E_NOTICE), 或是引号内的字符串 ("foo")
;
; 运算表示式在 INI 档中只能使用下列符号及运算子
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布尔运算 (Boolean) 可以使用下列的值作为真:1, On, True 或是 Yes
; 也可以使用下列的值作为假: 0, Off, False 或 No
;
; 如果要指一个空字符串,只可在等号后什么都不加,或是以 none 表示。
;
; foo = ; 将变量 foo 设为空字符串
; foo = none ; 将变量 foo 设为空字符串
; foo = "none" ; 将变量 foo 设成字符串 'none'
;
; 你果你要动态加载一些表示式所方的变量 (可能是 PHP extension
; 或是 Zend extension),你必须在加载后才能使用该变量
;
; 所有 php.ini-dist 的设定都是内建的默认值,如果没有 php.ini 时
; 或者当你删除该行,就会使用内建的默认值

;;;;;;;;;;;;;;;;;;;;
;  程序语言选项    ;
;;;;;;;;;;;;;;;;;;;;

; 是否要在 Apache 中启动 php 引擎
engine = On

; 可以使用 <? 的标签,不然的话,只能使用 <?php 和 <script>
short_open_tag = On

; 是否允许 ASP 格式的标签 <% %>
asp_tags = Off

; 使用浮点数 (floating point numbers) 要用多少数字
precision = 12

; Enforce year 2000 compliance (在某些浏览器可能会产生问题)
y2k_compliance = On

; output buffering 可以让你就算已经送出 body content 后,还
; 可以再送 header (包括 cookies),只是这样会减慢一点 php 输
; 出的速度。你也可以在执行程序时呼叫 output buffering 的函式
; 来取得这项功能。或者就在这里设成 On 来启动吧。
; 一般我会设成 Off,只有当你很常用到这个功能才设成 On。
output_buffering = Off

; 你可以将你的 php 程序输出转向到一个函式,例如,如果你
; 将 output_handler 设为 "ob_gzhandler", 输出将会使用 gzip
; 压缩网页给浏览器
output_handler =

; 压缩输出要使用 zlib 函式库,这里可以使用的值可以是
; 'off', 'on', 或者是用在压缩的暂存区大小 (预设是 4KB)
zlib.output_compression = Off

; Implicit flush 告诉 PHP 每次输出一个区段都要 flush 强制
; 将暂存区的东西输出给浏览器。这和在 PHP 程序在 print() 或
; echo() 之后呼叫 flush() 函式有相同的效果。这个选项最好不
; 要打开,否则效率差很多,只有用于除错时才会打开他。
implicit_flush = Off

; 是否要强制在呼叫变量时都使用传址呼叫,这个功能未来版本的
; PHP/Zend 将取消。比较好的方式是在函式定义时就宣告变量的
; 呼叫方式以传址呼叫。你可以在这里将它设为 Off,来看你所写
; 的程序是否可以在未来版本的 PHP 执行,而参数在传递时就会以
; 值,而非在内存地址。
allow_call_time_pass_reference = On


;
; 安全模式
;
safe_mode = Off

safe_mode_exec_dir =

; 设定一些环境变量可能造成安全性的破坏
; 这些变数如 comma-delimited list of prefixes。在安全模
; 式,使用着只能使用所定义的前缀字符串作起始的变量,预设
; 只有以 PHP_ 作开始的变量 (如 PHP_FOO=BAR)
;
; 请注意:如果设为空字符串,PHP 允许使用者设任何环境变量
safe_mode_allowed_env_vars = PHP_

; 这个指令包含了使用者不能以 putenv() 改变的环境变量
; 的 comma-delimited list ,这个变量可以所设定的保护
; 就算 safe_mode_allowed_env_vars 设定允许也不能改变
safe_mode_protected_env_vars = LD_LIBRARY_PATH

; 这个设定可以让你因为安全的理由而取消一些函式
; 不管你的 Safe Mode 是设为 On 或 Off 都不会影响它
disable_functions =

; 在 Highlighting mode 所要使用的符号颜色
; 只要是在 <font color="??????"> 中的东西都可以
highlight.string = #CC0000
highlight.comment = #FF9900
highlight.keyword = #006600
highlight.bg = #FFFFFF
highlight.default = #0000CC
highlight.html = #000000


;
; 其它设定
;
; 决定是否要在服务器上使用 PHP
expose_php = On


;;;;;;;;;;;;;;;;;;;
;   资源限制      ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30 ; 每个 PHP 程序最大的执行时间
memory_limit = 8M ; 每个 PHP 程序最大可以消耗多少内存 (8MB)


;;;;;;;;;;;;;;;;;;;;;;;;;;
;    错误的处理及记录    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;

; error_reporting 可以让你设定要回报的错误内容
; E_ALL - All errors and warnings,所有错误及警告
; E_ERROR - fatal run-time errors,执行时的致命错误
; E_WARNING - run-time warnings (non-fatal errors),执行时的警告
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (这个警告通常是你的程序代码有问题
; 或者也有可能是内部错误 (例如使用一个未初始化的变量)
; E_CORE_ERROR - 当 PHP 起始时的 fatal errors
; E_CORE_WARNING - 当 PHP 起始时的 warnings (non-fatal errors)
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
;
; 范例:
;
; - 除了 notice 外显示所有错误
;
;error_reporting = E_ALL & ~E_NOTICE
;
; - 只显示 errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
; - 除了 notice 外显示所有错误
;
error_reporting = E_ALL & ~E_NOTICE

; 将错误显示在输出的页面上, 如果是输出网页,建议你把这个功能
; 关掉,并以 error logging 将它记录在档案中。否则显示一些错误
; 在网页上可能会有潜在的安全问题,如档案位置、数据库的轮廓或是
; 一些其它的信息
display_errors = On

; 就算打开了 display_errors,在起始 PHP 时发生的错误并不会显示
; 建议你除了除错外不要打开这个功能
display_startup_errors = Off

; 将错误记录在档案中,建议你将网页产生的错误记录下来
; 这个打开后,将会记录在你 Apache 的 error_log 档中
;log_errors = Off
log_errors = On

; 是否要将最后的错误讯息存在 $php_errormsg 的变量中
track_errors = Off

; 在输出错误讯息前要先输出什么字符串,
; 可以用来改变网页中字的颜色
;error_prepend_string = "<font color=ff0000>"

; 在输出错讯息后要输出什么字符串
;error_append_string = "</font>"

; 要将 log 记录在那个档案
;error_log = filename

; Log errors to syslog (Event Log on NT, not valid in Windows 95).
;error_log = syslog

; 如果在字符串上使用 + 的运算是否要警告
warn_plus_overloading = Off


;;;;;;;;;;;;;;
;  数据处理  ;
;;;;;;;;;;;;;;
;
; 请注意 - track_vars 在 PHP 4.0.3 中永远有效

; PHP 如何处理输出给 URL 多个变量,用什么字
; 串将它们分开,预设是 "&"
;arg_separator.output = "&"

; PHP 如何处理从 URL 传来的多个变量,用什么字
; 串将它们分开,预设是 "&"
; 请注意:这里设中字的任可一个 "字符" 都将视为一个分开的符号
;arg_separator.input = ";&"

; 这里的设定是当 PHP 接收来自 GET, POST, Cookie,环境变量(
; Environment) 和 内建变数 (Built-in variables)有重复时,
; 要处理的顺序。以 (G, P, C, E & S 表示上述的方法,可以写成
; EGPCS 或 GPC). 处理的顺序是由左至右,当变量名称相同时,
; 比较慢处理的将覆盖旧的值。
variables_order = "EGPCS"

; 是否要将 EGPCS 的变量注册成全域变量
; 这个当你在以 $HTTP_*_VARS[] 处理 GPC 变量时就有作用
;
; 如果不打开这个选项,在 PHP 中就不能使用 $var 的方式来取得
; HTML 传来的变量,必须要使用 $_POST["var"]来取得。新的方式将
; 所有变量存在数组中,例如,从网页以 POST 窗体传来的变量会全部存
; 在 $_POST 这个数组中。详情请参考 PHP 4.1.0 的 Release Note
; PHP 4.2.0 之后,预设是不打开的,但是这样一来,有许多旧的
; PHP 程序都不能执行了。因此如果你的程序关于变量的写法如果是
; 使用旧的方式,你必须将这个功能打开。
register_globals = On

; 这是要告诉 PHP 是否要注册 argv&argc 变量 (这包含 GET 的信息)
; 如果你不使用它,则可以关掉以增加处理效率
register_argc_argv = On

; 设定 PHP 在接收 POST 数据时最大的容量大小
post_max_size = 8M

; 这个选项已没有作用,请使用 variables_order 替代它
gpc_order = "GPC"

; Magic quotes
;
; GET/POST/Cookie 进来时使用 Magic quotes
magic_quotes_gpc = On

; Magic quotes for runtime-generated data,
; 如 data from SQL, from exec(), 等
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

; 自动在所有 PHP 档案之前或之后包含一个档案
auto_prepend_file =
auto_append_file =

; PHP 4.0b4 会送出一个语言编码方式 MIME type
; 如果要把内定使用语言取消,就把 charset 设为空字符串
;
; PHP 预设使用的 MIME type 是 text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"


;;;;;;;;;;;;;;;;
;  路径及目录  ;
;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"

; PHP 文件的位置,只有非空字符串才有作用
doc_root =

; 当 php 以 /~usernamem 打开文件时,所要使用的目录
; 就是使用者目录中 PHP 文件要放在哪里
; 只有非空字符串才有作用
user_dir =

; 其它可以加载的模块位置
extension_dir = ./

; 是否要使用 dl() 函式。dl() 在一些多重执行绪的服务器
; 可能不会运作,如 IIS 或 Zeus,这时它会自动取消 dl()
enable_dl = On


;;;;;;;;;;;;;;;;
;   档案上传   ;
;;;;;;;;;;;;;;;;

; 是否要使用 HTTP 上传档案
file_uploads = On

; 上传档案时所要使用的暂存目录,如果没有指定就会使用系
; 统内定的暂存目录
;upload_tmp_dir =

; 最大上传档案大小,我改成 5MB,一首歌都大于原本的 3MB
upload_max_filesize = 5M


;;;;;;;;;;;;;;;;;;
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;

; 是否允许使用 URL (如 http:// 或 ftp://) 做为 fopen() 所
; 要开启的档案
allow_url_fopen = On

; 定义可昵名的 FTP 所要使用的密码
;from="john@doe.com"

;;;;;;;;;;;;;;;;;;
;  动态延伸模块  ;
;;;;;;;;;;;;;;;;;;
;
; 如果你希望自动加载延伸模块,请使用下列设定
;
; extension=modulename.extension
;
; 例如在 windows 下,使用:
;
; extension=msql.dll
;
; ... 或在 UNIX:
;
; extension=msql.so
;
; 请注意,这里只能用模块名称,不能包含目录
; 你要先在上面的 extension_dir 设定模块的目录


;Windows Extensions
;Note that MySQL and ODBC support is now built in,
;so no dll is needed for it.
;
;extension=php_bz2.dll
;.... 略....
;extension=php_zlib.dll


;;;;;;;;;;;;;;
;  模块设定  ;
;;;;;;;;;;;;;;

[Syslog]
; 是否要定义 syslog 变量,如 $LOG_PID, $LOG_CRON 等。
; 关掉它会有比较好的执行效率
; 你可以在程序中使用 define_syslog_variables() 来定义它们
define_syslog_variables = Off

[mail function]
; 只用于 Win32
SMTP = localhost

; 只用于 Win32
sendmail_from = me@localhost.com

; 只用于 Unix,你也可以加入参数 (内定值: 'sendmail -t -i').
;sendmail_path =

[Logging]
; 这个设定用于 example logging ,请参考 examples/README.logging
;logging.method = db
;logging.directory = /path/to/log/directory

[Java]
;java.class.path = .\php_java.jar
;java.home = c:\jdk
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
;java.library.path = .\

[SQL]
sql.safe_mode = Off

[ODBC]
;...略...

[MySQL]
; 让你可以做持续的连结数据库
mysql.allow_persistent = On

; 最大的持续连结, -1 表示不限
mysql.max_persistent = -1

; 最大的连结 (持续连结 + 非持续连结)。 -1 表示不限
mysql.max_links = -1

; mysql_connect() 预设使用的 port。如困没有设定,
; mysql_connect() 将使用 $MYSQL_TCP_PORT 或者是 mysql
; 在 /etc/services 中的设定或是在安装编辑时所设的 MYSQL_PORT
mysql.default_port =

; MySQL 作本地连结时内定使用的 socket name
; 如果没有设定,将以 MySQL 预设为主
mysql.default_socket =

; mysql_connect() 内定所使用的主机 (在安全模式中没有作用)
mysql.default_host =

; mysql_connect() 内定的使用者 (在安全模式中没有作用)
mysql.default_user =

; mysql_connect() 内定的密码 (在安全模式中没有作用)
; 请注意,将密码存在这个文件中并不是一个好的方法
; *任何* PHP 程序都可以经由
; 'echo cfg_get_var("mysql.default_password") 来取得密码
; 所有使用者都将知道密码
mysql.default_password =

[mSQL]
; 允许使用持续的连结数据库
msql.allow_persistent = On

;...以各种数据库的设定都和 MySQL 差不多,故略...

[Session]
; Handler 所使用储存及取得的数据
session.save_handler = files

; 传递给 save_handler 的参数。这是 session 将存信息的目录
session.save_path = /tmp

; 是否要使用 cookies
session.use_cookies = 1


; session 的名称(用来作 cookies 名称)
session.name = PHPSESSID

; 启动时是否要重设 session
session.auto_start = 0

; cookie 要存在几秒,如果是 0,代表直到重新启动浏览器
session.cookie_lifetime = 600

;  cookie is 的有效路径
session.cookie_path = /

;  cookie 的主机来源
session.cookie_domain =

; Handler 使用的 serialize data.
; php 是 PHP 标准使用的 serialize data
session.serialize_handler = php

; 是否要在 session 重设时启动'garbage collection'
session.gc_probability = 1

; 几秒后 session 资料将被视为垃圾 'garbage' 并回收
session.gc_maxlifetime = 1440

; 检查 HTTP Referer 来使外部所在的 URLs containing ids 无效
session.referer_check =

; 要从档案中读多少 bytes
session.entropy_length = 0

; 在这里指定要建立的 session id
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; Set to {nocache,private,public} to
;determine HTTP caching aspects.
session.cache_limiter = nocache

; 存在暂存区中的 session 文件几分钟后到期
session.cache_expire = 180

; 支持短暂的 sid support 来兼容 --enable-trans-sid.
session.use_trans_sid = 1

url_rewriter.tags =
   "a=href,area=href,frame=src,input=src,form=fakeentry"

[MSSQL]
; Allow or prevent persistent links.
mssql.allow_persistent = On
; ...MSSQL 和之前的数据库差不多,故略...
; ...以下略

; Local Variables:
; tab-width: 4
; End:

11.5 .htaccess 应用

Apache 允许使用者在目录下放置一个档案 来控制该目录的存取权限。预设是使用 .htaccess 这个档。 你可以自行用文书软件编辑一个文件名为 .htaccess 的档案来设定档案所在目录的权限。 不过也要看 httpd.conf 中关于该目录的 AllowOverride 是否有打开,如果有打开才可以用 .htaccess 的档案去覆盖原本对该目录的设定。

首先先编辑 /usr/local/apache/conf/httpd.conf,在网页目录设定的区段:

<Directory "/home/www">
	Options Indexes FollowSymLinks MultiViews ExecCGI
	AllowOverride AuthConfig
	Order allow,deny
	Allow from all
</Directory>

在设定 AllowOverride 的部份,如果设为 None 表示不允许使用者变更目录设定,设为 AuthConfig 表示可以使用 AuthDBMGroupFile、 AuthDBMUserFile, AuthGroupFile、AuthName、AuthType 等认证的功能。所以我们设定为 AuthConfig。
如果 Directory 的区段中,AllowOverride 是设成 All,你就可以在 .htaccess 档案中设定所有选项,如 Options, AllowOverride 等。

实际应用

.htaccess 最常用的一个例子是用来将目录设定需认证才能读取。假设你要将某个目录设定需要密码才能读取,你可以在该目录下编辑一个名为 .htaccess 的文字文件,内容如下:

AuthName "管理专区"
AuthType "Basic"
AuthUserFile "/var/adminDir.pw"
require valid-user

其中请注意各参数的大小写。这里我们设定储存使用者账号及密码的档案是 /var/adminDir.pw

接着使用指令:

# /usr/local/apache/bin/htpasswd -c /var/adminDir.pw username 
New password: 输入 username 的密码
Re-type new password: 再输入一次

来建立档案 /var/adminDir.pw 并加入使用者 username,日后要再新增使用者不必加参数 -c。

接着使用浏览器连到该目录时,将出现图 11-2:

图 11-2

此时输入你设定的 username 及密码即可。

11.6 虚拟主机

我们可以在一台机器上设定多个主机名称或 IP,并依不同名称来决定其根目录所在。当使用者联机到我们的主机时,每一个不同的名称所看到的根目录都不同。

要达到这样的功能,我们必须先确定主机有多个 DNS 名称,这样别人打该主机名称才会对应到你的 IP。 我们先来说在一台主机上使用多个 DNS 的范例。

假设你的主机 IP 是 111.222.78.9 ,上面有二个主机名称,一个是 www.abc.com,另一个是 www.cde.net。也就是说不管是使用上述哪一个 Domain Name,都可以连到 111.222.78.9。接着请编辑 httpd.conf,在虚拟主机的部份加入下列设定:

# 设定本机所使用的 IP
NameVirtualHost 111.222.78.9

# 设定 www.abc.com 的管理者账号、存放网页的目录及log 所在
<VirtualHost 111.222.78.9>
	ServerAdmin jack@abc.com
	DocumentRoot /home/www/abc
	ServerName www.abc.com
	ErrorLog /var/log/abc_error_log
	CustomLog /var/log/abc_access_log common
</VirtualHost>
# 设定 www.cde.com 的资料
<VirtualHost 111.222.78.9>
	ServerAdmin tom@cde.com
	DocumentRoot /home/www/cde
	ServerName www.cde.com
	ErrorLog /var/log/cde_error_log
	CustomLog /var/log/cde_access_log common
</VirtualHost>

做完上面的设定后,就可以使用 /usr/local/apache/bin/apachectl restart 重新启动 Apache 了。如果你还有别的 Domain Name 指向 111.222.78.9 的话,例如 www.fgh.org ,但你并未设定其 Virtual Host 数据,Apache 将以第一个设定的 Virtual Host 数据为主。在这个范例里,当你打 www.fgh.org 会连到 www.abc.com 的设定。

必须要注意的是,有些客户端的联机软件并不支持 Name-Based 的虚拟主机,要支持 name-based virtual host,客户端必须送出 HTTP 的标头,也就是浏览器必须支持 HTTP/1.1。请放心,我们常用的 IE、Netscape、lynx 都有支援。

11.7 网页记录分析

在我们将所制作好的网页放在网页服务器之后,我们会想知道每一个网页的浏览次数、使用者的停留时间等等。在 apache 的联机记录中,可以看到很多使用者浏览网页的记录,我们可以使用一些工具来分析记录文件,让这些记录文件能更易于阅读。我们在这里要介绍 webalizer 这套软件。Webalizer 会读取 apache 的 log 档,并将分析结果存成网页,让我们可以经由网页的图形更轻松的了解每一个页面的使用情形。由于 webalizer 所进行的分析是经由读取 log 档,因此 log 文件的数据越多,分析出来的结果也就越详尽。

请使用下列指令安装 webalizer:

# cd /usr/ports/www/webalizer
# make install

在安装完 webalizer 之后,我们必须先做一些简单的设定。在 /usr/local/etc/ 有一个 webalizer 的设定文件范例 webalizer.conf-dist,我们先将它复制一份再开始编辑:

# cp /usr/local/etc/webalizer.conf-dist /usr/local/etc/webalizer.conf
# ee /usr/local/etc/webalizer.conf

以下我们将一一说明此设定档的内容,如果您想要更改其中的设定,请将该行开头的井字号移除再开始修改:

# 设定 Apache 联机记录文件的位置。
#LogFile        /var/lib/httpd/logs/access_log
LogFile        /var/log/apache_access_log

# 设定 log 文件的型式,Webalizer 除了 Apache 外,还可以支持分析 FTP 软件
# 或 proxy 软件 squid 的 log 文件。LogType 预设的值是 'clf',表示分析
# 网页数据,你也可以设定为 ftp 或 squid。
#LogType	clf

# OutputDir 是我们想要输出分析数据的位置。请设定为网页根目录下的某一个
# 目录。例如我们的网页根目录是 /home/www,请先在该目录下建立一个子目录
# 名为 traffic,接着再设定 OutputDir 为 /home/www/traffic。
#OutputDir      /var/lib/httpd/htdocs/usage
OutputDir      /home/www/traffic

# HistoryName 可以让我们设定 webalizer 所产生的历史记录文件的文件名。这个档
# 可以用来产生 主要的 HTML 页面 (index.html),我们不需要修改。
#HistoryName	webalizer.hist

# 由于我们可能会设定某一段时间自动将 Apache 的 log 压缩或删除。而
# Incremental 这个变量可以让我们在产生分析资料时,只更新增加的部份
# 而分析过的资料就不再分析,以免覆盖了旧有的资料。
#Incremental	no
Incremental	yes

# 若您设定 Incremental 为 yes,IncrementalName 可以让您设定目前增加
# 的分析数据存放位置。
#IncrementalName	webalizer.current

# ReportTitle 是分析结果网页的标题。在该标题后会加上您的主机名称。
#ReportTitle    Usage Statistics for

# 设定您的主机名称。
#HostName       localhost

# HTMLExtension 是所产生的 HTML 档的扩展名。
#HTMLExtension  html

# PageType 可以让您设定何种扩展名结尾的页面要加入分析数据。因为在
# log 文件中有一些图片,而这些图版我们并不希望加入分析数据中,或者我
# 们也可以增加 PHP 页面的分析数据。所以在这里,我们加上一行用来分析
# PHP 页面的设定。
PageType	htm*
PageType	cgi
PageType	php
#PageType	phtml
#PageType	php3
#PageType	pl

# 如果您希望只使用 https 才可以连到分析页面,则将 UseHTTPS 设为 yes。
#UseHTTPS       no

# DNSCache 可以设定 DNS 快取的文件名称,在分析数据时,可能会一直需要
# 做 DNS 的分析,这个档可以提高 DNS 查询的效率。
#DNSCache	dns_cache.db

# DNSChildren 可以设定要使用多少 process 来做 DNS 查询,预设是 0,表示
# 不查询,我们可以设定的值从 1 到 100。最好不要设太多,以免消耗太多系统
# 资源。
#DNSChildren	0

# HTMLPre 是用设定每个 HTML 档案开头第一行要插入的字,最长 80 个字符。
#HTMLPre <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

# HTMLHead 可以让我们设定 HTML 页面 <HEAD></HEAD> 中间要插入的字。最长
# 也是 80 个字符。
#HTMLHead <META NAME="author" CONTENT="The Webalizer">

# HTMLBody 会取代在 HTML 页面中的 <BODY>  这个标签。可以让我们设定网页
# 的一些属性。最长也是 80 个字符。
#HTMLBody <BODY BGCOLOR="#E8E8E8" TEXT="#000000" LINK="#0000FF" VLINK="#FF0000">

# HTMLPost 会将设定的字符串插入 HTML 第一个 <HR> 标签之后,最长也是 80 个
# 字。
#HTMLPost 	<BR CLEAR="all">

# HTMLTail 可以设定 HTML 页面的结尾所要插入的字符串。最长 80 个字符。
#HTMLTail <IMG SRC="msfree.png" ALT="100% Micro$oft free!">

# HTMLEnd可以设定 HTML 页面的最后结尾所要插入的字符串。我们最少要有
# </BODY> 和 </HTML> 这二个标签,最长 80 个字符。
#HTMLEnd </BODY></HTML>

# Quiet 可以让我们设定在分析时是否要输出讯息,因为我们会使用 crontab
# 定时执行,所以不要输出分析过程的讯息比较好。
Quiet		yes

# ReallyQuiet 可以设定档有错误产生时,是否要输出讯息。
#ReallyQuiet	no

# TimeMe 可以设定在分析之后是否要输出时间。
#TimeMe		no

# GMTTime 可以设定是否要使用 GMT (UTC) 时间而非本地时间。
#GMTTime		no

# Debug 可以设定是否要输出除错讯息。
#Debug		no

# FoldSeqErr 可以让 Webalizer 忽略读取 log 档的错误。
#FoldSeqErr	no

# VisitTimeout 可以设定 session 的到期时间,默认值是 30 分钟。
#VisitTimeout	1800

# IgnoreHist 请保持 no。
#IgnoreHist	no

# Country Graph 是用来显示分析资料中关于国家的统计资料是否要显示。
#CountryGraph	yes

# DailyGraph 及 DailyStats 是设定是否显示每日分析资料。
#DailyGraph	yes
#DailyStats	yes

# HourlyGraph 是 HourlyStats是设定是否显示每小时分析资料。
#HourlyGraph	yes
#HourlyStats	yes

# GraphLegend 是设定是否要显示彩色图表。
#GraphLegend	yes

# GraphLines 是用来设定图表的网格线数量,最多 20。
#GraphLines	2

# "Top" 的选项是每一个分格表格中,要显示多少笔前几名的资料。
#TopSites        30
#TopKSites       10
#TopURLs         30
#TopKURLs        10
#TopReferrers    30
#TopAgents       15
#TopCountries    30
#TopEntry        10
#TopExit         10
#TopSearch       20
#TopUsers        20

# The All* 可以让我们显示所有 log 文件中有记录的数据,而非只有前几名而
# 已。如果设定了某一个 All 的选项,webalizer 将会为该设定新增一个页面。
#AllSites	no
#AllURLs	no
#AllReferrers	no
#AllAgents	no
#AllSearchStr	no
#AllUsers       no

# Webalizer 会自动使用让网址 /somedir/ 可以连结到 /somedir/index.htm
# 如果你想要设定让除了 index. 结尾的网址有此效果外,还要让其它网
# 址也有同样效果,您可以在此设定。
#IndexAlias     home.htm
#IndexAlias	homepage.htm

# Hide*, Group*, Ignore* 及Include* * 可以设定让 Webalizer 忽略
# log 中的关键词,让 log 中某些记录不要被加入分析数据中。例如
# 有的搜寻引擎会自动连到您的网页来找数据,您可以设定忽略这样的
# 联机。请自行参阅说明。
… 略 …
# End of configuration file...  Have a nice day!

接着我们必须依您的设定在网页根目录中建立一个数据夹以储存 webalizer 所产生的图表,假设我们的网页根目录是 /home/www,并在其目录下建立一个子目录名为 traffic

# mkdir /home/www/traffic

紧接着我们就可以使用下列指令来产生统计图表:

# /usr/local/bin/webalizer

因为我们在 webalizer.conf 中设定了所要使用的 apache 使用记录的文件名及所产生的图表存放位置,所以在执行 webalizer 时不必再加任何参数。如果您想指定使用其它的联机记录文件来做分析,您可以在指令后面加上该记录文件的文件名,例如:

# /usr/local/bin/webalizer /var/log/apache_access_log

产生了图表之后,我们就可以使用浏览器输入 http://www.mydomain.com/traffic 连到该网页。

为了让分析图表能定时自动更新,我们可以使用 crontab 每小时定期执行一次分析。

# crontab -e
13      *       *       *       *       /usr/local/bin/webalizer

在上述的 crontab 的设定中,我们让系统在每小时的第 13 分时执行一次 webalizer,您也可以依您的需求调整更新的时间。存盘离开之后,crontab 会自动加载新的设定,如此一来我们就可以随时拥有最新的统设信息了。

11.8 MRTG 流量分析

如果您想要知道网站流量的使用情形,我们可以安装 MRTG 这套软件经由网页来监看网络流量。MRTG 会去收取 SNMP (Simple Network Management Protocol) 所产生的数据,因此所要记录的机器必须要安装 SNMP。在你的主机上安装 MRTG 后,你不仅可以收集自己的流量数据,也可以收集局域网络上其它可以接收到的 SNMP 数据。

11.8.1 安装 SNMP

我们使用 ports 来安装 SNMP:

# cd /usr/ports/net/net-snmp
# ake install clean

安装完成后,我们必须要先新增一个可以读取 SNMP 信息的 community name。所谓的 community name 是一个明码的字符串,我们可以将它视为 management station 和 agent 之间的密码,是 MRTG 和 net-SNMP 沟通时必须要先传送的字符串。我们可以依不同的网域或主机给予不同的权限,依 community name 的设定来决定不同权限。一个网络组件可以有多个 community name,一般 SNMP Agent 所预设公开的 community name 是 public。我们不一定要将 community name 设定为 public,因为 public 是一般 SNMP 的默认值,为了安全的问题,我们不将它设为 public。这里我们将设定 community name 为 mrtg,而且只有 read only 的权限。

要设定 community name 请先新增一个文字文件 /usr/local/share/snmp/snmpd.conf 并加入下列设定:

rocommunity     mrtg
syslocation     Office
syscontact      alex@alexwang.com

上述设定中,mrtg 为只读的 community name,Office 是您机器所在位置,而 syscontact 所接的字符串是您的 Eamil。另外, 我们还必须在 /etc/rc.conf 中加入下列这一行:

snmpd_enable="YES"

接着,请执行 /usr/local/etc/rc.d/snmpd.sh start 来启动 snmpd,如果出现错误则 cd /usr/local/etc/rc.d/, 将 snmpd.sh 原本的内容删除,并加入下列这一行:

/usr/local/sbin/snmpd

接着再执行 /usr/local/etc/rc.d/snmpd.sh 便可启动 SNMP。

11.8.2 安装 MRTG

我们使用 ports 来安装 MRTG:

# cd /usr/ports/net/mrtg
# make install

接着要产生 MRTG 的设定档

# cd /usr/local/etc/mrtg
# rehash
# cfgmaker mrtg@alexwang.com >mrtg.cfg

这里的 mrtg 是我们在安装 net-snmp 时所设定的值。如果你使用错的 community name,你可能会从要记录的设备上得到错误响应。而 alexwang.com 是你所要记录的主机位置。mrtg.cfg 就是所要产生的设定档名。

如果您想要记录多个主机,只要在 cfgmaker 时多加入主机名称即可,例如:

# cfgmaker mrtg@alexwang.com public@dns1.alexwang.com >mrtg.cfg

这样就会同时记录上面二台主机的流量了。

产生基本的设定档后,我们可以再编辑刚才产生的设定档 ee mrtg.cfg,在档案开头的部份加入一些客制化的设定:

# 如果要使用中文的 MRTG 则加入下面这一行
Language: big5

# 设定你的 MRTG 要放在哪个目录,应该要放在网页可以
# 连结到的地方,我的网页根目录是 /home/www,所以我将
# MRTG 放在下面的目录。
WorkDIR:/home/www/mrtg

# 预设的 MRTG 所产生的图时间是由右到左
# 我喜欢由左到右,故加入下面这一行
Options[_]: growright

接着请建立一个你在 mrtg.cfg 中设定的 WorkDIR 的目录:

# mkdir /home/www/mrtg

然后使用指令 indexmaker 来建立 MRTG 的首页:

# indexmaker -title '流量统计' -output /home/www/mrtg/index.html mrtg.cfg

这里的参数 -title 是该 index.html 档的 title,而 -output 就是要输出的档案位置,预设是stdio(通常指的是屏幕) 。

输出的档案 index.html 你也可以使用其它的网页编辑软件再去修改美化它。接下来要将MRTG的一些图片文件复制到 mrtg 的目录里:

# cd /usr/ports/net/mrtg/work/mrtg*
# cd images
# cp * /home/www/mrtg/

最后启动 mrtg:

# /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg

第一次执行上面的指令可能会有一些错误讯息,不要理它,因为是第一次执行 mrtg,所没有一新旧的图,只要再多执行几次就好了。没问题之后,使用指令 crontab -e 来把上述指令每 5 分钟执行一次,加入下面这一行:

*/5    *    *    *    *    /usr/local/bin/mrtg  /usr/local/etc/mrtg/mrtg.cfg

现在你可以使用 http://yourserver/mrtg 来连去看看。最后别忘了移除安装过程的暂存档:

# cd /usr/ports/net/mrtg/
# make clean

11.8 服务器管理

11.8.1 apachectl

这是一个管理 Apache Server 的工具。

参数 说明
start 启动 Apache Server
stop 停止 Apache 服务
restart 重新启动 Apache
startssl 启动具 SSL 功能的 Apache Server

范例: /usr/local/apache/bin/apachectl startssl

如果您使用 port 安装,请执行: /usr/local/sbin/apachectl startssl

11.9.2 ab

这是用来测试 Apache 效能的工具。你可以针对某个 URL 来模拟出连续的联机请求 (不限本地主机),并设定同时间要模拟多少联机。

参数 说明
-n requests 要做多少次联机请求,requests 为次数。
-c concurrency 同时有多少个联机,concurrency 为个数。
-t timelimit 最多等待回应的秒数。
-p postfile 要以 POST 方法联机所欲送出的参数档案。postfile 为存放参数的文件名称。

例如,我要对自己的机器中的 /cgi-bin/test.cgi 作测试,模拟 1000 次请求,每次最多同时 20 个联机,只要在命令列执行指令:

# /usr/local/apache/bin/ab -n 1000 -c 20 http://127.0.0.1/cgi-bin/test.cgi

等了几秒之后出现:

This is ApacheBench, Version 1.3d <$Revision: 1.67 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software:        Apache/1.3.27
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /cgi-bin/test
Document Length:        18307 bytes

Concurrency Level:      20
Time taken for tests:   51.911 seconds
Complete requests:      1000
Failed requests:        0
Broken pipe errors:     0
Total transferred:      18520000 bytes
HTML transferred:       18307000 bytes
Requests per second:    19.26 [#/sec] (mean)
Time per request:       1038.22 [ms] (mean)
Time per request: 51.91 [ms] (mean, across all cont. requests)
Transfer rate:          356.76 [Kbytes/sec] received

Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     7   38.2      2   329
Processing:   338  1022  133.9   1003  1774
Waiting:      223  1011  136.5    993  1774
Total:        338  1029  121.7   1006  1774

Percentage of the requests served within a certain time (ms)
  50%   1006
  66%   1026
  75%   1051
  80%   1074
  90%   1175
  95%   1265
  98%   1347
  99%   1545
 100%   1774 (last request)

您可以增加最多同时联机数目及联机次数,操看看你机器的上限在哪里。

还有更多的参数,详细用法请 man -M /usr/local/apache/man ab

11.9.3 压缩备份 log 档

随着使用人数的增加,网站的 log 档可能会越来越大,我们可以使用 FreeBSD 内定的 newsyslog 来把旧的 log 备份起来。在 newsyslog 中,我们可以指定要备份多少个 log 档,超过之后会自动删除最旧的档案。

首先编辑 /etc/newsyslog.conf 加入下列二行:

/var/log/apache_access_log 644  7   *  $W0D1  Z  /usr/local/apache/logs/httpd.pid
/var/log/apache_error_log  644  7   *  $W0D2  Z  /usr/local/apache/logs/httpd.pid

以上二行的意义是将 /var/log/apache_access_log 这个档案做备份,备份后的文件名称像这样 apache_access_log.0.gz 。备份后该档案的权限是 644,最大的数字到 7,也就是最多八个档案,不限制档案多大时要备份,选在每周日半夜 1 点时备份,并将该档以 gzip 压缩。在备份完后,要将 /usr/local/apache/logs/httpd.pid 所记录的 Process ID 重新启动,如果您使用 port 安装,httpd.pid 的位置是 /var/run/httpd.pid