欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

第十一章 網(wǎng)頁服務(wù)器

Apache 是 UNIX 系統(tǒng)中普遍使用的網(wǎng)頁服務(wù)器軟件。目前因特網(wǎng)中,有超過百分之五十的服務(wù)器是使用 apache 來提供網(wǎng)頁瀏覽的服務(wù)。 這里我們將介紹如何安裝一個功能完整的網(wǎng)頁服務(wù)器。

如果你的網(wǎng)頁服務(wù)器只要用來放純粹的 HTML 檔,不要執(zhí)行其它的功能,如 PHP、MySQL、SSL等,你只需到 /usr/ports/www/apache13 的目錄中,執(zhí)行 make install 即可迅速的安裝 apache。但是這樣的服務(wù)器太過于陽春了,使用 apache 自然要使用 PHP 才有意思。PHP 是一個用來寫網(wǎng)頁程序的軟件,就像 ASP、JAVA servlet、CGI 等等有類似的用途。不同的是 PHP 十分容易學(xué)習(xí),程序代碼也很簡潔,速度更是沒話說。如果你有些微的程序語言基礎(chǔ),不出二個禮拜,你就能對 PHP 有十足的認(rèn)識,并且可以自己寫出留言版、權(quán)限控制等簡單的程序。

如果要使用 PHP,那你一定也要使用一套數(shù)據(jù)庫系統(tǒng)做為程序后端的數(shù)據(jù)儲存。在眾多免費(fèi)的數(shù)據(jù)庫軟件中,最有名的應(yīng)該是 MySQL 和PostgreSQL 了。不論是 MySQL 或 PostgreSQL,它們的功能及速度都令人贊賞。使用 PHP 加上數(shù)據(jù)庫軟件,你可以制作出網(wǎng)頁的各式數(shù)據(jù)庫,如會員管理、產(chǎn)品數(shù)據(jù)庫等等。總之,我十分建議使用 Apache+PHP+數(shù)據(jù)庫的組合,就算目前不會用到,不久的將來也會使用它們的功能。全部一股腦的裝起來,省得日后麻煩。在安裝 PHP 時,我也建議你順便安裝 GD 等軟件來付予 PHP 繪圖的能力,例如從數(shù)據(jù)庫中取出數(shù)據(jù)來繪制統(tǒng)計圖表等。

另外,如果你要在網(wǎng)頁上執(zhí)行 CGI 的話,我們會介紹 suEXEC 的設(shè)定。傳統(tǒng)上,當(dāng)使用者執(zhí)行 CGI 時,系統(tǒng)會以網(wǎng)頁服務(wù)器執(zhí)行者的身份來執(zhí)行 CGI。內(nèi)定的使用者是 nobody,這樣的執(zhí)行方式有一些缺點(diǎn)。因為所有的 CGI 程序都必須要設(shè)定為可以執(zhí)行,但是如果是以 nobody 的身份執(zhí)行的話,該 CGI 程序就必須要讓 nobody 有執(zhí)行的權(quán)限。UNIX 的權(quán)限控制有三個等級,分為檔案的擁有者、和擁有者同一群組的人、其它人,而網(wǎng)頁服務(wù)器的執(zhí)行者通常不是檔案的擁有者,如果系統(tǒng)中有其它的使用者也要執(zhí)行 CGI 程序,他們都必須把 CGI 程序的權(quán)限開放給所有人,這樣子在系統(tǒng)中的所有人都可以執(zhí)行該程序。更甚者,如果 CGI 程序有要求讀寫檔案的話(例如留言版程序),那么被讀寫的檔案也必須讓所有使用者都可以讀寫,也就是說其它人都可以刪除別人的檔案。因此,我們利用 suEXEC 來讓 CGI 程序在執(zhí)行時是以檔案擁有人的身份執(zhí)行,也就是說 CGI 程序的權(quán)限設(shè)定只要設(shè)為擁有者可以讀、寫及執(zhí)行,不必開放給其它的人使用??偠灾?,如果你的網(wǎng)頁服務(wù)器有必要執(zhí)行 CGI 的話,最好安裝 suEXEC。

最后,我們也會加入 SSL 聯(lián)機(jī)。一般的 http 要求都是以明碼傳送數(shù)據(jù),數(shù)據(jù)傳送的過程中很容易被竊聽。如果你有一些需要輸入密碼的網(wǎng)頁,建議改用 https 聯(lián)機(jī),也就是用 SSL 聯(lián)機(jī)的方式,將數(shù)據(jù)重新編碼加密,來增加安全性。

11.1 安裝 MySQL

MySQL 和 FreeBSD 一樣也有多種版本同時開發(fā),例如 5.x、4.1.x、4.0.x 等,其中 4.0.x 是較穩(wěn)定的版本。本文撰寫時的最新的穩(wěn)定版本是 mysql-4.0.18。

我們可以使用 ports 來安裝 MySQL,但如果您想要使用最新版的 MySQL 而又不想更新您的 port tree,我們自行抓回原始檔來編譯。先到 http://www.mysql.com 取得最新版的 MySQL Source Package,讀者可以在第二片光盤的 /ports/distfiles 目錄中找到該檔案。你也可以在國內(nèi)的 FTP 站臺去取得,例如 ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/ 取得 mysql-4.0.18.tar.gz。文件名稱數(shù)字的部份就是版本的名稱,數(shù)字越大表示版本越新。

首先,請新增一個使用者 mysql 以供 MySQL 使用,編輯 /etc/group 加入下列一行:

mysql:*:100:

執(zhí)行 vipw,加入下列一行:

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

取回檔案后,執(zhí)行下列指令以解壓縮,并安裝,下列指令中最后有 \ 表示下一行接續(xù)該行:

# 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 的參數(shù),prefix 表示要安裝的目錄,建議安裝在 /usr/local/mysql 中。接著更改 mysql 目錄的擁有者:
# chown -R mysql:mysql /usr/local/mysql

安裝完成之后,接下來就試驗一下可不可以執(zhí)行。請啟動 MySQL 并設(shè)定密碼:

# /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 剛安裝完成時,并未設(shè)定 root 的密碼,因此我們接著要設(shè)定 root 的密碼并實時更新設(shè)定:

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)

如果您有其它使用者要加入也可以加入,最好不要讓使有人都有對所有數(shù)據(jù)庫有全部的權(quán)限。例如,我的網(wǎng)頁數(shù)據(jù)庫名稱是 www,而管理者是 jack,我只要讓它對 www 這個數(shù)據(jù)庫有某部份的權(quán)限且密碼是 mypwd,可以使用下列的設(shè)定:

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

以上指令及 MySQL 更詳細(xì)的設(shè)定說明,我們會在數(shù)據(jù)庫系統(tǒng)一章中加以說明。最后請以 exit; 來離開 MySQL。
開機(jī)時要自動執(zhí)行mysql請在 /etc/rc.local 中加入:

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

建議您以后使用 mysql.php 來管理數(shù)據(jù)庫,這是一個可以從支持 PHP 的網(wǎng)頁上直接存取數(shù)據(jù)庫的程序。比起其它以 PHP 寫成的 MySQL 數(shù)據(jù)庫管理程序,我最喜歡這一個,因為只要將它放在網(wǎng)頁的目錄中,就可以執(zhí)行了。只需一個檔案,完全不須做任何設(shè)定。你可以在本書第二片光盤 /examples 中取得。

11.2 安裝 apache

11.2.1使用 ports 安裝

我們要開始安裝 apache 了。如果您所要安裝的網(wǎng)頁服務(wù)器只是要具備 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 時,將會出現(xiàn)下列畫面:

圖 11-1

我們可以選取 PHP 所要附加的功能。為了使用 PHP 來繪圖,我們選取了 GD,另外還要支持 MySQL、PostgreSQL 等數(shù)據(jù)庫,其它選項您可以自行斟酌。選取完畢之后,就可以選擇 OK 來進(jìn)行安裝了。

安裝完畢之后,Apache 的設(shè)定檔會放在 /usr/local/etc/apache/httpd.conf,接著要設(shè)定 httpd.conf 來使 php 可以運(yùn)作。請在 httpd.conf 檔案最后加上下列設(shè)定:

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

為了要在開機(jī)時能自動啟動 Apache,在 /usr/local/etc/rc.d/ 目錄下也有一個 apache.sh 的檔案。使用 ports 安裝時,預(yù)設(shè)的網(wǎng)頁根目錄位于 /usr/local/www/data,您可以經(jīng)由修改 httpd.conf 來設(shè)定您的網(wǎng)頁根目錄。如果您要立刻啟動 Apache,可以使用下列指令:

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

11.2.2 自行編譯

自行編輯 Apache 比較麻煩,但可以有更多的彈性。首先,在 /tmp 中建立一個目錄 work 并進(jìn)入該目錄,取得以下檔案將它們放到該目錄下,以便管理,這些檔案在光盤二的 /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 的組態(tài):

# 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. 設(shè)定 openssl 位置:

設(shè)定 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. 接下來我們必須產(chǎn)生 Apache 所需使用的憑證:

# make certificate TYPE=custom
# 這是問您所要使用的算法為何,我們直接按 Enter 即可
Signature Algorithm ((R)SA or (D)SA) [R]:
# 接下來要產(chǎn)生根憑證,請輸入您所在國家的數(shù)據(jù),這個字段我們填入 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.
# 這是您的單位名稱,我們使用默認(rèn)值即可。
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]:
# 產(chǎn)生了根憑證之后,接下來我們要產(chǎn)生服務(wù)器所要使用的憑證。首先輸入版本,請使用默認(rèn)值 SSLv3。
Certificate Version (1 or 3) [3]:
# 接下來的幾個字段和根憑證差不多,除了 Common Name (FQDN) 要輸入您的服務(wù)器全名外。
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 ..

大致上完成了,接著要設(shè)定 /usr/local/apache/conf/httpd.conf 來使 php 可以運(yùn)作。在 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 檔案最后自行加入。詳細(xì)的 httpd.conf 設(shè)定我們會在下一節(jié)說明。

接下來執(zhí)行以下指令來啟動 apache:

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

啟動后,我們就可以使用瀏覽器連到該服務(wù)器看看是否看得到網(wǎng)頁。如果可以的話,請使用 /usr/local/apache/bin/apachectl stop 來停止 apache 服務(wù),再使用 /usr/local/apache/bin/apachectl startssl 來啟動具 SSL 的 apache。并改以 ssl 聯(lián)機(jī)到服務(wù)器看看 https://your.server/ 來看是否成功。

我們接著要試試 php 可不可以運(yùn)作。在 /usr/local/apache/htdocs/ 編輯一個檔名為 test.php 的文字文件,內(nèi)容如下:

<?
phpinfo();
?>

再使用瀏覽器連到該檔案,看看 php 是否正常:http://youserver/test.php。

都完成之后,若開機(jī)即要執(zhí)行 apache 的話,請在 /etc/rc.local 中加入:

/usr/local/apache/bin/apachectl startssl

11.2.3 后續(xù)系統(tǒng)設(shè)定

后續(xù)的設(shè)定就是要修改 /usr/local/apache/conf/httpd.conf/usr/local/lib/php.ini,將它們依你的需要修改。PHP 自 4.1.0 版開始,支持一種比較安全的變量傳遞方式,它對于由網(wǎng)頁所傳遞進(jìn)來的變量有不同的取得方式。在 4.2.0 之前,預(yù)設(shè)支持新舊二種傳遞方式,但在 4.2.0 之后,預(yù)設(shè)就只支持新的方式。因此,如果您有舊的 PHP 程序要在服務(wù)器上執(zhí)行,您一定要修改 php.ini,我們會在 php.ini 設(shè)定一節(jié)中詳加說明。休息一下,我們接著幾章便要說明這些檔案的設(shè)定。

11.3 http.conf 說明

/usr/local/apache/conf/httpd.conf 是 Apache 的主要設(shè)定檔。檔案中有 # 為開頭者是批注,用以說明設(shè)定的情形及方式,如果一行的開頭有 # 的話,該行對 Apache 就不會產(chǎn)生作用。全文可以分成三個部份,第一個區(qū)段是全域設(shè)定,用來設(shè)定 apache 執(zhí)行時的重要設(shè)定。第二個部份是主要主機(jī)的設(shè)定,針對主要對外提供服務(wù)的主機(jī)加以設(shè)定。第三個部份是虛擬主機(jī)的設(shè)定,你可以在一臺機(jī)器上設(shè)定多個 domain name 或多個 IP ,并針對不同的 domain 來設(shè)定不同的目錄及相關(guān)參數(shù)。如果你有安裝 ssl,那么還有第四個部份是 ssl 的設(shè)定。

修改完 httpd.conf 后,記得使用 /usr/local/apache/bin/apachectl restart 來重新啟動 Apache。如果您使用 port 安裝 Apache ,請使用 /usr/local/sbin/apachectl restart 來重新啟動。

11.3.1 全域設(shè)定部份

# ServerType 可以設(shè)定為 inetd 或是 standalone。
# standalone 是采獨(dú)立常駐的方式,即開機(jī)時就常駐于系統(tǒng)中。
# 若是設(shè)定為inetd時,則是由inetd這個deamon來啟動相關(guān)服務(wù)程序。
# 一般來說以standalone的方式Server的效率會比較好,
# 除非您有特別的需要,否則建議以standalone的方式即可。
ServerType standalone

# apache 的根目錄,就是你安裝 apache 的目錄
ServerRoot "/usr/local/apache"

# 使用 NFS 時才會用到這項設(shè)定
#LockFile /usr/local/apache/logs/httpd.lock

# apache 啟動時會記錄 process id,并將它寫在下列設(shè)定的檔案中。
PidFile /usr/local/apache/logs/httpd.pid

# 設(shè)定 apache 程序的相關(guān)信息記錄文件
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard

# 在 apache 1.3.6 版以前,還多了二個設(shè)定檔,就是 access.conf
# 及srm.conf,新版己經(jīng)不需要了
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf

# 設(shè)定和 client 幾秒內(nèi)仍無法連上即切斷和 client 的聯(lián)機(jī)
Timeout 300

# 可以設(shè)定為 On 或 Off,表示在完成 client 的聯(lián)機(jī)要求后,
# 是否要立即切斷聯(lián)機(jī)。一般會保持聯(lián)機(jī),以服務(wù)下一次的聯(lián)機(jī)
# 請求。如果設(shè)為 Off,每一次的聯(lián)機(jī)要求結(jié)束后,都會關(guān)閉連結(jié),
# 下一次的請求則要再開一個新的程序,這樣速度較慢。除非你的
# 硬件真的很差,每法同時有太多的程序,否則都設(shè)為 ON,
# 以增加速度
KeepAlive On

# 同時保持聯(lián)機(jī)要求的上限。如果你 KeepAlive 設(shè)為 On,這里才
# 會有作用。你可以依照自己的備配提高這個值,以提高效能。
# 如果設(shè)為 0 表示不限制
MaxKeepAliveRequests 100

# 設(shè)定持續(xù)聯(lián)機(jī)時等待客戶端下一個請求的時間
# 超過此時間則視為聯(lián)機(jī)中斷
KeepAliveTimeout 15

# Apache 會動態(tài)的依照系統(tǒng)系統(tǒng)的負(fù)載來調(diào)整所需的程序
# Apache 會定期檢查有多少聯(lián)機(jī)要求在等待中
# 會在這個范圍中自動啟動適當(dāng)數(shù)目的程序來等待請求
# 這里的設(shè)定己滿足大多數(shù)網(wǎng)站的需求,你不必做更改
MinSpareServers 5
MaxSpareServers 10

# 如果你是以 standalone 的方式啟動 Apahce
# 這里是設(shè)定啟動時要同時啟動多少個程序來等待聯(lián)機(jī)請求
StartServers 5

# 同一時間可以聯(lián)機(jī)的 client 數(shù)目,這個數(shù)目不應(yīng)該太小
# 你可以依自己的硬件來調(diào)高這個值
MaxClients 150

# 每個請求子程序(child process)的最大數(shù)目。太多的子程
# 序會占用內(nèi)存及資源,如果設(shè)為 0 表示不限制
MaxRequestsPerChild 0

# 如果有設(shè)虛擬主機(jī)的話,你可以設(shè)定 Apache 要 listen 的
# IP或Port,當(dāng)所架設(shè)的虛擬主機(jī)若不在80端口號時,您就必須
# 在這指定其它埠號提醒Apache監(jiān)看某個埠號。
#Listen 3000
#Listen 12.34.56.78:80

# 虛擬主機(jī)的相關(guān)設(shè)定,設(shè)定 Apache 可以接受聯(lián)機(jī)請求的
# IP 地址或Domain Name,其設(shè)定值可以是 * 、 IP 地址或
# 是完整的 Domain Name。
#BindAddress *

# Dynamic Shared Object (DSO) Support
# 動態(tài)分享對象模塊??墒?Apache在執(zhí)行時直接
# 加入某些需要的模塊,使Apache在執(zhí)行上更具彈性。
# 下列的各模塊順序很重要,最好不要隨意更動
# Example:
# LoadModule foo_module libexec/mod_foo.so
LoadModule env_module         libexec/mod_env.so
.....略.....

# 是否要允許以 http://yourserver/server-status 來顯示
# 服務(wù)器的設(shè)定狀態(tài),預(yù)設(shè)是 Off。如果要設(shè)為 On,還必須
# 要設(shè)定下面  的部份
#ExtendedStatus On

11.3.2 主要主機(jī)設(shè)定

### Section 2: 'Main' server configuration
# 如果你是以 inetd 的方式啟動 Apache,以下的部份設(shè)定
# 并不會發(fā)生作用

# 設(shè)定 standalone 要傾聽的 port,如果 port 小于 1023
# 必須要以 root 才能啟動 Apache
Port 80

##  SSL 支援
##  如果有使用 SSL,設(shè)定 SSL 要聽的 port

Listen 80
Listen 443


# 如果你希望啟動 Apache 的使用者和跑 httpd 的使用者是
# 不同人的話,必須以 root 來啟動,這里的設(shè)定就是你要使用的
# 使用者名稱及其所屬群組。所設(shè)的使用者必須是真的存在于系統(tǒng)
# 千萬不要設(shè)成 root ,這對于安全上非常重要。
User nobody
Group nobody

#
# ServerAdmin: 你的信箱,這個信箱地址當(dāng)網(wǎng)頁出現(xiàn)錯誤訊息時
# 將出現(xiàn)在該頁面上
#
ServerAdmin www@mydomain.com

#
# ServerName 讓你可以設(shè)定一個主機(jī)名稱,該名稱和使用者聯(lián)機(jī)
# 的名稱不同時,會傳回去給使用者。你可以設(shè)和你真實的主機(jī)
# 名稱不同,例如你可以在你的主機(jī)名稱前多加一個 www
#
# 請注意:你不能自己發(fā)明一個主機(jī)名稱并希望它可以運(yùn)作,
# 這個主機(jī)名稱對你的機(jī)器而言,必須要是一個有效的 DNS name
# 如果你的主機(jī)并未擁有主機(jī)名稱,你可以使用 IP address
# 例如,123.45.67.89。如果你真實的 IP 都沒有,你可以使用
#  127.0.0.1,這是 TCP/IP local loop-back 的地址,
# 通常用來作 localhost
#
ServerName www.alexwang.com

#
# DocumentRoot: 這個目錄是你放網(wǎng)頁的地方,你也可以放超級鏈接
# 來將首頁指向其它地方。
DocumentRoot "/home/www"

#
# 所有 Apache 存取的目錄都可以對它們的屬性加以設(shè)定
#
# 首先我們先設(shè)定預(yù)設(shè)的權(quán)限
#

    Options FollowSymLinks
    AllowOverride None


#
# 這里的設(shè)定是針對你網(wǎng)頁存放目錄及其子目錄
#
# 這里可以使用的選項有 "All", "None", 或者是混合下列各項:
# "Indexes", "Includes","FollowSymLinks","ExecCGI",
# "MultiViews"
# Indexs 表示如果若找不到目錄中預(yù)設(shè)的首頁(DirectoryIndex
# 設(shè)定的檔案) 時,Apache 會自動產(chǎn)生index 列出目錄中的檔案。
# FollowSymlinks 表示允許符號鏈接(Symbolic Link)功能,
# 如果沒有此選項,Server會忽略系統(tǒng)中的連結(jié)檔案。
# Includes 允許SSI(Server Side Include)可以在該目錄下執(zhí)行
# ExecCGI 允許執(zhí)行CGI,若無此選項則該目錄中無法執(zhí)行CGI程序
# MultiViews 允許內(nèi)容協(xié)商的 MultiViews。
# None 關(guān)閉所有的選項,只允許Read。
# All 開啟所有的選項,除了MultiViews之外。
# 請注意,"MultiViews" 一定要明確寫出來,使用 "Options All"
# 并未包含 MultiViews。
#

    Options Indexes FollowSymLinks MultiViews ExecCGI

#
# 這個選項是用來控制目錄中的 .htaccess 檔案可不可以覆蓋原本
# 對該目錄所設(shè)的權(quán)限。這個選項可以是 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

#
# 控制誰可以連到這個服務(wù)器
# Order 表示先處理 allow 或是 deny。這里是先 allow 再 deny
# 這里 allow 跟 deny 的上下順序必須跟Order中所設(shè)定的順序
# 是一樣才可以。
# Allow from all 表示任何人都可以連到服務(wù)器的這個目錄來瀏覽
# 若是設(shè)為Allow from freebsd.org 的話,則表示只有網(wǎng)域是
# 在freebsd.org 的人才可以連到該目錄中觀看。
# 當(dāng)然若不想讓某些人連過來觀看這個目錄的網(wǎng)頁
# 可以加一行Deny from bad.Domain.com,當(dāng)然您也可
# 以使用 IP 來代替 Domaine
#
    Order allow,deny
    Allow from all


#
# UserDir: 機(jī)器中的使用者預(yù)設(shè)放網(wǎng)頁的地方是在使用者
# 家目錄的那個目錄下使用者可以用
# http://www.hostname.com/~user 來連到 user 的首頁
#

    UserDir public_html


#
# 控制 UserDir 目錄的權(quán)限,和上述的差不多。
#
#    AllowOverride FileInfo AuthConfig Limit
#    Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
#    
#        Order allow,deny
#        Allow from all
#    
#    
#        Order deny,allow
#        Deny from all
#    
#

#
# DirectoryIndex: 當(dāng)連到目錄時,預(yù)設(shè)的網(wǎng)頁是哪一個
# 你可以用空白作為間隔,設(shè)定多個檔案,將依所設(shè)的順序?qū)ふ?
# 最好加入 index.htm 及 index.html,如果有使用 PHP 的話
# 應(yīng)該要再加入 index.php
#

    DirectoryIndex index.html index.php index.htm


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

#
# 下列的設(shè)定是用來避免 .htaccess 檔案被客戶端使用者看到
# 既然 .htaccess 是用來控制權(quán)限的,你當(dāng)然不會希望他被看到
# 另外,還有 .htpasswd 等檔案是用來控制該目錄密碼的,
# 這里的設(shè)定也會影響其它 .ht 開頭的檔案
#

    Order allow,deny
    Deny from all

#
# CacheNegotiatedDocs: 這個設(shè)定是用來告訴外面的 proxy
# 不要保留我的檔案,預(yù)設(shè)是批注掉,以降低流量
#
#CacheNegotiatedDocs

#
# UseCanonicalName: 使用這項設(shè)定以供 Apache 在需要時可以重
# 建自己的URL (響應(yīng)該文件是從哪個 URL 出來的)。它將使用
# hostname:port 去響應(yīng)要求,這個設(shè)定會影響 CGI 中的
# SERVER_NAME 及 SERVER_PORT
#
UseCanonicalName On

#
# TypesConfig 用來描述要去哪里找 mine.types 的檔案
#

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


#
# DefaultType 是網(wǎng)頁文件預(yù)設(shè)的 MIME type,你可以將它定義為
# "text/plain" 代表文件是 HTML 格式。如果你大多數(shù)的文件是
# binary 文件或是圖形,你可以使用 "application/octet-stream"
#
DefaultType text/plain

#
# mod_mime_magic module 使服務(wù)器可以自己決定使用什
# 么 MIME type
# MIMEMagicFile 就是告訴該 module 要去哪里找這些定義
# mod_mime_magic 并不是內(nèi)定的 module,你可以重新編譯自行加入
# 這里的 MIMEMagicFile 只有在包含了該模塊后才有作用
#

    MIMEMagicFile /usr/local/apache/conf/magic


#
# HostnameLookups: 定義在 log 文件中要記錄 IP 或是 hostname
# 例如: www.apache.org (on) or 204.62.129.132 (off).
# 不要打開以節(jié)省向 DNS Server 要求解析的時間
#
HostnameLookups Off

#
# ErrorLog: 設(shè)定錯誤訊息的 log 要放在哪個檔案
# 如果你有設(shè)定在設(shè)定虛擬主機(jī)時另外指定它的 log 檔的話
# 該虛擬主機(jī)的 log 會在你所設(shè)定的地方
#
ErrorLog /var/log/apache_error_log

#
# LogLevel: 控制錯誤訊息的記錄等級
# 可以設(shè)為: debug, info, notice, warn,error,crit,alert,emerg
# debug一般用是在程序的除錯開發(fā)使用的
# info是指一般的信息,notice指通知訊息
# warn指的是提示訊息,error指的是錯誤的訊息
# alert是指警告訊息,emerg則是緊急訊息
#
LogLevel warn

#
# 下列是自訂記錄文件格式,并取一個名字給它們
# 你可以在下列的設(shè)定中決定要記錄哪一種
# 這里共取了四個名字,combin,common,referer,agent
# 四種都有不同的記錄內(nèi)容,以 combin 最詳細(xì)
#
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

#
# 設(shè)定有人存取檔案時要記錄哪些東西(依 common 的設(shè)定格式)
# 并指定要存放在哪里
#
CustomLog /var/log/apache_access_log common

#
# 如果你想要再指定記錄其它東西的話,可以在這里設(shè)定
#
#CustomLog /usr/local/apache/logs/referer_log referer
#CustomLog /usr/local/apache/logs/agent_log agent
#CustomLog /usr/local/apache/logs/access_log combined

#
# 設(shè)定是否將Server的版本和虛擬主機(jī)等信息加入網(wǎng)頁中
#(通常出現(xiàn)在網(wǎng)頁錯誤或FTP列表時),Off表示關(guān)閉,
# EMail則是會把ServerAdmin的E-Mail連結(jié)加進(jìn)去。
# 只能設(shè)下列三者之一:  On | Off | EMail
#
ServerSignature On


#
# Aliases: 你可以再這里設(shè)定任何的別名,格式是
# Alias fakename realname
#

    #
    # 請注意,如果你在別名(fakename)中加入了 / ,就必須在
    # URL 中表示出來。所以這里 "/icons" 并未使用別名
    # 只有 "/icons/" 才有。如果 fakename 以 / 結(jié)束,則
    # realname 也要有,反之亦然。
    # 下面的 Options 等設(shè)定是該別名的目錄設(shè)定
    #
    Alias /icons/ "/usr/local/apache/icons/"

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

    #
    # ScriptAlias: 這用來控制 CGI 的連結(jié)
    # 注意需將Options的選項改為ExecCGI,才可以使用 CGI
    #
    ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

    
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    


# End of aliases.


#
# 控制服務(wù)器如何列出目錄內(nèi)容
#


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

    #
    # AddIcon* 控制如何依不同檔案格示顯示小圖式
    # 是給 FancyIndexing 用的
    #
    AddIconByEncoding (CMP,/icons/compressed.gif) 略

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

    #
    # DefaultIcon 是當(dāng)不知格式時用的小圖式
    #
    DefaultIcon /icons/unknown.gif

    #
    # AddDescription 可以讓你對該檔案格式加以描述
    # 格式: AddDescription "description" filename
    #
    #AddDescription "GZIP compressed document" .gz
    #AddDescription "tar archive" .tar
    #AddDescription "GZIP compressed tar archive" .tgz

    #
    # ReadmeName 是服務(wù)器要去找的 README 文件名稱
    # 預(yù)設(shè)將列出在目錄的清單之后
    #
    # HeaderName 是要加在目錄清單前顯示的文件名稱
    #
    # 如果在 Option 中有設(shè) MultiViews 的話,服務(wù)器會先去找
    # name.html 并包含它,如果該檔不存在就會去找 name.txt
    #
    ReadmeName README
    HeaderName HEADER

    #
    # IndexIgnore 是設(shè)定目錄中那個檔案不列出
    # 可以使用萬用字符 *
    #
    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t


# End of indexing directives.

#
# 文件格式Document types.
#


    #
    # AddEncoding 設(shè)定編碼形式和所對應(yīng)的擴(kuò)展名。
    #
    AddEncoding x-compress Z
    AddEncoding x-gzip gz tgz

    #
    # AddLanguage 讓你可以設(shè)定文件所要告知瀏覽器使用的語言,
    #
    # 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 設(shè)定使用語這的先后順序
    #

    
    LanguagePriority en tw da nl et fr de el
    

    #
    # AddType 設(shè)定 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 設(shè)定CGI-script和所對應(yīng)的擴(kuò)展名。若您會
    # 使用到CGI程序,則必須將其批注拿掉打開其功能。
    # 另外,有的CGI的擴(kuò)展名會用到.pl,所以最好也加入。
    #
    # To use CGI scripts:
    #
    AddHandler cgi-script .cgi

    #
    # 設(shè)定是否加入有SSI功能的HTML和所對應(yīng)的擴(kuò)展名。
    # 若您會使用到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

#
# 格式化網(wǎng)頁錯誤的訊息響應(yīng) (Apache style)
#  these come in three flavors
#
#    1) plain text
#ErrorDocument 500 "The server made a boo boo.
#  注意 (") 的標(biāo)志并不會顯示
#
#    2) local redirects
ErrorDocument 404 /missing.html
#  設(shè)定當(dāng)找不到網(wǎng)頁時就顯示 URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#
#    3) external redirects
#ErrorDocument 402 http://server.com/subscription_info.html

#
# 對各種瀏覽器作不同回應(yīng)
#


    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 對各種瀏覽器作不同回應(yīng)
#
# 是否允許使用 http://servername/server-status 來
# 顯示服務(wù)器狀態(tài)
# 將 ".your_domain.com" 改成許可連結(jié)的網(wǎng)域
#
# 
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
# 

#
# 是否允許使用 http://servername/server-info 來
# 顯示服務(wù)器信息 (必需要有加載mod_info.c)
# 將 ".your_domain.com" 改成許可連結(jié)的網(wǎng)域
# 
#    SetHandler server-info
#    Order deny,allow
#    Deny from all
#    Allow from .your_domain.com
# 

#
# 為防止Apache一個 1.1 版以前舊bug發(fā)生,用來將錯誤
# 轉(zhuǎn)向處理并記錄的指令
# 
# 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 虛擬主機(jī)及 SSL的設(shè)定

### Section 3: Virtual Hosts
#
# VirtualHost: 你可以在一臺機(jī)器上使用多個主機(jī)名稱
# 或 IP,并指定使用不同的目錄及設(shè)定
#

#
# 指定要使用的虛擬主機(jī)名稱或IP及port
#
#NameVirtualHost *

#
# VirtualHost 范例
# 第一個設(shè)定是當(dāng)未知主機(jī)名稱時用的
#<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 設(shè)定
##  我將省略大多數(shù)的說明
##  只寫我們要改的地方
##  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>

# 在這里改你的網(wǎng)頁地址及 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 的設(shè)定檔,若您使用 ports 安裝,則你必須將設(shè)定文件范例 /usr/local/etc/php.ini.dist 復(fù)制成 /usr/local/etc/php.ini。如使用自行編譯安裝,則在安裝完 PHP 時,我們從 PHP 原始碼中復(fù)制一份 php.ini-dist/usr/local/lib/php.ini,這樣我們才可以針對 PHP 來調(diào)整成我們要的參數(shù)。檔案的格式是以 ";" 為批注、以 [ ] 包起來的是區(qū)段的名稱,二種都不會代表任何意義。修改完 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>

當(dāng)上述的 HTML 按了送出之后,在 test.php 這個程序就會有一個變量名為 $username,其值是我們所填入的名稱。

但是使用者也可以直接在網(wǎng)址列輸入 http://url/test.php?username=myname 來設(shè)定 $username 這個變量的值為 myname。

這會有什么問題呢?讓我們以 PHP 4.1.0 release note 所提出的例子來說明。假設(shè)我們有一個程序如下:

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

使用者可以經(jīng)由網(wǎng)址列輸入一個變量 $authenticated=true,這樣一來,不管是否通過 authenticate_user() 的檢查,$authenticated 永遠(yuǎn)都是 true。

所以在 4.1.0 之后,有一個新的方式可以讓我們使用,就是將傳進(jìn)來的變量全部都存在數(shù)組中。以第一個例子而言,我們以 POST 的方式從窗體傳來變量 $username,新的取得變量方式是:$_POST["username"],也就是說所有以 POST 傳遞過來的變量全部存在 $_POST 這個數(shù)組中。詳細(xì)說明請參考 http://www.php.net/release_4_1_0.php

在 4.2.0 之前,新舊二種方式都可以使用,但是在 4.2.0 之后,Default 只能使用新的方式來傳遞變量。所以如果你安裝的了新 PHP 而發(fā)現(xiàn)無法使用舊的 PHP 程序,別驚訝。

如果您還是要以舊的方式來傳遞變量,請修改 php.ini (通常位于 /usr/local/lib/),將原本的 register_globals = Off 改成下列這個樣子,并移除開頭的批注符號 ";":

; register_globals = Off
register_globals = On

新的方式下,用來存放變量的數(shù)組有下列七種:

除此之外,我們不太需要更改 php.ini 的設(shè)定,但如果你想要對它有更深入的了解,我們會一一說明:

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

;;;;;;;;;;;;;;;;;;;
;  關(guān)于這個檔案   ;
;;;;;;;;;;;;;;;;;;;
;
; 在這里設(shè)定的參數(shù)名稱有大小寫之分
; 例如 -  foo=bar 和 FOO=bar 所代表的意義不同
;
; 所設(shè)定的值可以是字符串、數(shù)字、PHP 的常數(shù) (如 E_ALL 或 M_PI)
; INI 常數(shù) (On, Off, True, False, Yes, No and None) 或是
; 一個運(yùn)算表示式 (如 E_ALL & ~E_NOTICE), 或是引號內(nèi)的字符串 ("foo")
;
; 運(yùn)算表示式在 INI 檔中只能使用下列符號及運(yùn)算子
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布爾運(yùn)算 (Boolean) 可以使用下列的值作為真:1, On, True 或是 Yes
; 也可以使用下列的值作為假: 0, Off, False 或 No
;
; 如果要指一個空字符串,只可在等號后什么都不加,或是以 none 表示。
;
; foo = ; 將變量 foo 設(shè)為空字符串
; foo = none ; 將變量 foo 設(shè)為空字符串
; foo = "none" ; 將變量 foo 設(shè)成字符串 'none'
;
; 你果你要動態(tài)加載一些表示式所方的變量 (可能是 PHP extension
; 或是 Zend extension),你必須在加載后才能使用該變量
;
; 所有 php.ini-dist 的設(shè)定都是內(nèi)建的默認(rèn)值,如果沒有 php.ini 時
; 或者當(dāng)你刪除該行,就會使用內(nèi)建的默認(rèn)值

;;;;;;;;;;;;;;;;;;;;
;  程序語言選項    ;
;;;;;;;;;;;;;;;;;;;;

; 是否要在 Apache 中啟動 php 引擎
engine = On

; 可以使用 <? 的標(biāo)簽,不然的話,只能使用 <?php 和 <script>
short_open_tag = On

; 是否允許 ASP 格式的標(biāo)簽 <% %>
asp_tags = Off

; 使用浮點(diǎn)數(shù) (floating point numbers) 要用多少數(shù)字
precision = 12

; Enforce year 2000 compliance (在某些瀏覽器可能會產(chǎn)生問題)
y2k_compliance = On

; output buffering 可以讓你就算已經(jīng)送出 body content 后,還
; 可以再送 header (包括 cookies),只是這樣會減慢一點(diǎn) php 輸
; 出的速度。你也可以在執(zhí)行程序時呼叫 output buffering 的函式
; 來取得這項功能?;蛘呔驮谶@里設(shè)成 On 來啟動吧。
; 一般我會設(shè)成 Off,只有當(dāng)你很常用到這個功能才設(shè)成 On。
output_buffering = Off

; 你可以將你的 php 程序輸出轉(zhuǎn)向到一個函式,例如,如果你
; 將 output_handler 設(shè)為 "ob_gzhandler", 輸出將會使用 gzip
; 壓縮網(wǎng)頁給瀏覽器
output_handler =

; 壓縮輸出要使用 zlib 函式庫,這里可以使用的值可以是
; 'off', 'on', 或者是用在壓縮的暫存區(qū)大小 (預(yù)設(shè)是 4KB)
zlib.output_compression = Off

; Implicit flush 告訴 PHP 每次輸出一個區(qū)段都要 flush 強(qiáng)制
; 將暫存區(qū)的東西輸出給瀏覽器。這和在 PHP 程序在 print() 或
; echo() 之后呼叫 flush() 函式有相同的效果。這個選項最好不
; 要打開,否則效率差很多,只有用于除錯時才會打開他。
implicit_flush = Off

; 是否要強(qiáng)制在呼叫變量時都使用傳址呼叫,這個功能未來版本的
; PHP/Zend 將取消。比較好的方式是在函式定義時就宣告變量的
; 呼叫方式以傳址呼叫。你可以在這里將它設(shè)為 Off,來看你所寫
; 的程序是否可以在未來版本的 PHP 執(zhí)行,而參數(shù)在傳遞時就會以
; 值,而非在內(nèi)存地址。
allow_call_time_pass_reference = On


;
; 安全模式
;
safe_mode = Off

safe_mode_exec_dir =

; 設(shè)定一些環(huán)境變量可能造成安全性的破壞
; 這些變數(shù)如 comma-delimited list of prefixes。在安全模
; 式,使用著只能使用所定義的前綴字符串作起始的變量,預(yù)設(shè)
; 只有以 PHP_ 作開始的變量 (如 PHP_FOO=BAR)
;
; 請注意:如果設(shè)為空字符串,PHP 允許使用者設(shè)任何環(huán)境變量
safe_mode_allowed_env_vars = PHP_

; 這個指令包含了使用者不能以 putenv() 改變的環(huán)境變量
; 的 comma-delimited list ,這個變量可以所設(shè)定的保護(hù)
; 就算 safe_mode_allowed_env_vars 設(shè)定允許也不能改變
safe_mode_protected_env_vars = LD_LIBRARY_PATH

; 這個設(shè)定可以讓你因為安全的理由而取消一些函式
; 不管你的 Safe Mode 是設(shè)為 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


;
; 其它設(shè)定
;
; 決定是否要在服務(wù)器上使用 PHP
expose_php = On


;;;;;;;;;;;;;;;;;;;
;   資源限制      ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30 ; 每個 PHP 程序最大的執(zhí)行時間
memory_limit = 8M ; 每個 PHP 程序最大可以消耗多少內(nèi)存 (8MB)


;;;;;;;;;;;;;;;;;;;;;;;;;;
;    錯誤的處理及記錄    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;

; error_reporting 可以讓你設(shè)定要回報的錯誤內(nèi)容
; E_ALL - All errors and warnings,所有錯誤及警告
; E_ERROR - fatal run-time errors,執(zhí)行時的致命錯誤
; E_WARNING - run-time warnings (non-fatal errors),執(zhí)行時的警告
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (這個警告通常是你的程序代碼有問題
; 或者也有可能是內(nèi)部錯誤 (例如使用一個未初始化的變量)
; E_CORE_ERROR - 當(dāng) PHP 起始時的 fatal errors
; E_CORE_WARNING - 當(dāng) 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

; 將錯誤顯示在輸出的頁面上, 如果是輸出網(wǎng)頁,建議你把這個功能
; 關(guān)掉,并以 error logging 將它記錄在檔案中。否則顯示一些錯誤
; 在網(wǎng)頁上可能會有潛在的安全問題,如檔案位置、數(shù)據(jù)庫的輪廓或是
; 一些其它的信息
display_errors = On

; 就算打開了 display_errors,在起始 PHP 時發(fā)生的錯誤并不會顯示
; 建議你除了除錯外不要打開這個功能
display_startup_errors = Off

; 將錯誤記錄在檔案中,建議你將網(wǎng)頁產(chǎn)生的錯誤記錄下來
; 這個打開后,將會記錄在你 Apache 的 error_log 檔中
;log_errors = Off
log_errors = On

; 是否要將最后的錯誤訊息存在 $php_errormsg 的變量中
track_errors = Off

; 在輸出錯誤訊息前要先輸出什么字符串,
; 可以用來改變網(wǎng)頁中字的顏色
;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

; 如果在字符串上使用 + 的運(yùn)算是否要警告
warn_plus_overloading = Off


;;;;;;;;;;;;;;
;  數(shù)據(jù)處理  ;
;;;;;;;;;;;;;;
;
; 請注意 - track_vars 在 PHP 4.0.3 中永遠(yuǎn)有效

; PHP 如何處理輸出給 URL 多個變量,用什么字
; 串將它們分開,預(yù)設(shè)是 "&"
;arg_separator.output = "&"

; PHP 如何處理從 URL 傳來的多個變量,用什么字
; 串將它們分開,預(yù)設(shè)是 "&"
; 請注意:這里設(shè)中字的任可一個 "字符" 都將視為一個分開的符號
;arg_separator.input = ";&"

; 這里的設(shè)定是當(dāng) PHP 接收來自 GET, POST, Cookie,環(huán)境變量(
; Environment) 和 內(nèi)建變數(shù) (Built-in variables)有重復(fù)時,
; 要處理的順序。以 (G, P, C, E & S 表示上述的方法,可以寫成
; EGPCS 或 GPC). 處理的順序是由左至右,當(dāng)變量名稱相同時,
; 比較慢處理的將覆蓋舊的值。
variables_order = "EGPCS"

; 是否要將 EGPCS 的變量注冊成全域變量
; 這個當(dāng)你在以 $HTTP_*_VARS[] 處理 GPC 變量時就有作用
;
; 如果不打開這個選項,在 PHP 中就不能使用 $var 的方式來取得
; HTML 傳來的變量,必須要使用 $_POST["var"]來取得。新的方式將
; 所有變量存在數(shù)組中,例如,從網(wǎng)頁以 POST 窗體傳來的變量會全部存
; 在 $_POST 這個數(shù)組中。詳情請參考 PHP 4.1.0 的 Release Note
; PHP 4.2.0 之后,預(yù)設(shè)是不打開的,但是這樣一來,有許多舊的
; PHP 程序都不能執(zhí)行了。因此如果你的程序關(guān)于變量的寫法如果是
; 使用舊的方式,你必須將這個功能打開。
register_globals = On

; 這是要告訴 PHP 是否要注冊 argv&argc 變量 (這包含 GET 的信息)
; 如果你不使用它,則可以關(guān)掉以增加處理效率
register_argc_argv = On

; 設(shè)定 PHP 在接收 POST 數(shù)據(jù)時最大的容量大小
post_max_size = 8M

; 這個選項已沒有作用,請使用 variables_order 替代它
gpc_order = "GPC"

; Magic quotes
;
; GET/POST/Cookie 進(jìn)來時使用 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
; 如果要把內(nèi)定使用語言取消,就把 charset 設(shè)為空字符串
;
; PHP 預(yù)設(shè)使用的 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 =

; 當(dāng) php 以 /~usernamem 打開文件時,所要使用的目錄
; 就是使用者目錄中 PHP 文件要放在哪里
; 只有非空字符串才有作用
user_dir =

; 其它可以加載的模塊位置
extension_dir = ./

; 是否要使用 dl() 函式。dl() 在一些多重執(zhí)行緒的服務(wù)器
; 可能不會運(yùn)作,如 IIS 或 Zeus,這時它會自動取消 dl()
enable_dl = On


;;;;;;;;;;;;;;;;
;   檔案上傳   ;
;;;;;;;;;;;;;;;;

; 是否要使用 HTTP 上傳檔案
file_uploads = On

; 上傳檔案時所要使用的暫存目錄,如果沒有指定就會使用系
; 統(tǒng)內(nèi)定的暫存目錄
;upload_tmp_dir =

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


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

; 是否允許使用 URL (如 http:// 或 ftp://) 做為 fopen() 所
; 要開啟的檔案
allow_url_fopen = On

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

;;;;;;;;;;;;;;;;;;
;  動態(tài)延伸模塊  ;
;;;;;;;;;;;;;;;;;;
;
; 如果你希望自動加載延伸模塊,請使用下列設(shè)定
;
; extension=modulename.extension
;
; 例如在 windows 下,使用:
;
; extension=msql.dll
;
; ... 或在 UNIX:
;
; extension=msql.so
;
; 請注意,這里只能用模塊名稱,不能包含目錄
; 你要先在上面的 extension_dir 設(shè)定模塊的目錄


;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


;;;;;;;;;;;;;;
;  模塊設(shè)定  ;
;;;;;;;;;;;;;;

[Syslog]
; 是否要定義 syslog 變量,如 $LOG_PID, $LOG_CRON 等。
; 關(guān)掉它會有比較好的執(zhí)行效率
; 你可以在程序中使用 define_syslog_variables() 來定義它們
define_syslog_variables = Off

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

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

; 只用于 Unix,你也可以加入?yún)?shù) (內(nèi)定值: 'sendmail -t -i').
;sendmail_path =

[Logging]
; 這個設(shè)定用于 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]
; 讓你可以做持續(xù)的連結(jié)數(shù)據(jù)庫
mysql.allow_persistent = On

; 最大的持續(xù)連結(jié), -1 表示不限
mysql.max_persistent = -1

; 最大的連結(jié) (持續(xù)連結(jié) + 非持續(xù)連結(jié))。 -1 表示不限
mysql.max_links = -1

; mysql_connect() 預(yù)設(shè)使用的 port。如困沒有設(shè)定,
; mysql_connect() 將使用 $MYSQL_TCP_PORT 或者是 mysql
; 在 /etc/services 中的設(shè)定或是在安裝編輯時所設(shè)的 MYSQL_PORT
mysql.default_port =

; MySQL 作本地連結(jié)時內(nèi)定使用的 socket name
; 如果沒有設(shè)定,將以 MySQL 預(yù)設(shè)為主
mysql.default_socket =

; mysql_connect() 內(nèi)定所使用的主機(jī) (在安全模式中沒有作用)
mysql.default_host =

; mysql_connect() 內(nèi)定的使用者 (在安全模式中沒有作用)
mysql.default_user =

; mysql_connect() 內(nèi)定的密碼 (在安全模式中沒有作用)
; 請注意,將密碼存在這個文件中并不是一個好的方法
; *任何* PHP 程序都可以經(jīng)由
; 'echo cfg_get_var("mysql.default_password") 來取得密碼
; 所有使用者都將知道密碼
mysql.default_password =

[mSQL]
; 允許使用持續(xù)的連結(jié)數(shù)據(jù)庫
msql.allow_persistent = On

;...以各種數(shù)據(jù)庫的設(shè)定都和 MySQL 差不多,故略...

[Session]
; Handler 所使用儲存及取得的數(shù)據(jù)
session.save_handler = files

; 傳遞給 save_handler 的參數(shù)。這是 session 將存信息的目錄
session.save_path = /tmp

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


; session 的名稱(用來作 cookies 名稱)
session.name = PHPSESSID

; 啟動時是否要重設(shè) session
session.auto_start = 0

; cookie 要存在幾秒,如果是 0,代表直到重新啟動瀏覽器
session.cookie_lifetime = 600

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

;  cookie 的主機(jī)來源
session.cookie_domain =

; Handler 使用的 serialize data.
; php 是 PHP 標(biāo)準(zhǔn)使用的 serialize data
session.serialize_handler = php

; 是否要在 session 重設(shè)時啟動'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

; 存在暫存區(qū)中的 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 和之前的數(shù)據(jù)庫差不多,故略...
; ...以下略

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

11.5 .htaccess 應(yīng)用

Apache 允許使用者在目錄下放置一個檔案 來控制該目錄的存取權(quán)限。預(yù)設(shè)是使用 .htaccess 這個檔。 你可以自行用文書軟件編輯一個文件名為 .htaccess 的檔案來設(shè)定檔案所在目錄的權(quán)限。 不過也要看 httpd.conf 中關(guān)于該目錄的 AllowOverride 是否有打開,如果有打開才可以用 .htaccess 的檔案去覆蓋原本對該目錄的設(shè)定。

首先先編輯 /usr/local/apache/conf/httpd.conf,在網(wǎng)頁目錄設(shè)定的區(qū)段:

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

在設(shè)定 AllowOverride 的部份,如果設(shè)為 None 表示不允許使用者變更目錄設(shè)定,設(shè)為 AuthConfig 表示可以使用 AuthDBMGroupFile、 AuthDBMUserFile, AuthGroupFile、AuthName、AuthType 等認(rèn)證的功能。所以我們設(shè)定為 AuthConfig。
如果 Directory 的區(qū)段中,AllowOverride 是設(shè)成 All,你就可以在 .htaccess 檔案中設(shè)定所有選項,如 Options, AllowOverride 等。

實際應(yīng)用

.htaccess 最常用的一個例子是用來將目錄設(shè)定需認(rèn)證才能讀取。假設(shè)你要將某個目錄設(shè)定需要密碼才能讀取,你可以在該目錄下編輯一個名為 .htaccess 的文字文件,內(nèi)容如下:

AuthName "管理專區(qū)"
AuthType "Basic"
AuthUserFile "/var/adminDir.pw"
require valid-user

其中請注意各參數(shù)的大小寫。這里我們設(shè)定儲存使用者賬號及密碼的檔案是 /var/adminDir.pw。

接著使用指令:

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

來建立檔案 /var/adminDir.pw 并加入使用者 username,日后要再新增使用者不必加參數(shù) -c。

接著使用瀏覽器連到該目錄時,將出現(xiàn)圖 11-2:

圖 11-2

此時輸入你設(shè)定的 username 及密碼即可。

11.6 虛擬主機(jī)

我們可以在一臺機(jī)器上設(shè)定多個主機(jī)名稱或 IP,并依不同名稱來決定其根目錄所在。當(dāng)使用者聯(lián)機(jī)到我們的主機(jī)時,每一個不同的名稱所看到的根目錄都不同。

要達(dá)到這樣的功能,我們必須先確定主機(jī)有多個 DNS 名稱,這樣別人打該主機(jī)名稱才會對應(yīng)到你的 IP。 我們先來說在一臺主機(jī)上使用多個 DNS 的范例。

假設(shè)你的主機(jī) IP 是 111.222.78.9 ,上面有二個主機(jī)名稱,一個是 www.abc.com,另一個是 www.cde.net。也就是說不管是使用上述哪一個 Domain Name,都可以連到 111.222.78.9。接著請編輯 httpd.conf,在虛擬主機(jī)的部份加入下列設(shè)定:

# 設(shè)定本機(jī)所使用的 IP
NameVirtualHost 111.222.78.9

# 設(shè)定 www.abc.com 的管理者賬號、存放網(wǎng)頁的目錄及l(fā)og 所在
<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>
# 設(shè)定 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>

做完上面的設(shè)定后,就可以使用 /usr/local/apache/bin/apachectl restart 重新啟動 Apache 了。如果你還有別的 Domain Name 指向 111.222.78.9 的話,例如 www.fgh.org ,但你并未設(shè)定其 Virtual Host 數(shù)據(jù),Apache 將以第一個設(shè)定的 Virtual Host 數(shù)據(jù)為主。在這個范例里,當(dāng)你打 www.fgh.org 會連到 www.abc.com 的設(shè)定。

必須要注意的是,有些客戶端的聯(lián)機(jī)軟件并不支持 Name-Based 的虛擬主機(jī),要支持 name-based virtual host,客戶端必須送出 HTTP 的標(biāo)頭,也就是瀏覽器必須支持 HTTP/1.1。請放心,我們常用的 IE、Netscape、lynx 都有支援。

11.7 網(wǎng)頁記錄分析

在我們將所制作好的網(wǎng)頁放在網(wǎng)頁服務(wù)器之后,我們會想知道每一個網(wǎng)頁的瀏覽次數(shù)、使用者的停留時間等等。在 apache 的聯(lián)機(jī)記錄中,可以看到很多使用者瀏覽網(wǎng)頁的記錄,我們可以使用一些工具來分析記錄文件,讓這些記錄文件能更易于閱讀。我們在這里要介紹 webalizer 這套軟件。Webalizer 會讀取 apache 的 log 檔,并將分析結(jié)果存成網(wǎng)頁,讓我們可以經(jīng)由網(wǎng)頁的圖形更輕松的了解每一個頁面的使用情形。由于 webalizer 所進(jìn)行的分析是經(jīng)由讀取 log 檔,因此 log 文件的數(shù)據(jù)越多,分析出來的結(jié)果也就越詳盡。

請使用下列指令安裝 webalizer:

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

在安裝完 webalizer 之后,我們必須先做一些簡單的設(shè)定。在 /usr/local/etc/ 有一個 webalizer 的設(shè)定文件范例 webalizer.conf-dist,我們先將它復(fù)制一份再開始編輯:

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

以下我們將一一說明此設(shè)定檔的內(nèi)容,如果您想要更改其中的設(shè)定,請將該行開頭的井字號移除再開始修改:

# 設(shè)定 Apache 聯(lián)機(jī)記錄文件的位置。
#LogFile        /var/lib/httpd/logs/access_log
LogFile        /var/log/apache_access_log

# 設(shè)定 log 文件的型式,Webalizer 除了 Apache 外,還可以支持分析 FTP 軟件
# 或 proxy 軟件 squid 的 log 文件。LogType 預(yù)設(shè)的值是 'clf',表示分析
# 網(wǎng)頁數(shù)據(jù),你也可以設(shè)定為 ftp 或 squid。
#LogType	clf

# OutputDir 是我們想要輸出分析數(shù)據(jù)的位置。請設(shè)定為網(wǎng)頁根目錄下的某一個
# 目錄。例如我們的網(wǎng)頁根目錄是 /home/www,請先在該目錄下建立一個子目錄
# 名為 traffic,接著再設(shè)定 OutputDir 為 /home/www/traffic。
#OutputDir      /var/lib/httpd/htdocs/usage
OutputDir      /home/www/traffic

# HistoryName 可以讓我們設(shè)定 webalizer 所產(chǎn)生的歷史記錄文件的文件名。這個檔
# 可以用來產(chǎn)生 主要的 HTML 頁面 (index.html),我們不需要修改。
#HistoryName	webalizer.hist

# 由于我們可能會設(shè)定某一段時間自動將 Apache 的 log 壓縮或刪除。而
# Incremental 這個變量可以讓我們在產(chǎn)生分析資料時,只更新增加的部份
# 而分析過的資料就不再分析,以免覆蓋了舊有的資料。
#Incremental	no
Incremental	yes

# 若您設(shè)定 Incremental 為 yes,IncrementalName 可以讓您設(shè)定目前增加
# 的分析數(shù)據(jù)存放位置。
#IncrementalName	webalizer.current

# ReportTitle 是分析結(jié)果網(wǎng)頁的標(biāo)題。在該標(biāo)題后會加上您的主機(jī)名稱。
#ReportTitle    Usage Statistics for

# 設(shè)定您的主機(jī)名稱。
#HostName       localhost

# HTMLExtension 是所產(chǎn)生的 HTML 檔的擴(kuò)展名。
#HTMLExtension  html

# PageType 可以讓您設(shè)定何種擴(kuò)展名結(jié)尾的頁面要加入分析數(shù)據(jù)。因為在
# log 文件中有一些圖片,而這些圖版我們并不希望加入分析數(shù)據(jù)中,或者我
# 們也可以增加 PHP 頁面的分析數(shù)據(jù)。所以在這里,我們加上一行用來分析
# PHP 頁面的設(shè)定。
PageType	htm*
PageType	cgi
PageType	php
#PageType	phtml
#PageType	php3
#PageType	pl

# 如果您希望只使用 https 才可以連到分析頁面,則將 UseHTTPS 設(shè)為 yes。
#UseHTTPS       no

# DNSCache 可以設(shè)定 DNS 快取的文件名稱,在分析數(shù)據(jù)時,可能會一直需要
# 做 DNS 的分析,這個檔可以提高 DNS 查詢的效率。
#DNSCache	dns_cache.db

# DNSChildren 可以設(shè)定要使用多少 process 來做 DNS 查詢,預(yù)設(shè)是 0,表示
# 不查詢,我們可以設(shè)定的值從 1 到 100。最好不要設(shè)太多,以免消耗太多系統(tǒng)
# 資源。
#DNSChildren	0

# HTMLPre 是用設(shè)定每個 HTML 檔案開頭第一行要插入的字,最長 80 個字符。
#HTMLPre <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

# HTMLHead 可以讓我們設(shè)定 HTML 頁面 <HEAD></HEAD> 中間要插入的字。最長
# 也是 80 個字符。
#HTMLHead <META NAME="author" CONTENT="The Webalizer">

# HTMLBody 會取代在 HTML 頁面中的 <BODY>  這個標(biāo)簽。可以讓我們設(shè)定網(wǎng)頁
# 的一些屬性。最長也是 80 個字符。
#HTMLBody <BODY BGCOLOR="#E8E8E8" TEXT="#000000" LINK="#0000FF" VLINK="#FF0000">

# HTMLPost 會將設(shè)定的字符串插入 HTML 第一個 <HR> 標(biāo)簽之后,最長也是 80 個
# 字。
#HTMLPost 	<BR CLEAR="all">

# HTMLTail 可以設(shè)定 HTML 頁面的結(jié)尾所要插入的字符串。最長 80 個字符。
#HTMLTail <IMG SRC="msfree.png" ALT="100% Micro$oft free!">

# HTMLEnd可以設(shè)定 HTML 頁面的最后結(jié)尾所要插入的字符串。我們最少要有
# </BODY> 和 </HTML> 這二個標(biāo)簽,最長 80 個字符。
#HTMLEnd </BODY></HTML>

# Quiet 可以讓我們設(shè)定在分析時是否要輸出訊息,因為我們會使用 crontab
# 定時執(zhí)行,所以不要輸出分析過程的訊息比較好。
Quiet		yes

# ReallyQuiet 可以設(shè)定檔有錯誤產(chǎn)生時,是否要輸出訊息。
#ReallyQuiet	no

# TimeMe 可以設(shè)定在分析之后是否要輸出時間。
#TimeMe		no

# GMTTime 可以設(shè)定是否要使用 GMT (UTC) 時間而非本地時間。
#GMTTime		no

# Debug 可以設(shè)定是否要輸出除錯訊息。
#Debug		no

# FoldSeqErr 可以讓 Webalizer 忽略讀取 log 檔的錯誤。
#FoldSeqErr	no

# VisitTimeout 可以設(shè)定 session 的到期時間,默認(rèn)值是 30 分鐘。
#VisitTimeout	1800

# IgnoreHist 請保持 no。
#IgnoreHist	no

# Country Graph 是用來顯示分析資料中關(guān)于國家的統(tǒng)計資料是否要顯示。
#CountryGraph	yes

# DailyGraph 及 DailyStats 是設(shè)定是否顯示每日分析資料。
#DailyGraph	yes
#DailyStats	yes

# HourlyGraph 是 HourlyStats是設(shè)定是否顯示每小時分析資料。
#HourlyGraph	yes
#HourlyStats	yes

# GraphLegend 是設(shè)定是否要顯示彩色圖表。
#GraphLegend	yes

# GraphLines 是用來設(shè)定圖表的網(wǎng)格線數(shù)量,最多 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 文件中有記錄的數(shù)據(jù),而非只有前幾名而
# 已。如果設(shè)定了某一個 All 的選項,webalizer 將會為該設(shè)定新增一個頁面。
#AllSites	no
#AllURLs	no
#AllReferrers	no
#AllAgents	no
#AllSearchStr	no
#AllUsers       no

# Webalizer 會自動使用讓網(wǎng)址 /somedir/ 可以連結(jié)到 /somedir/index.htm
# 如果你想要設(shè)定讓除了 index. 結(jié)尾的網(wǎng)址有此效果外,還要讓其它網(wǎng)
# 址也有同樣效果,您可以在此設(shè)定。
#IndexAlias     home.htm
#IndexAlias	homepage.htm

# Hide*, Group*, Ignore* 及Include* * 可以設(shè)定讓 Webalizer 忽略
# log 中的關(guān)鍵詞,讓 log 中某些記錄不要被加入分析數(shù)據(jù)中。例如
# 有的搜尋引擎會自動連到您的網(wǎng)頁來找數(shù)據(jù),您可以設(shè)定忽略這樣的
# 聯(lián)機(jī)。請自行參閱說明。
… 略 …
# End of configuration file...  Have a nice day!

接著我們必須依您的設(shè)定在網(wǎng)頁根目錄中建立一個數(shù)據(jù)夾以儲存 webalizer 所產(chǎn)生的圖表,假設(shè)我們的網(wǎng)頁根目錄是 /home/www,并在其目錄下建立一個子目錄名為 traffic

# mkdir /home/www/traffic

緊接著我們就可以使用下列指令來產(chǎn)生統(tǒng)計圖表:

# /usr/local/bin/webalizer

因為我們在 webalizer.conf 中設(shè)定了所要使用的 apache 使用記錄的文件名及所產(chǎn)生的圖表存放位置,所以在執(zhí)行 webalizer 時不必再加任何參數(shù)。如果您想指定使用其它的聯(lián)機(jī)記錄文件來做分析,您可以在指令后面加上該記錄文件的文件名,例如:

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

產(chǎn)生了圖表之后,我們就可以使用瀏覽器輸入 http://www.mydomain.com/traffic 連到該網(wǎng)頁。

為了讓分析圖表能定時自動更新,我們可以使用 crontab 每小時定期執(zhí)行一次分析。

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

在上述的 crontab 的設(shè)定中,我們讓系統(tǒng)在每小時的第 13 分時執(zhí)行一次 webalizer,您也可以依您的需求調(diào)整更新的時間。存盤離開之后,crontab 會自動加載新的設(shè)定,如此一來我們就可以隨時擁有最新的統(tǒng)設(shè)信息了。

11.8 MRTG 流量分析

如果您想要知道網(wǎng)站流量的使用情形,我們可以安裝 MRTG 這套軟件經(jīng)由網(wǎng)頁來監(jiān)看網(wǎng)絡(luò)流量。MRTG 會去收取 SNMP (Simple Network Management Protocol) 所產(chǎn)生的數(shù)據(jù),因此所要記錄的機(jī)器必須要安裝 SNMP。在你的主機(jī)上安裝 MRTG 后,你不僅可以收集自己的流量數(shù)據(jù),也可以收集局域網(wǎng)絡(luò)上其它可以接收到的 SNMP 數(shù)據(jù)。

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 溝通時必須要先傳送的字符串。我們可以依不同的網(wǎng)域或主機(jī)給予不同的權(quán)限,依 community name 的設(shè)定來決定不同權(quán)限。一個網(wǎng)絡(luò)組件可以有多個 community name,一般 SNMP Agent 所預(yù)設(shè)公開的 community name 是 public。我們不一定要將 community name 設(shè)定為 public,因為 public 是一般 SNMP 的默認(rèn)值,為了安全的問題,我們不將它設(shè)為 public。這里我們將設(shè)定 community name 為 mrtg,而且只有 read only 的權(quán)限。

要設(shè)定 community name 請先新增一個文字文件 /usr/local/share/snmp/snmpd.conf 并加入下列設(shè)定:

rocommunity     mrtg
syslocation     Office
syscontact      alex@alexwang.com

上述設(shè)定中,mrtg 為只讀的 community name,Office 是您機(jī)器所在位置,而 syscontact 所接的字符串是您的 Eamil。另外, 我們還必須在 /etc/rc.conf 中加入下列這一行:

snmpd_enable="YES"

接著,請執(zhí)行 /usr/local/etc/rc.d/snmpd.sh start 來啟動 snmpd,如果出現(xiàn)錯誤則 cd /usr/local/etc/rc.d/, 將 snmpd.sh 原本的內(nèi)容刪除,并加入下列這一行:

/usr/local/sbin/snmpd

接著再執(zhí)行 /usr/local/etc/rc.d/snmpd.sh 便可啟動 SNMP。

11.8.2 安裝 MRTG

我們使用 ports 來安裝 MRTG:

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

接著要產(chǎn)生 MRTG 的設(shè)定檔

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

這里的 mrtg 是我們在安裝 net-snmp 時所設(shè)定的值。如果你使用錯的 community name,你可能會從要記錄的設(shè)備上得到錯誤響應(yīng)。而 alexwang.com 是你所要記錄的主機(jī)位置。mrtg.cfg 就是所要產(chǎn)生的設(shè)定檔名。

如果您想要記錄多個主機(jī),只要在 cfgmaker 時多加入主機(jī)名稱即可,例如:

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

這樣就會同時記錄上面二臺主機(jī)的流量了。

產(chǎn)生基本的設(shè)定檔后,我們可以再編輯剛才產(chǎn)生的設(shè)定檔 ee mrtg.cfg,在檔案開頭的部份加入一些客制化的設(shè)定:

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

# 設(shè)定你的 MRTG 要放在哪個目錄,應(yīng)該要放在網(wǎng)頁可以
# 連結(jié)到的地方,我的網(wǎng)頁根目錄是 /home/www,所以我將
# MRTG 放在下面的目錄。
WorkDIR:/home/www/mrtg

# 預(yù)設(shè)的 MRTG 所產(chǎn)生的圖時間是由右到左
# 我喜歡由左到右,故加入下面這一行
Options[_]: growright

接著請建立一個你在 mrtg.cfg 中設(shè)定的 WorkDIR 的目錄:

# mkdir /home/www/mrtg

然后使用指令 indexmaker 來建立 MRTG 的首頁:

# indexmaker -title '流量統(tǒng)計' -output /home/www/mrtg/index.html mrtg.cfg

這里的參數(shù) -title 是該 index.html 檔的 title,而 -output 就是要輸出的檔案位置,預(yù)設(shè)是stdio(通常指的是屏幕) 。

輸出的檔案 index.html 你也可以使用其它的網(wǎng)頁編輯軟件再去修改美化它。接下來要將MRTG的一些圖片文件復(fù)制到 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

第一次執(zhí)行上面的指令可能會有一些錯誤訊息,不要理它,因為是第一次執(zhí)行 mrtg,所沒有一新舊的圖,只要再多執(zhí)行幾次就好了。沒問題之后,使用指令 crontab -e 來把上述指令每 5 分鐘執(zhí)行一次,加入下面這一行:

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

現(xiàn)在你可以使用 http://yourserver/mrtg 來連去看看。最后別忘了移除安裝過程的暫存檔:

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

11.8 服務(wù)器管理

11.8.1 apachectl

這是一個管理 Apache Server 的工具。

參數(shù) 說明
start 啟動 Apache Server
stop 停止 Apache 服務(wù)
restart 重新啟動 Apache
startssl 啟動具 SSL 功能的 Apache Server

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

如果您使用 port 安裝,請執(zhí)行: /usr/local/sbin/apachectl startssl

11.9.2 ab

這是用來測試 Apache 效能的工具。你可以針對某個 URL 來模擬出連續(xù)的聯(lián)機(jī)請求 (不限本地主機(jī)),并設(shè)定同時間要模擬多少聯(lián)機(jī)。

參數(shù) 說明
-n requests 要做多少次聯(lián)機(jī)請求,requests 為次數(shù)。
-c concurrency 同時有多少個聯(lián)機(jī),concurrency 為個數(shù)。
-t timelimit 最多等待回應(yīng)的秒數(shù)。
-p postfile 要以 POST 方法聯(lián)機(jī)所欲送出的參數(shù)檔案。postfile 為存放參數(shù)的文件名稱。

例如,我要對自己的機(jī)器中的 /cgi-bin/test.cgi 作測試,模擬 1000 次請求,每次最多同時 20 個聯(lián)機(jī),只要在命令列執(zhí)行指令:

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

等了幾秒之后出現(xiàn):

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)

您可以增加最多同時聯(lián)機(jī)數(shù)目及聯(lián)機(jī)次數(shù),操看看你機(jī)器的上限在哪里。

還有更多的參數(shù),詳細(xì)用法請 man -M /usr/local/apache/man ab。

11.9.3 壓縮備份 log 檔

隨著使用人數(shù)的增加,網(wǎng)站的 log 檔可能會越來越大,我們可以使用 FreeBSD 內(nèi)定的 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 。備份后該檔案的權(quán)限是 644,最大的數(shù)字到 7,也就是最多八個檔案,不限制檔案多大時要備份,選在每周日半夜 1 點(diǎn)時備份,并將該檔以 gzip 壓縮。在備份完后,要將 /usr/local/apache/logs/httpd.pid 所記錄的 Process ID 重新啟動,如果您使用 port 安裝,httpd.pid 的位置是 /var/run/httpd.pid。