第十一章 網頁伺服器
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,還必須 # 要設定下面 |
11.3.2 主要主機設定
### Section 2: 'Main' server configuration # 如果你是以 inetd 的方式啟動 Apache,以下的部份設定 # 並不會發生作用 # 設定 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 設定 ## 我將省略大多數的說明 ## 只寫我們要改的地方 ## 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。