第十一章 網頁服務器
Apache 是 UNIX 系統(tǒng)中普遍使用的網頁服務器軟件。目前因特網中,有超過百分之五十的服務器是使用 apache 來提供網頁瀏覽的服務。 這里我們將介紹如何安裝一個功能完整的網頁服務器。
如果你的網頁服務器只要用來放純粹的 HTML 檔,不要執(zhí)行其它的功能,如 PHP、MySQL、SSL等,你只需到 /usr/ports/www/apache13 的目錄中,執(zhí)行 make install 即可迅速的安裝 apache。但是這樣的服務器太過于陽春了,使用 apache 自然要使用 PHP 才有意思。PHP 是一個用來寫網頁程序的軟件,就像 ASP、JAVA servlet、CGI 等等有類似的用途。不同的是 PHP 十分容易學習,程序代碼也很簡潔,速度更是沒話說。如果你有些微的程序語言基礎,不出二個禮拜,你就能對 PHP 有十足的認識,并且可以自己寫出留言版、權限控制等簡單的程序。
如果要使用 PHP,那你一定也要使用一套數(shù)據庫系統(tǒng)做為程序后端的數(shù)據儲存。在眾多免費的數(shù)據庫軟件中,最有名的應該是 MySQL 和PostgreSQL 了。不論是 MySQL 或 PostgreSQL,它們的功能及速度都令人贊賞。使用 PHP 加上數(shù)據庫軟件,你可以制作出網頁的各式數(shù)據庫,如會員管理、產品數(shù)據庫等等??傊?,我十分建議使用 Apache+PHP+數(shù)據庫的組合,就算目前不會用到,不久的將來也會使用它們的功能。全部一股腦的裝起來,省得日后麻煩。在安裝 PHP 時,我也建議你順便安裝 GD 等軟件來付予 PHP 繪圖的能力,例如從數(shù)據庫中取出數(shù)據來繪制統(tǒng)計圖表等。
另外,如果你要在網頁上執(zhí)行 CGI 的話,我們會介紹 suEXEC 的設定。傳統(tǒng)上,當使用者執(zhí)行 CGI 時,系統(tǒng)會以網頁服務器執(zhí)行者的身份來執(zhí)行 CGI。內定的使用者是 nobody,這樣的執(zhí)行方式有一些缺點。因為所有的 CGI 程序都必須要設定為可以執(zhí)行,但是如果是以 nobody 的身份執(zhí)行的話,該 CGI 程序就必須要讓 nobody 有執(zhí)行的權限。UNIX 的權限控制有三個等級,分為檔案的擁有者、和擁有者同一群組的人、其它人,而網頁服務器的執(zhí)行者通常不是檔案的擁有者,如果系統(tǒng)中有其它的使用者也要執(zhí)行 CGI 程序,他們都必須把 CGI 程序的權限開放給所有人,這樣子在系統(tǒng)中的所有人都可以執(zhí)行該程序。更甚者,如果 CGI 程序有要求讀寫檔案的話(例如留言版程序),那么被讀寫的檔案也必須讓所有使用者都可以讀寫,也就是說其它人都可以刪除別人的檔案。因此,我們利用 suEXEC 來讓 CGI 程序在執(zhí)行時是以檔案擁有人的身份執(zhí)行,也就是說 CGI 程序的權限設定只要設為擁有者可以讀、寫及執(zhí)行,不必開放給其它的人使用??偠灾?,如果你的網頁服務器有必要執(zhí)行 CGI 的話,最好安裝 suEXEC。
最后,我們也會加入 SSL 聯(lián)機。一般的 http 要求都是以明碼傳送數(shù)據,數(shù)據傳送的過程中很容易被竊聽。如果你有一些需要輸入密碼的網頁,建議改用 https 聯(lián)機,也就是用 SSL 聯(lián)機的方式,將數(shù)據重新編碼加密,來增加安全性。
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 目錄中找到該檔案。你也可以在國內的 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 并設定密碼:
# /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) |
如果您有其它使用者要加入也可以加入,最好不要讓使有人都有對所有數(shù)據庫有全部的權限。例如,我的網頁數(shù)據庫名稱是 www,而管理者是 jack,我只要讓它對 www 這個數(shù)據庫有某部份的權限且密碼是 mypwd,可以使用下列的設定:
mysql> GRANT SELECT,INSERT,UPDATE,DROP,CREATE,DELETE,INDEX ON www.* TO jack@localhost IDENTIFIED BY 'mypwd'; mysql> FLUSH PRIVILEGES; |
以上指令及 MySQL 更詳細的設定說明,我們會在數(shù)據庫系統(tǒng)一章中加以說明。最后請以 exit; 來離開 MySQL。
開機時要自動執(zhí)行mysql請在 /etc/rc.local 中加入:
/usr/local/mysql/share/mysql/mysql.server start |
建議您以后使用 mysql.php 來管理數(shù)據庫,這是一個可以從支持 PHP 的網頁上直接存取數(shù)據庫的程序。比起其它以 PHP 寫成的 MySQL 數(shù)據庫管理程序,我最喜歡這一個,因為只要將它放在網頁的目錄中,就可以執(zhí)行了。只需一個檔案,完全不須做任何設定。你可以在本書第二片光盤 /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 時,將會出現(xiàn)下列畫面:
圖 11-1
我們可以選取 PHP 所要附加的功能。為了使用 PHP 來繪圖,我們選取了 GD,另外還要支持 MySQL、PostgreSQL 等數(shù)據庫,其它選項您可以自行斟酌。選取完畢之后,就可以選擇 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 的組態(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. 設定 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]: # 接下來要產生根憑證,請輸入您所在國家的數(shù)據,這個字段我們填入 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 設定我們會在下一節(jié)說明。
接下來執(zhí)行以下指令來啟動 apache:
# /usr/local/apache/bin/apachectl start
啟動后,我們就可以使用瀏覽器連到該服務器看看是否看得到網頁。如果可以的話,請使用 /usr/local/apache/bin/apachectl stop 來停止 apache 服務,再使用 /usr/local/apache/bin/apachectl startssl 來啟動具 SSL 的 apache。并改以 ssl 聯(lián)機到服務器看看 https://your.server/ 來看是否成功。
我們接著要試試 php 可不可以運作。在 /usr/local/apache/htdocs/ 編輯一個檔名為 test.php 的文字文件,內容如下:
<? phpinfo(); ?> |
再使用瀏覽器連到該檔案,看看 php 是否正常:http://youserver/test.php。
都完成之后,若開機即要執(zhí)行 apache 的話,請在 /etc/rc.local 中加入:
/usr/local/apache/bin/apachectl startssl |
11.2.3 后續(xù)系統(tǒng)設定
后續(xù)的設定就是要修改 /usr/local/apache/conf/httpd.conf 及 /usr/local/lib/php.ini,將它們依你的需要修改。PHP 自 4.1.0 版開始,支持一種比較安全的變量傳遞方式,它對于由網頁所傳遞進來的變量有不同的取得方式。在 4.2.0 之前,預設支持新舊二種傳遞方式,但在 4.2.0 之后,預設就只支持新的方式。因此,如果您有舊的 PHP 程序要在服務器上執(zhí)行,您一定要修改 php.ini,我們會在 php.ini 設定一節(jié)中詳加說明。休息一下,我們接著幾章便要說明這些檔案的設定。
11.3 http.conf 說明
/usr/local/apache/conf/httpd.conf 是 Apache 的主要設定檔。檔案中有 # 為開頭者是批注,用以說明設定的情形及方式,如果一行的開頭有 # 的話,該行對 Apache 就不會產生作用。全文可以分成三個部份,第一個區(qū)段是全域設定,用來設定 apache 執(zhí)行時的重要設定。第二個部份是主要主機的設定,針對主要對外提供服務的主機加以設定。第三個部份是虛擬主機的設定,你可以在一臺機器上設定多個 domain name 或多個 IP ,并針對不同的 domain 來設定不同的目錄及相關參數(shù)。如果你有安裝 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 是采獨立常駐的方式,即開機時就常駐于系統(tǒng)中。 # 若是設定為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 的聯(lián)機 Timeout 300 # 可以設定為 On 或 Off,表示在完成 client 的聯(lián)機要求后, # 是否要立即切斷聯(lián)機。一般會保持聯(lián)機,以服務下一次的聯(lián)機 # 請求。如果設為 Off,每一次的聯(lián)機要求結束后,都會關閉連結, # 下一次的請求則要再開一個新的程序,這樣速度較慢。除非你的 # 硬件真的很差,每法同時有太多的程序,否則都設為 ON, # 以增加速度 KeepAlive On # 同時保持聯(lián)機要求的上限。如果你 KeepAlive 設為 On,這里才 # 會有作用。你可以依照自己的備配提高這個值,以提高效能。 # 如果設為 0 表示不限制 MaxKeepAliveRequests 100 # 設定持續(xù)聯(lián)機時等待客戶端下一個請求的時間 # 超過此時間則視為聯(lián)機中斷 KeepAliveTimeout 15 # Apache 會動態(tài)的依照系統(tǒng)系統(tǒng)的負載來調整所需的程序 # Apache 會定期檢查有多少聯(lián)機要求在等待中 # 會在這個范圍中自動啟動適當數(shù)目的程序來等待請求 # 這里的設定己滿足大多數(shù)網站的需求,你不必做更改 MinSpareServers 5 MaxSpareServers 10 # 如果你是以 standalone 的方式啟動 Apahce # 這里是設定啟動時要同時啟動多少個程序來等待聯(lián)機請求 StartServers 5 # 同一時間可以聯(lián)機的 client 數(shù)目,這個數(shù)目不應該太小 # 你可以依自己的硬件來調高這個值 MaxClients 150 # 每個請求子程序(child process)的最大數(shù)目。太多的子程 # 序會占用內存及資源,如果設為 0 表示不限制 MaxRequestsPerChild 0 # 如果有設虛擬主機的話,你可以設定 Apache 要 listen 的 # IP或Port,當所架設的虛擬主機若不在80端口號時,您就必須 # 在這指定其它埠號提醒Apache監(jiān)看某個埠號。 #Listen 3000 #Listen 12.34.56.78:80 # 虛擬主機的相關設定,設定 Apache 可以接受聯(lián)機請求的 # IP 地址或Domain Name,其設定值可以是 * 、 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 來顯示 # 服務器的設定狀態(tài),預設是 Off。如果要設為 On,還必須 # 要設定下面 |
11.3.2 主要主機設定
### Section 2: 'Main' server configuration # 如果你是以 inetd 的方式啟動 Apache,以下的部份設定 # 并不會發(fā)生作用 # 設定 standalone 要傾聽的 port,如果 port 小于 1023 # 必須要以 root 才能啟動 Apache Port 80 ## SSL 支援 ## 如果有使用 SSL,設定 SSL 要聽的 port |
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 設定 ## 我將省略大多數(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> # 在這里改你的網頁地址及 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 來調整成我們要的參數(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> |
當上述的 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 之后,有一個新的方式可以讓我們使用,就是將傳進來的變量全部都存在數(shù)組中。以第一個例子而言,我們以 POST 的方式從窗體傳來變量 $username,新的取得變量方式是:$_POST["username"],也就是說所有以 POST 傳遞過來的變量全部存在 $_POST 這個數(shù)組中。詳細說明請參考 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 的設定,但如果你想要對它有更深入的了解,我們會一一說明:
[PHP] ; $Id: php.ini-dist,v 1.78.2.2 2001/06/01 03:20:49 sniper Exp $ ;;;;;;;;;;;;;;;;;;; ; 關于這個檔案 ; ;;;;;;;;;;;;;;;;;;; ; ; 在這里設定的參數(shù)名稱有大小寫之分 ; 例如 - foo=bar 和 FOO=bar 所代表的意義不同 ; ; 所設定的值可以是字符串、數(shù)字、PHP 的常數(shù) (如 E_ALL 或 M_PI) ; INI 常數(shù) (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' ; ; 你果你要動態(tài)加載一些表示式所方的變量 (可能是 PHP extension ; 或是 Zend extension),你必須在加載后才能使用該變量 ; ; 所有 php.ini-dist 的設定都是內建的默認值,如果沒有 php.ini 時 ; 或者當你刪除該行,就會使用內建的默認值 ;;;;;;;;;;;;;;;;;;;; ; 程序語言選項 ; ;;;;;;;;;;;;;;;;;;;; ; 是否要在 Apache 中啟動 php 引擎 engine = On ; 可以使用 <? 的標簽,不然的話,只能使用 <?php 和 <script> short_open_tag = On ; 是否允許 ASP 格式的標簽 <% %> asp_tags = Off ; 使用浮點數(shù) (floating point numbers) 要用多少數(shù)字 precision = 12 ; Enforce year 2000 compliance (在某些瀏覽器可能會產生問題) y2k_compliance = On ; output buffering 可以讓你就算已經送出 body content 后,還 ; 可以再送 header (包括 cookies),只是這樣會減慢一點 php 輸 ; 出的速度。你也可以在執(zhí)行程序時呼叫 output buffering 的函式 ; 來取得這項功能。或者就在這里設成 On 來啟動吧。 ; 一般我會設成 Off,只有當你很常用到這個功能才設成 On。 output_buffering = Off ; 你可以將你的 php 程序輸出轉向到一個函式,例如,如果你 ; 將 output_handler 設為 "ob_gzhandler", 輸出將會使用 gzip ; 壓縮網頁給瀏覽器 output_handler = ; 壓縮輸出要使用 zlib 函式庫,這里可以使用的值可以是 ; 'off', 'on', 或者是用在壓縮的暫存區(qū)大小 (預設是 4KB) zlib.output_compression = Off ; Implicit flush 告訴 PHP 每次輸出一個區(qū)段都要 flush 強制 ; 將暫存區(qū)的東西輸出給瀏覽器。這和在 PHP 程序在 print() 或 ; echo() 之后呼叫 flush() 函式有相同的效果。這個選項最好不 ; 要打開,否則效率差很多,只有用于除錯時才會打開他。 implicit_flush = Off ; 是否要強制在呼叫變量時都使用傳址呼叫,這個功能未來版本的 ; PHP/Zend 將取消。比較好的方式是在函式定義時就宣告變量的 ; 呼叫方式以傳址呼叫。你可以在這里將它設為 Off,來看你所寫 ; 的程序是否可以在未來版本的 PHP 執(zhí)行,而參數(shù)在傳遞時就會以 ; 值,而非在內存地址。 allow_call_time_pass_reference = On ; ; 安全模式 ; safe_mode = Off safe_mode_exec_dir = ; 設定一些環(huán)境變量可能造成安全性的破壞 ; 這些變數(shù)如 comma-delimited list of prefixes。在安全模 ; 式,使用著只能使用所定義的前綴字符串作起始的變量,預設 ; 只有以 PHP_ 作開始的變量 (如 PHP_FOO=BAR) ; ; 請注意:如果設為空字符串,PHP 允許使用者設任何環(huán)境變量 safe_mode_allowed_env_vars = PHP_ ; 這個指令包含了使用者不能以 putenv() 改變的環(huán)境變量 ; 的 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 程序最大的執(zhí)行時間 memory_limit = 8M ; 每個 PHP 程序最大可以消耗多少內存 (8MB) ;;;;;;;;;;;;;;;;;;;;;;;;;; ; 錯誤的處理及記錄 ; ;;;;;;;;;;;;;;;;;;;;;;;;;; ; error_reporting 可以讓你設定要回報的錯誤內容 ; 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 (這個警告通常是你的程序代碼有問題 ; 或者也有可能是內部錯誤 (例如使用一個未初始化的變量) ; 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 將它記錄在檔案中。否則顯示一些錯誤 ; 在網頁上可能會有潛在的安全問題,如檔案位置、數(shù)據庫的輪廓或是 ; 一些其它的信息 display_errors = On ; 就算打開了 display_errors,在起始 PHP 時發(fā)生的錯誤并不會顯示 ; 建議你除了除錯外不要打開這個功能 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 ;;;;;;;;;;;;;; ; 數(shù)據處理 ; ;;;;;;;;;;;;;; ; ; 請注意 - track_vars 在 PHP 4.0.3 中永遠有效 ; PHP 如何處理輸出給 URL 多個變量,用什么字 ; 串將它們分開,預設是 "&" ;arg_separator.output = "&" ; PHP 如何處理從 URL 傳來的多個變量,用什么字 ; 串將它們分開,預設是 "&" ; 請注意:這里設中字的任可一個 "字符" 都將視為一個分開的符號 ;arg_separator.input = ";&" ; 這里的設定是當 PHP 接收來自 GET, POST, Cookie,環(huán)境變量( ; Environment) 和 內建變數(shù) (Built-in variables)有重復時, ; 要處理的順序。以 (G, P, C, E & S 表示上述的方法,可以寫成 ; EGPCS 或 GPC). 處理的順序是由左至右,當變量名稱相同時, ; 比較慢處理的將覆蓋舊的值。 variables_order = "EGPCS" ; 是否要將 EGPCS 的變量注冊成全域變量 ; 這個當你在以 $HTTP_*_VARS[] 處理 GPC 變量時就有作用 ; ; 如果不打開這個選項,在 PHP 中就不能使用 $var 的方式來取得 ; HTML 傳來的變量,必須要使用 $_POST["var"]來取得。新的方式將 ; 所有變量存在數(shù)組中,例如,從網頁以 POST 窗體傳來的變量會全部存 ; 在 $_POST 這個數(shù)組中。詳情請參考 PHP 4.1.0 的 Release Note ; PHP 4.2.0 之后,預設是不打開的,但是這樣一來,有許多舊的 ; PHP 程序都不能執(zhí)行了。因此如果你的程序關于變量的寫法如果是 ; 使用舊的方式,你必須將這個功能打開。 register_globals = On ; 這是要告訴 PHP 是否要注冊 argv&argc 變量 (這包含 GET 的信息) ; 如果你不使用它,則可以關掉以增加處理效率 register_argc_argv = On ; 設定 PHP 在接收 POST 數(shù)據時最大的容量大小 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() 在一些多重執(zhí)行緒的服務器 ; 可能不會運作,如 IIS 或 Zeus,這時它會自動取消 dl() enable_dl = On ;;;;;;;;;;;;;;;; ; 檔案上傳 ; ;;;;;;;;;;;;;;;; ; 是否要使用 HTTP 上傳檔案 file_uploads = On ; 上傳檔案時所要使用的暫存目錄,如果沒有指定就會使用系 ; 統(tǒng)內定的暫存目錄 ;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)延伸模塊 ; ;;;;;;;;;;;;;;;;;; ; ; 如果你希望自動加載延伸模塊,請使用下列設定 ; ; 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 等。 ; 關掉它會有比較好的執(zhí)行效率 ; 你可以在程序中使用 define_syslog_variables() 來定義它們 define_syslog_variables = Off [mail function] ; 只用于 Win32 SMTP = localhost ; 只用于 Win32 sendmail_from = me@localhost.com ; 只用于 Unix,你也可以加入參數(shù) (內定值: '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] ; 讓你可以做持續(xù)的連結數(shù)據庫 mysql.allow_persistent = On ; 最大的持續(xù)連結, -1 表示不限 mysql.max_persistent = -1 ; 最大的連結 (持續(xù)連結 + 非持續(xù)連結)。 -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] ; 允許使用持續(xù)的連結數(shù)據庫 msql.allow_persistent = On ;...以各種數(shù)據庫的設定都和 MySQL 差不多,故略... [Session] ; Handler 所使用儲存及取得的數(shù)據 session.save_handler = files ; 傳遞給 save_handler 的參數(shù)。這是 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 ; 存在暫存區(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ù)據庫差不多,故略... ; ...以下略 ; Local Variables: ; tab-width: 4 ; End: |
11.5 .htaccess 應用
Apache 允許使用者在目錄下放置一個檔案 來控制該目錄的存取權限。預設是使用 .htaccess 這個檔。 你可以自行用文書軟件編輯一個文件名為 .htaccess 的檔案來設定檔案所在目錄的權限。 不過也要看 httpd.conf 中關于該目錄的 AllowOverride 是否有打開,如果有打開才可以用 .htaccess 的檔案去覆蓋原本對該目錄的設定。
首先先編輯 /usr/local/apache/conf/httpd.conf,在網頁目錄設定的區(qū)段:
<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 的區(qū)段中,AllowOverride 是設成 All,你就可以在 .htaccess 檔案中設定所有選項,如 Options, AllowOverride 等。
實際應用
.htaccess 最常用的一個例子是用來將目錄設定需認證才能讀取。假設你要將某個目錄設定需要密碼才能讀取,你可以在該目錄下編輯一個名為 .htaccess 的文字文件,內容如下:
AuthName "管理專區(qū)" AuthType "Basic" AuthUserFile "/var/adminDir.pw" require valid-user |
其中請注意各參數(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
此時輸入你設定的 username 及密碼即可。
11.6 虛擬主機
我們可以在一臺機器上設定多個主機名稱或 IP,并依不同名稱來決定其根目錄所在。當使用者聯(lián)機到我們的主機時,每一個不同的名稱所看到的根目錄都不同。
要達到這樣的功能,我們必須先確定主機有多個 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 的管理者賬號、存放網頁的目錄及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> # 設定 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 數(shù)據,Apache 將以第一個設定的 Virtual Host 數(shù)據為主。在這個范例里,當你打 www.fgh.org 會連到 www.abc.com 的設定。
必須要注意的是,有些客戶端的聯(lián)機軟件并不支持 Name-Based 的虛擬主機,要支持 name-based virtual host,客戶端必須送出 HTTP 的標頭,也就是瀏覽器必須支持 HTTP/1.1。請放心,我們常用的 IE、Netscape、lynx 都有支援。
11.7 網頁記錄分析
在我們將所制作好的網頁放在網頁服務器之后,我們會想知道每一個網頁的瀏覽次數(shù)、使用者的停留時間等等。在 apache 的聯(lián)機記錄中,可以看到很多使用者瀏覽網頁的記錄,我們可以使用一些工具來分析記錄文件,讓這些記錄文件能更易于閱讀。我們在這里要介紹 webalizer 這套軟件。Webalizer 會讀取 apache 的 log 檔,并將分析結果存成網頁,讓我們可以經由網頁的圖形更輕松的了解每一個頁面的使用情形。由于 webalizer 所進行的分析是經由讀取 log 檔,因此 log 文件的數(shù)據越多,分析出來的結果也就越詳盡。
請使用下列指令安裝 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 聯(lián)機記錄文件的位置。 #LogFile /var/lib/httpd/logs/access_log LogFile /var/log/apache_access_log # 設定 log 文件的型式,Webalizer 除了 Apache 外,還可以支持分析 FTP 軟件 # 或 proxy 軟件 squid 的 log 文件。LogType 預設的值是 'clf',表示分析 # 網頁數(shù)據,你也可以設定為 ftp 或 squid。 #LogType clf # OutputDir 是我們想要輸出分析數(shù)據的位置。請設定為網頁根目錄下的某一個 # 目錄。例如我們的網頁根目錄是 /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 可以讓您設定目前增加 # 的分析數(shù)據存放位置。 #IncrementalName webalizer.current # ReportTitle 是分析結果網頁的標題。在該標題后會加上您的主機名稱。 #ReportTitle Usage Statistics for # 設定您的主機名稱。 #HostName localhost # HTMLExtension 是所產生的 HTML 檔的擴展名。 #HTMLExtension html # PageType 可以讓您設定何種擴展名結尾的頁面要加入分析數(shù)據。因為在 # log 文件中有一些圖片,而這些圖版我們并不希望加入分析數(shù)據中,或者我 # 們也可以增加 PHP 頁面的分析數(shù)據。所以在這里,我們加上一行用來分析 # PHP 頁面的設定。 PageType htm* PageType cgi PageType php #PageType phtml #PageType php3 #PageType pl # 如果您希望只使用 https 才可以連到分析頁面,則將 UseHTTPS 設為 yes。 #UseHTTPS no # DNSCache 可以設定 DNS 快取的文件名稱,在分析數(shù)據時,可能會一直需要 # 做 DNS 的分析,這個檔可以提高 DNS 查詢的效率。 #DNSCache dns_cache.db # DNSChildren 可以設定要使用多少 process 來做 DNS 查詢,預設是 0,表示 # 不查詢,我們可以設定的值從 1 到 100。最好不要設太多,以免消耗太多系統(tǒng) # 資源。 #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> 這個標簽??梢宰屛覀冊O定網頁 # 的一些屬性。最長也是 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 # 定時執(zhí)行,所以不要輸出分析過程的訊息比較好。 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 是用來顯示分析資料中關于國家的統(tǒng)計資料是否要顯示。 #CountryGraph yes # DailyGraph 及 DailyStats 是設定是否顯示每日分析資料。 #DailyGraph yes #DailyStats yes # HourlyGraph 是 HourlyStats是設定是否顯示每小時分析資料。 #HourlyGraph yes #HourlyStats yes # GraphLegend 是設定是否要顯示彩色圖表。 #GraphLegend yes # GraphLines 是用來設定圖表的網格線數(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ù)據,而非只有前幾名而 # 已。如果設定了某一個 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 中某些記錄不要被加入分析數(shù)據中。例如 # 有的搜尋引擎會自動連到您的網頁來找數(shù)據,您可以設定忽略這樣的 # 聯(lián)機。請自行參閱說明。 … 略 … # End of configuration file... Have a nice day! |
接著我們必須依您的設定在網頁根目錄中建立一個數(shù)據夾以儲存 webalizer 所產生的圖表,假設我們的網頁根目錄是 /home/www,并在其目錄下建立一個子目錄名為 traffic:
# mkdir /home/www/traffic
緊接著我們就可以使用下列指令來產生統(tǒng)計圖表:
# /usr/local/bin/webalizer
因為我們在 webalizer.conf 中設定了所要使用的 apache 使用記錄的文件名及所產生的圖表存放位置,所以在執(zhí)行 webalizer 時不必再加任何參數(shù)。如果您想指定使用其它的聯(lián)機記錄文件來做分析,您可以在指令后面加上該記錄文件的文件名,例如:
# /usr/local/bin/webalizer /var/log/apache_access_log
產生了圖表之后,我們就可以使用瀏覽器輸入 http://www.mydomain.com/traffic 連到該網頁。
為了讓分析圖表能定時自動更新,我們可以使用 crontab 每小時定期執(zhí)行一次分析。
# crontab -e
13 * * * * /usr/local/bin/webalizer |
在上述的 crontab 的設定中,我們讓系統(tǒng)在每小時的第 13 分時執(zhí)行一次 webalizer,您也可以依您的需求調整更新的時間。存盤離開之后,crontab 會自動加載新的設定,如此一來我們就可以隨時擁有最新的統(tǒng)設信息了。
11.8 MRTG 流量分析
如果您想要知道網站流量的使用情形,我們可以安裝 MRTG 這套軟件經由網頁來監(jiān)看網絡流量。MRTG 會去收取 SNMP (Simple Network Management Protocol) 所產生的數(shù)據,因此所要記錄的機器必須要安裝 SNMP。在你的主機上安裝 MRTG 后,你不僅可以收集自己的流量數(shù)據,也可以收集局域網絡上其它可以接收到的 SNMP 數(shù)據。
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" |
接著,請執(zhí)行 /usr/local/etc/rc.d/snmpd.sh start 來啟動 snmpd,如果出現(xiàn)錯誤則 cd /usr/local/etc/rc.d/, 將 snmpd.sh 原本的內容刪除,并加入下列這一行:
/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
接著要產生 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 '流量統(tǒng)計' -output /home/www/mrtg/index.html mrtg.cfg
這里的參數(shù) -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
第一次執(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 服務器管理
11.8.1 apachectl
這是一個管理 Apache Server 的工具。
參數(shù) | 說明 |
start | 啟動 Apache Server |
stop | 停止 Apache 服務 |
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)機請求 (不限本地主機),并設定同時間要模擬多少聯(lián)機。
參數(shù) | 說明 |
-n requests | 要做多少次聯(lián)機請求,requests 為次數(shù)。 |
-c concurrency | 同時有多少個聯(lián)機,concurrency 為個數(shù)。 |
-t timelimit | 最多等待回應的秒數(shù)。 |
-p postfile | 要以 POST 方法聯(lián)機所欲送出的參數(shù)檔案。postfile 為存放參數(shù)的文件名稱。 |
例如,我要對自己的機器中的 /cgi-bin/test.cgi 作測試,模擬 1000 次請求,每次最多同時 20 個聯(lián)機,只要在命令列執(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)機數(shù)目及聯(lián)機次數(shù),操看看你機器的上限在哪里。
還有更多的參數(shù),詳細用法請 man -M /usr/local/apache/man ab。
11.9.3 壓縮備份 log 檔
隨著使用人數(shù)的增加,網站的 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,最大的數(shù)字到 7,也就是最多八個檔案,不限制檔案多大時要備份,選在每周日半夜 1 點時備份,并將該檔以 gzip 壓縮。在備份完后,要將 /usr/local/apache/logs/httpd.pid 所記錄的 Process ID 重新啟動,如果您使用 port 安裝,httpd.pid 的位置是 /var/run/httpd.pid。