UbuntuTW Guide ch14

出自Ubuntu 正體中文 Wiki

跳轉到: 導航, 搜尋

目錄 http://web.archive.org/web/20070804032625/wiki.ubuntu.org.tw/index.php/UbuntuTW_Guide_ch14

1.5 MySQL 設定

1.5.1 忘了或修改 MySQL 密碼

1.5.2 資料庫備份

1.5.3 開啟 port 3306 讓非本地端主機連線

目錄

網頁伺服器 (LAMP 架構)

很多人已經把『上網』當成『逛網頁』的代名詞,可見 Web 在整個網路應用是佔很大的一部分。在網站的網址 http://www.emook.org 常常看到起頭是 www,那就是 World Wide Web (全球資訊網) 的簡稱哩!所以大家常去 http://www.google.com.twhttp://tw.yahoo.com 都是屬於 Web 呢。

隨著時間的推移,從前靜態網頁的技術慢慢不夠用了,靜態網頁缺少了和使用者互動,只能單方面提供資料。於是動態網頁的技術開始蓬勃發展,如討論區,留言版和網路銀行等等,這些網站不只能提供我們資料,還能讓我們輸入資料,並且依照程式設計去處理這些互動的資訊。

傳統的靜態網頁只需要網頁伺服器 Apache 就夠了,它能提供網頁給瀏覽器透過 http 協定觀看。但進步到動態網頁的時候,伺服器必須要處理我們輸入或要求的資訊,故須透過網頁程式語言來處理這些要求,並且把這些資料儲存在資料庫裡面,供未來使用。網頁語言目前有很多種可以選擇,如 PHP、ASP、JSP、Perl 和 Python 等等,各有自己的特色,資料庫可以選擇的也很多,如 MySQL、PostgreSQL、Orcale 和 MS SQL 等等。目前在大部分的中小型網站最流行的是使用 PHP 語言配合 MySQL 使用。PHP + MySQL 的應用程式絕大多數都可以在網路上免費下載的到,例如很多人愛用的 XOOPS 架站機、wikipedia 這套 wiki 軟體和 phpBB 論壇討論區等程式,都是免費的 PHP 大型代表作。Ubuntu 中文站也是用這些軟體去拼湊,根本不需要寫到一行程式碼就可以架出專業的網站。

那什麼是 LAMP 呢?聰明的讀者一定猜到了,就是 Linux + Apache + MySQL + PHP 所組成的動態網頁系統,就稱為 LAMP 啦!這也是目前中小型網站占最多的架站方式。由於這本書的重點在裝好 LAMP 環境,因此裝 XOOPS 或者其他網頁應用軟體的方式請自己上網查詢,市面上也有很多本書有詳細討論。

LAMP 網頁伺服器運作原理

網址 http://www.emook.org 的 http 代表了網頁傳輸協定,它是 Hypertext Transfer Protocol (超文本傳輸協定) 的簡寫,這定義了 Server 和 Client 都需要依照這個遊戲規則來玩,這樣才能確保彼此互通。這個傳輸協定是由 W3C (World Wide Web Consortium) 這個組織所維護的,它們的網址是 http://www.w3c.org/。

HTTP 運作原理很簡單,瀏覽器先向 Server 提出要求,在要求裡面有一些瀏覽器給 Server 的表頭,如使用者端的瀏覽器版本、語言和可以接受的壓縮編碼等等,然後 Server 再根據這些要求送出回應表頭和文件內容。注意,Client 端提出來的要求表頭內並不一定會被接受,要看 Server 有沒有支援而定,所以最後瀏覽器接收到內容後還是根據 Server 最後給它的表頭解釋喔!典型的例子是瀏覽器向 Server 說它支援壓縮格式的網頁,但是若 Server 不支援的話,會略過這個要求並且在回送給瀏覽器的表頭上不會有網頁被壓縮的資訊,所以瀏覽器一定是依據 Server 送回來的表頭來判讀資料。當瀏覽器不支援壓縮時,那麼在一開始請求的表頭就不會有壓縮的資訊,若 Server 有支援壓縮的話,此時也不會自作主張的壓縮網頁,所以瀏覽器和 Server 透過表頭的資訊來溝通是很重要的,在這個步驟,雙方將會取得最大的相容性。

目前在 Linux 上常見的方式是配合以下三套軟體來達成動態網頁的效果。

  • Apache

它是目前全球網頁伺服器市場佔有率最高的軟體,目前比微軟的 IIS 佔有率還要高三倍所左右!它是由 NCSA 的 httpd 1.3 為基礎,做了大量的修改和 patch,所以有人戲稱這是 A patchy 版,諧音近似 Apache。其實它的命名是從一個印地安部落 Apache 的名稱來的,並且組成基金會以自由軟體的型式運作。目前在大部分的平台都可以執行,如 MS Windows、Linux、MacOSX 和 FreeBSD 等。

  • PHP

這是一種直譯式腳本語言,主要應用於伺服器端的應用程式和動態網頁開發。它的命名是從『PHP: Hypertext Preprocessor』的遞歸縮寫而來。它主要會被嵌入在 HTML 上在 Web 伺服器上運行,當程式被瀏覽器請求時,程式會在伺服器上執行,結果會轉成普通的 HTML 文件回傳給 Client 端瀏覽器,所以整個流程在 Client 端是不需要計算的!因為它是直譯式語言,有優秀的跨平台能力,所以幾乎在不同的系統都可以運作一樣的程式碼,造就了各種不同 PHP 應用軟體的蓬勃發展。

  • MySQL

它是一個開放原始碼的資料庫產品,開發者為 MySQL Ab公司。由於它的效能不錯,且體積小,所以它廣泛的使用在中小型網站中。它允許各種不同的資料放在資料庫中,然後用不同的語言來查詢,雖然功能上沒有大型商業公司開發的 Oracle 和 DB2 等那麼強大,但因為幾乎免費和功能已經足夠中小型網站使用,因此流行起來。

在 LAMP 架構的網站中,當 Client 向 Server 上的 Apache 要求連線後,若 Apache 發現它要求的網頁檔是 PHP 撰寫的時,就會先送到 PHP 直譯器去執行,若程式碼裡面有需要查詢資料庫的地方,就由 PHP 引擎和 MySQL 查詢資料,然後 PHP 把單純的 HTML 結果送回去給 Apache,最後在交給 Client 端的瀏覽器顯示在銀幕上。所以在客戶端是完全沒有執行到程式的,它只不過是把伺服器送來的純網頁顯示到銀幕上而已,所有的計算都是在伺服器上完成,所以伺服器上也可以選用不同的網頁程式語言,如 jsp、perl 或 python 等,完全不會影響到客戶端的結果。

LAMP 安裝架設

現在要開始示範如何安裝 LAMP,這些套件將會直接用 APT 套件管理系統安裝。因為安全更新問題,筆者非常不建議伺服器相關套件從 tarball 自己編譯安裝。筆者認為從 tarball 安裝的安全性一定會比從套件管理系統安裝的差很多,因為套件庫裡的程式都有專人在維護安全性漏洞,從 tarball 裝的話您要自己常常去看漏洞公告,一般人應該不會那麼勤勞吧!以下筆者將會 Step by Step 裝好 Apache、PHP 和 MySQL。

Apache2 安裝

Apache2 和 Apache1.3 系列最大的變化是效能的改善,而這些改善就是透過multiple child processes with multiple thread 來達成。雖然在 PHP 的使用環境下建議還是用傳統的 multiple child processes with one thread 會比較穩定,但這裡筆者還是稍微介紹一下其他 thread models!在 Apache2 有支援三種 thread models,這些模組稱為 Multi-Processing Modules (MPMs)。

  • apache2-mpm-worker

這是 Ubuntu 預設會安裝的套件,它運作的時候會有數個 child processes,每個 processes 都會再有數個 threads。由於同一個 processes 內的不同 thread 都可以共用記憶體資料,所以可以減少記憶使用並且增加效能!但是很多第三方的套件沒有 thread safe,也就是沒有考慮到 multi-thread 的問題,所以若跑在 worker thread model 的 Apache 會很不穩定!例如 PHP 就不支援 thread safe。

  • apache2-mpm-prefork

這是最傳統的模式,運作時會有數個 child processes,每個 processes 都只跑一個 thread。因此每個 thread 都隸屬於不同 processes 不會互相干擾,雖然效能較差且耗費比較多記憶體,但是對於有安裝一些第三方的模組時穩定性比較好!例如安裝 PHP 時一定要用這個 thread model,不過若先裝 Apache 預設的 mpm-worker 也沒關係,偉大的套件管理系統會自動幫您換成 mpm-prefork 版的 Apache。

  • apache2-mpm-prechild

這個和 mpm-worker 有點像,不過它允許不同的 processes 用不同的使用者執行,目前這還在開發中,非常不穩定!

介紹完了以後,我們可以透過 metapackage 虛擬套件把 apache2 很簡單的裝起來吧!

安裝 Apache2:

sudo apt-get install apache2

若讀者想要明確的指定要安裝 mpm-prefork 版而不要預設的 mpm-worker 版本,可以透過以下指令安裝。這個是非必要的唷,因為在裝 PHP 的時候會自動把 worker 換成 prefork 版!

指定安裝 mpm-prefork 版 Apache2:

sudo apt-get install apache2 apache2-mpm-prefork

若要關閉或重新啟動 apache 的話,可以透過以下控制 script 達成。關閉 Apache2 服務或重新啟動:

sudo /etc/init.d/apache2 stop  # 參數可以是 restart 或 start 等

讀者在啟動的時候若遇到以下錯誤訊息,可能是 /etc/hosts 沒有設定好!讀者可以參考6.1.6 節關於 hostname 和 hosts 的部份。 hostname 設定錯誤的警告訊息:

* Starting apache 2.0 web server... apache2: Could not determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

雖然有以上錯誤但 apache 還是可以使用,但是可能會在虛擬主機的部份出現問題。若正確設定好時,hostname 應該顯示該主機的名稱,hostname -f 會顯示該主機的完整 FQDN 名稱,也就是主機名稱加域名。 hostname 設定錯誤的警告訊息:

dbtsai@ubuntu:~$ hostname
www
dbtsai@ubuntu:~$ hostname -f
www.emook.org

有關於開機後要不要自動啟動 Apache 是屬於 runlevel 的問題,讀者可以參考第十三章關於 runlevel 的討論。

在安裝好 Apache 後,讀者可以試著用瀏覽器連線到主機試試看吧!看能不能正常連線,詳細測試我們等到安裝完 PHP 在一起測試。

PHP 安裝

目前在 Ubuntu 裡面有提供 PHP4 或者 PHP5 兩種不同的系列,由於某些舊的程式沒辦法在 PHP5 裡面順利執行,所以讀者需要自己視情況選擇。基本上 PHP5 的執行效率會比較好,且目前大部份套裝 PHP 軟體都可以在 PHP5 裡面執行,若讀者有自己開發的程式無法在 PHP5 裡面執行,那麼就需要安裝舊版的 PHP4。

( 表 14-2-1 PHP5 重要的相關套件 ) 套件名稱 功能 php5 安裝 PHP5 一些必要套件的 metapackage libapache2-mod-php5 Apache2 的 PHP5 模組 php5-gd PHP5 的圖形相關模組,常用於相簿這類的程式 php5-mysql PHP5 連線到 MySQL 資料庫的模組 php5-mysqli 同上,這個效能比較好,但是有用到比較新的 API,所以 MySQL Server 版本要大於 4.1。因為 Ubuntu 的 MySQL 已經是 5.0 了,所以安裝這一個吧! php5-cli 很多 PHP 魔人覺得寫 PHP 比 bash shell script 簡單多了,安裝這個,就允許您在 shell script 裡面使用 PHP 的語法唷!

如表 14-2-1,這些是常用的 php5 套件,若讀者還有其他的需求,用 apt-cache search php5 找一下吧!

安裝 PHP5:

sudo apt-get install php5 libapache2-mod-php5 php5-gd php5-mysqli

安裝 PHP4 的方式這裡就不再贅述了,把 5 改成 4 就可以啦!安裝完以後,記得重新啟動 Apache 唷,這樣才會把 PHP 模組載入到系統裡面。重新啟動 Apache:

sudo /etc/init.d/apache2 restart 

由於 Apache 預設放置網頁的位置是 /var/www 裡面,所以我們寫個簡單的 PHP 測試程式來看看 PHP 是否正確執行。這個程式將會顯示 PHP 和 Apache 的詳細資訊。編輯 /var/www/phpinfo.php:

<? phpinfo(); ?>

接下來用瀏覽器連線到您 server 上的 phpinfo.php 吧!讀者應該會看到如圖 14-2-1 的畫面,這代表了讀者的 Apache 和 PHP 已經正常運作了唷!

圖 14-2-1

確認正常的話,趕快把 phpinfo.php 刪除,裡面有一些您主機的組態設定,可能會讓駭客掌握到而對安全性有所影響哩。

MySQL 安裝

安裝 MySQL 很簡單,先用以下指令安裝吧!

安裝 MySQL:

sudo apt-get install mysql-server mysql-client

MySQL 所使用的密碼和系統上的是分開的,而安裝好後預設的 MySQL root 密碼是空的,所以我們第一件事情就是要修改 MySQL root 密碼,不然會很危險唷!

修改 MySQL 密碼:

sudo mysqladmin -u root -p password <輸入您要的新密碼>

修改密碼的時候,它會問您原來的密碼,此時您按 ENTER 跳過去即可,因為預設密碼是空白的!

若您需要重新啟動 MySQL 的話,可以使用以下指令。重新啟動 MySQL:

sudo /etc/init.d/mysql restart

若要讓它不要再開機的時候啟動,也是修改 runlevel 啦!讀者自己去參考一下相關資訊吧。

Apache2 設定

Debian 裡面的 Apache2 和其他發行版的管理方式有點不同,在 Debian 的設定檔不再是傳統的 httpd.conf,而是放在 apache2.conf,並且把很多模組設定或者虛擬主機設定拆開來放到各自的目錄。這些獨立出來的設定檔又可以透過 Debian 專屬的工具程式啟用或關閉,雖然這樣的設計對於初學者會覺得比較困難,但是若您在規劃大型網站時會發現這樣模組化的管理其實是比較方便的,而 Ubuntu 也繼承到這個特性。

所以筆者將會先介紹整個系統架構的輪廓,然後慢慢的澄清細部的設定,希望讀者能瞭解到 Ubuntu 裡面 Apache2 管理精髓。

系統架構

在其他的發行版中,一般是把所有的設定包含虛擬主機,啟動時載入的模組寫到 httpd.conf 裡面。在 Ubuntu 中把大部分的 httpd.conf 的東西移到 apache2.conf 裡面,且把虛擬主機和模組設定又獨立出來。可用虛擬主機的設定放在 /etc/apache2/sites-available/ 裡,這些設定其實是不啟用的,需要做一個符號連結到 /etc/apache2/sites-enabled/ 才算是正式啟用。同理,可用模組相關設定放在 /etc/apache2/mods-available/ 裡,實際要啟用還是要弄一個 soft link 到 /etc/apache2/mods-enabled/。

讀者可以想像成類似 runlevel 的概念,在開機的時候跑到 runlevel 裡面的某一個啟動程式,其實是 soft link 到 /etc/init.d 裡面的控制檔,因此我們可以很容易決定開機的時候要跑哪些服務。在 Apache2 使用類似方法的好處是我們可以修改 sites-available 來增加新的虛擬主機,然後手動 soft link 到 sites-enabled 來啟用。當那天要關閉該虛擬主機時,只要砍了 sites-enabled 裡面的 link 就可以關閉了,原來的設定檔不需要動到,若之後想要回復就只需要再做一次 soft link。而模組啟動也是一樣的原理,此時可以先在 mods-available 裡面寫好不同的模組設定,但是不啟用。若真的要啟用這些模組,再 soft link 到 mods-enabled 來啟用。

類似於 runlevel 中提供的 update-rc.d 來自動處理這些符號連結的工作,在 Apache2 中也有提供一些工具程式來處理這些模組或站台啟用或關閉,不需要再自己用 ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load 啟用。接下來筆者會先介紹模組啟用方式再介紹虛擬主機啟用方式。

最後筆者會稍微介紹一下 Apache2 其他設定檔在作什麼,讓讀者在本節看完後就可以抓到 Apache 架構的概念,這些設定檔的細節就會在後面慢慢的補上來。

啟動或關閉 mods-available 裡面的模組

察看可用模組與啟用模組:

dbtsai@ubuntu:~$ ls /etc/apache2/mods-available/
auth_dbm.load     deflate.load     ssl.conf            ssl.load
auth_ldap.load    expires.load     php5.conf           suexec.load
cache.load        ext_filter.load  php5.load           unique_id.load
‧‧‧(略)‧‧‧
dbtsai@ubuntu:~$ ls -l /etc/apache2/mods-enabled/ 
總計 0
...略...    cgi.load -> /etc/apache2/mods-available/cgi.load
...略...    php5.conf -> /etc/apache2/mods-available/php5.conf
...略...    php5.load -> /etc/apache2/mods-available/php5.load
...略...    userdir.conf -> /etc/apache2/mods-available/userdir.conf
...略...    userdir.load -> /etc/apache2/mods-available/userdir.load

如以上範例,我們可以看到系統內有其他額外的 Apache2 模組可以使用,且在安裝後預設啟用 PHP、用戶個人網頁和 cgi 模組。注意到這些啟用的模組只不過是個符號連結檔到 mods-availabe 裡面,讀者只要把它刪除就關閉使用。若是該模組有 load 和 conf 兩個檔,前者是負責讀入該模組的函式庫,後者是該模組的設定檔,所以啟用或刪除時要兩個都建立或刪除符號連結。

關閉 PHP 模組範例 (手工刪除符號連結法):

sudo rm /etc/apache2/mods-enabled/php5.load
sudo rm /etc/apache2/mods-enabled/php5.conf
sudo /etc/init.d/apache2 restart

啟用 PHP 模組範例 (手工建立符號連結法):

sudo ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load
sudo ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf
sudo /etc/init.d/apache2 restart

記得喔,在關閉或啟用模組後,要重新啟動 Apache 喔!而如同之前提到的,在 Ubuntu 裡面還有工具程式可以自動幫您管理模組開關的符號連結設定,我們現在來試試看吧!

關閉 PHP 模組範例 (使用工具程式):

sudo a2dismod php5
sudo /etc/init.d/apache2 restart

啟用 PHP 模組範例 (使用工具程式):

sudo a2enmod php5
sudo /etc/init.d/apache2 restart

而筆者比較喜歡透過工具程式來啟用或關閉模組,至少可以少打很多字,也避免打錯字的問題唷!

啟動或關閉 sites-available 裡面的虛擬站台

在 Apache2 安裝好以後,系統裡面只有一個虛擬站台,也就是預設根目錄在 /var/www 的那個網站。在 Debian 和 Ubuntu 裡面,基本上是把所有的站台都當成虛擬網站來看,所以管理上會有比較好的一致性。而以下的範例是筆者伺服器上面的,除了預設的站台以外,又多了一個 www.emook.org.tw 虛擬主機,這樣同一個 Apache Server 就能用同一個 IP 服務數個網站。這裡的重點在於管理站台是否啟動。而範例中的第二個虛擬站台 emook 是筆者自己建立的唷,詳細設定方式,會在 14-3-3 提及。

察看可用站台與啟用的站台:

dbtsai@ubuntu:~$  ls /etc/apache2/sites-available/
default  emook
root@www:/home/dbtsai# ls -l /etc/apache2/sites-enabled/
total 0
...略...   000-cqis -> /etc/apache2/sites-available/default
...略...   emook -> /etc/apache2/sites-available/emook 

如以上範例,我們看到的架構和符號連結其實和之前講模組啟用與關閉一樣,所以讀者可以使用手工建立或刪除符號連結,或者用 Ubuntu 內附的工具程式。有時候在 sites-enabled 裡的檔案前會有數字,那個沒有關係。我們在工具程式裡面所加的參數名稱是 sites-available 裡面那一些喔!

關閉 emook 站台範例:

sudo a2dissite emook
sudo /etc/init.d/apache2 restart

啟用 emook 站台範例:

sudo a2ensite emook
sudo /etc/init.d/apache2 restart

重要的設定檔

讀者或許會很好奇,在 Ubuntu 裡面虛擬主機或模組的設定可以那麼模組化,把不同功能的設定寫在不同檔案,再 include 進來,避免了所有設定都放在同一個檔案可以會很亂的問題,也改善了虛擬主機增加或減少的不方便。其實 Ubuntu 的 Apache 和其他的發行版一樣,在啟動的時候是去抓 /etc/apache2/apache2.conf,但特別的是,在 Ubuntu 和 Debian 的 apache2.conf 如以下內容,有特殊的地方。

apache2.conf 裡面達成設定功能分離的方法:

‧‧‧(略)‧‧‧
# 讀入 mods-enabled 裡面所有副檔名是 load 和 conf 的設定檔。
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
‧‧‧(略)‧‧‧
# 讀入 httpd.conf 達成和舊版 apache 的相容性,並讀入 ports.conf 來指定
# Apache2 所使用的通訊埠。
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
‧‧‧(略)‧‧‧
# 讀入使用者額外設定的設定檔,那麼就不用寫在 apache2.conf,會比較整齊。
Include /etc/apache2/conf.d/[^.#]*
‧‧‧(略)‧‧‧
# 讀入 sites-enabled 裡面所有虛擬主機設定檔。
Include /etc/apache2/sites-enabled/[^.#]*

所以在讀取 apache2.conf 時,Apache2 會引入 mods-enabled 和 sites-enabled 以及 httpd.conf 和 ports.conf 到系統內,這也是為什麼在 Ubuntu 可以做到設定檔功能分離的原因。

( 表 14-3-1 Apache2 重要的設定檔與目錄 ) 設定檔或目錄 功能 /etc/apache2/apache2.conf 主要的設定檔,包含了系統整體的重要設定,並在裡面引入其他設定檔。 /etc/apache2/httpd.conf 為了早期第三方模組的相容性,這個設定檔提供給那些模組用 apxs2 來作設定。如 FrontPage Server 就會把設定寫在這裡。 /etc/apache2/mods-available/ 所有可以使用的模組設定檔都會放在這裡面,其中副檔名是 load 的負責載入函式庫,副檔名為 conf 是該模組的設定檔。 /etc/apache2/mods-enabled/ 由於 apache2.conf 只 include 這個目錄裡面所有的 conf 和 load 檔,因此真正要啟用該模組的話,必須從 mods-available 建立符號連結到此目錄。注意在建立符號連結時,若有 conf 檔也需要同時和 load 檔都建立符號連結。當然讀者可以使用 a2enmod 和 a2dismod 來管理。 /etc/apache2/sites-available/ 所有可以使用的虛擬主機設定檔放置處,讀者可以在這裡增加您的虛擬主機。 /etc/apache2/sites-enabled/ 實際上 apache2.conf 會啟用該目錄底下所有設定,因此讀者需要從 sites-available 建立符號連結到此目錄。也可以使用 a2ensite 和 a2dissite 管理。 /etc/apache2/conf.d/ 裡面可以放一些讀者自己的額外設定,會比較容易管理。 /etc/apache2/ports.conf 定義 Apache2 Server 所使用的 port,預設是 80。 /etc/logrotate.d/apache2 紀錄檔循環設定,當流量很大時,可以修改來減少保存期限。 /var/log/apache2/ 該目錄底下存放了 Apache 的各種紀錄檔。 /var/www Apache2 預設的網頁放置處。

( 表 14-3-2 Apache2 重要的執行檔 ) 指令 功能 /etc/init.d/apache2 控制 Apache 執行,或關閉的 script。後面參數可以加 start,stop 或 restart。 a2enmod 啟動參數所加的模組,原理是建立符號連結到 mods-enable。 a2dismod 關閉參數所加的模組,原理是刪除符號連結。 a2ensite 啟用參數所加的虛擬主機,原理是建立符號連結到 sites-enable。 a2dissite 關閉參數所加的虛擬主機。 apache2ctl -t 檢查設定檔是否有錯誤 apache2ctl -S 列出目前伺服器上所有虛擬主機

apache2.conf 設定

這裡筆者精選在 apache2.conf 裡面比較重要的地方,告訴讀者該設定的意義和注意事項。在該設定檔中,有很多被註解起來的地方實際上已經分離到其他地方了,所以若沒有必要的話,儘量不要把那些註解起來的東西啟用唷!

apache2.conf 裡面重要的地方:

# Apache Server 設定檔放置處
ServerRoot "/etc/apache2"      

# Client 多久沒回應就 timeout,網路狀態不好可改大一點。
Timeout 300                  

# KeepAlive 為是否開啟連續請求的功能,當打開時每次 Client 端建立連線後,
# 可以要求數個檔案,而不必要重新建立連線。建議把它打開,會有比較好的效能。
KeepAlive On

# MaxKeepAliveRequests 是每次 Client 端建立連線後,可以要求最大的檔案數,
# 讀者設成 0 為不限制,或者可以把它設高一點,尤其是在網頁很複雜的時候,
# 效能會有明顯改善。通常設 100 到 300 之間已經很夠用啦!
MaxKeepAliveRequests 100

# KeepAliveTimeout 是當連續請求時,Clinet 端多久沒有在繼續請求就把他踢下線。
# 這個單位是秒鐘,不要開太大,不然資源可以會被這些不請求的 Client 端佔著。
KeepAliveTimeout 15

# StartServers 為 Apache2 啟動時,會啟用幾個 processes,讀者可以透過 ps -aux
# 來驗證。若您的網站流量很大,可以改大一點,但是若用量沒有那麼大,會浪費
# 系統資源,通常預設的 5 已經很夠用了。
# MinSpareServers 可閒置的最少 processes,通常都會設定的和 StartServers 一樣。
# MaxSpareServers 最大可閒置的 processes,若您的網站流量時大時小,那麼這個值
# 可以設大一點,避免人多的時候要開新的 processes,但是設太大會增加系統資源。
# MaxClients 最多可以有幾個客戶端連線,預設的 20 似乎有點少,可以視您網站的
# 規模改到 200 以上。但是預設不能超過 256,若要超過的話需要自己額外加上
# ServerLimit 的參數,定義最大可以有幾個 Client,這個值最大到 20000,若
# 還要在大的話就要修改原始碼的定義。
# MaxRequestsPerChild 每一個 processes 可以有多少個連線數要求。通常設成 0 為
# 不限制。   
<IfModule prefork.c>
StartServers         5
MinSpareServers      5
MaxSpareServers     10
# ServerLimit       3000   # 若 MaxClient 要大於 256,需要有這一個參數。
MaxClients          20
MaxRequestsPerChild  0
</IfModule>

# 在設定檔內,還有其他 MPM 可以修改,如 worker 和 perchild 等,但這些在有
# PHP 的環境下不會使用到,所以讀者可以不要管他們。

# Apache2 Server 執行時所用的帳號和群組,若沒有特別的理由,可以不用更動。
User www-data
Group www-data

# 全域的錯誤紀錄檔放置處,個別虛擬主機的設定可以在 sites-available 另外指定。
ErrorLog /var/log/apache2/error.log

# 拜託,AddDefaultCharset 千萬不要加上去。有些書會教這個要改成 Big5 來
# 解決亂碼的問題,這是不好的方式!這個方式會在表頭就送出說這個網頁是用什麼
# 語言編碼,但是若您的網頁有 big5 和 utf-8 混用的話,就會造成錯誤!
# 正確的作法是在網頁 html 內都指定編碼,如
# <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
# 後面那些 AddCharset 是指可以支援的編碼,預設都設好了,不要改動。
#AddDefaultCharset	Big5
AddCharset utf-8       .utf8
AddCharset big5	       .big5 .b5

# 若沒有明確指定網頁檔名,Apache2 會依序以下順序來嘗試送給 client 端瀏覽器
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml

網站設定檔

在 apache2.conf 只作一些全域的設定,若要設定個別虛擬主機或網站的設定,需要修改的地方就在 /etc/apache2/sites-available/ 裡面。這裡筆者先介紹一下預設的網站 default 裡面的架構,額外增加的虛擬主機設定方式是一樣的。

預設網頁 /etc/apache2/sites-available/default 的設定檔擷選:

NameVirtualHost *
<VirtualHost *>
	ServerAdmin dbtsai@localhost        # 網頁管理者 E-Mail
	DocumentRoot /var/www              # 網頁放置的根目錄

# Options 裡面可以有許多參數,以下將個別簡介。
#   Indexes         當 Client 找不到 index.html 等首頁時,就列出該目錄底下
#                    所有檔案。因此有一點危險性存在,通常是建議關閉。
#   FollowSymLinks   讓您在該目錄底下可以讀取到符號連結到非網頁根目錄內的
#                    檔案。例如現在根目錄是 /var/www,我們建立一個從 
#                     /home/web 建立一個 soft link 到 /var/www/web 後,
#                     若有開啟這個選項,才能讀取到 /var/www/web 的內容。
#   MultiViews       提供同一個網址有多國語言的功能。原來是依照 Client 送來
#                    的語言偏好 header 送回不同語言版本的網頁。例如 Google
#                    就是採用這種方式達成同一網址有多國語言的功能。  
#
# AllowOverride 和 .htacces 有關。 .htaccess 可以在網頁目錄下取代全域的 
# 網站設定,這樣的好處是可以讓一般使用者不用有 root 權限就可以修改
# 參數,使用彈性也會比較大。它可以設定的參數有以下幾個。
#    AuthConfig      可以在 .htaccess 裡面設定網頁認證的功能
#    Options         可以在 .htaccess 裡面重設 Options 選項
#    All             以上所有功能都能在 .htaccess 被重設
#    None            不使用 .htaccess 來重設變數

	<Directory /var/www/>              # 定義該目錄的網頁權限
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

# 設定 CGI 程式相關參數
	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>
# 錯誤紀錄檔放置的地方
	ErrorLog /var/log/apache2/error.log

# 錯誤紀錄檔的紀錄層級,不同的設定會有不同的紀錄精細度。
	LogLevel warn

# 瀏覽紀錄檔的放置處,裡面紀錄了 Client 端詳細資訊
	CustomLog /var/log/apache2/access.log combined
	ServerSignature On

</VirtualHost>

增加虛擬主機

虛擬主機 Virtual Host 的定義是一台 Apache 主機可以處理超過一個 domain,例如有兩個網址都同時對應到該主機 IP,而主機能依照網址不同給與不同的網頁。這種技巧用最多的是主機出租商,因為他們不可能給每個承租的人個別主機與 IP,所以用這種方式在同一台主機上架很多網站。

實作的方式有兩種,一種是 IP Based,另外一種是 Host Based。所謂的 IP Based 是該主機有很多的 IP,用戶連結到不同 IP 會有不同的結果,但是這種方式成本很高,尤其是在目前 IP 短缺的情況下,但優點是對用戶瀏覽端相容性最好。Host Based 是不同網域對應到同一個 IP,連線到這些不同的網域會有不同的結果。讀者或許會奇怪,實際連線不是和網域沒關,那怎樣達成這種功能呢?記不記得 Client 和 Server 溝通時,在 HTTP 1.1 協定中規定 Client 要在表頭送出 Host 告訴 Server 是要連到哪一個虛擬主機,因此 Server 可以依據這個判定要送回的網頁是哪一個。因此使用 Host Based 的技術必須要瀏覽器有支援才行,目前幾乎市面上所有瀏覽器都有支援了,故現在主流使用的技術是 Host Based。

讀者若要建立新的虛擬主機,首先要確定的是該網域已經設定好 DNS 紀錄,並將該紀錄指向主機的 IP。筆者的環境是虛擬主機的網址是 www.emook.org,而虛擬主機網頁放置的地方是 /home/emook。

大部分虛擬主機的需求是 Host Based,所以這裡我們示範的是 Host Based 的 Virtual Hosting。由於預設主機的設定檔 default 已經是很完整的架構,我們就直接用它來當範本稍微修改給虛擬主機用吧!

拷被範本:

cd /etc/apache2/sites-available
sudo cp default emook           # 這個 emook 是筆者自己取的,讀者可以自己命名

接下來編輯這個新的設定檔。

新的虛擬主機 /etc/apache2/sites-enabled/emook 設定檔擷選:

# NameVirtualHost *                       # 這一行要註解起來

	DocumentRoot /home/emook            # 修改網頁放置的根目錄
      ServerName www.emook.org             # 加入該虛擬主機所傾聽的網域
	<Directory /home/emook>             # 修改定義網頁權限的路徑
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

簡單的說,只有要改 4 個地方,先註解掉 NameVirtuHost 後,再修改兩個和根目錄有關的路徑,還有加入新設定 ServerName,其他的地方都可以不需要更動。

啟用新的虛擬主機站台:

sudo a2ensite emook
/etc/init.d/apache2 restart

使用 mod_deflate 來壓縮網頁並節省頻寬

要加快網頁讀取速度,可以從擴充網站頻寬或者瘦身網頁著手。但在台灣頻寬很貴的情形下,如何節省網站所使用的頻寬來容納更多使用者上線是更重要的議題。如大家所知道的,純文字檔可以壓縮到非常小,大概是原來的 40% 以下,若是您的網站以文字為主的話,啟用網頁壓縮大概可以節省一半以上的頻寬。壓縮網頁的好處不只是您網站節省一半的頻寬,讓可以同時上站的人數成為兩倍,也因為網頁壓縮順便讓用戶更快瀏覽網頁呢!當然壓縮網頁也是有壞處的,它會增加伺服器的 CPU 處理負擔,不過在衡量頻寬和 CPU 處理時間,算一算還是壓縮網頁比較划算。目前這種技巧在各大入口網站都有使用,如 Google 和 Yahoo 等。

或許讀者會怕會不會有一些瀏覽器不支援,那送過去壓縮的網頁會不會讓他們不能看呢?其實不用擔心,因為在瀏覽器和伺服器請求網頁的表頭,會告訴伺服器可以接受的壓縮格式,因此當瀏覽器沒有支援壓縮時,伺服器不會送出經過壓縮的網頁,況且目前市面上幾乎所有主流的瀏覽器都已經支援網頁壓縮的功能,因此筆者是建議大家都可以開啟網頁壓縮模組!

若讀者想要知道某個網頁伺服器是否有支援網頁壓縮,必須要從瀏覽器和伺服器的溝通表頭判讀,但是因為預設 Firefox 沒有支援讓使用者知道這些訊息,所以需要安裝一套 livehttpheaders http://livehttpheaders.mozdev.org 的外掛,若您只是要啟動壓縮模組但不想知道哪些網站有提供壓縮功能,這個可以不用安裝。安裝後,連到您想要測試的網頁,在 Firefox 裡面選擇『工具』→『頁面資訊』→『header』可以看到如圖 14-3-1 內顯示的表頭資訊。在標記 1 的地方是瀏覽器傳給伺服器的支援壓縮格式,標記 2 是伺服器告訴瀏覽器所使用的壓縮格式。當瀏覽器有支援,但伺服器沒有支援時,那麼在標記 1 個地方還是一樣,但是標記 2 的地方就不會有壓縮資訊,因此瀏覽器就會用沒有壓縮的方式處理。這個外掛同時也能得知網頁的大小,讀者可以試著啟用壓縮和沒有啟用壓縮來比較看看,在筆者的網頁中,首頁沒有壓縮有 6k 左右,壓縮後大約只剩下 1.7k,大約變成原來的三分之一。 圖 14-3-1 判別某網頁伺服器是否有啟動壓縮的功能

啟用網頁壓縮模組:

sudo a2enmod deflate

當啟用了壓縮模組後,預設網頁還是不會壓縮,必須要自己指定哪些類型的檔案要壓縮。這個設定可以放在各個虛擬主機的個別設定內 (sites-available),讓不同的主機有不同的規則,或者自己寫一個新的設定檔放在 conf.d 裡面,這個就讓讀者視情形自己決定。筆者自己的習慣是放在 conf.d 裡面讓所有的虛擬主機可以享用到網頁壓縮的好處。

編輯壓縮模組設定檔 /etc/apache2/conf.d/deflate.conf:

<IfModule mod_deflate.c>
# 壓縮率設定。值可以是 1 到 9,值越大壓縮率越高,網頁越小。
# 通常設為 5 或 6 就夠了,再高就是浪費系統資源。
DeflateCompressionLevel 6      

# 由於圖檔已經有壓縮過,再壓縮效率不好,或者如 MP3 等檔案,再壓縮效率
# 不高,所以我們明確的指定哪一些格式要壓縮!格式列表讀者可以參考 
# /etc/mime.types。有些人使用全部壓縮的設定,在另外排除不要壓縮的檔案,
# 不過這樣很容易有忘了排除的,導致壓縮到非文字檔使 Server 效能變差,所以
# 筆者還是喜歡使用個別指定的方式。以下是筆者所用的內容,讀者可以參考使用。
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/postscript
  
    <IfModule mod_headers.c>
      # 處理壓縮過網頁經過 proxy 的問題
      Header append Vary User-Agent
    </IfModule>
</IfModule>

這裡再次提醒讀者,網路上有些人使用的規則是先設所有檔案都要壓縮,然後再把不要壓縮的另外設出來。此時若您例外沒有設到 avi 檔,這時候當您的網站有開放這類的檔案讓人下載,您就慘啦!這種檔案壓縮都要幾十分鐘,耗費 CPU 資源很大,壓起來幾乎不會變小,此時您的網站反而會像龜速!所以建議您只壓縮文字檔格式的檔案。

重新啟動 Apache2:

sudo /etc/init.d/apache2 restart

讀者可以透過之前討論的 Firefox 外掛 livehttpheaders 來確認您的網頁主機是否已經啟用壓縮機制。讀者也可以使用一些流量監控軟體,如 MRTG 等等,您會發現您的流量變小大概一半唷!使用者也會減少抱怨網路很慢啦!

讀者可以把各個使用者讀取網頁的壓縮率寫到紀錄檔中,之後也可以用一些工具程式來分析網站壓縮後流量減少多少,和壓縮策略等進階議題。

由於這個紀錄檔的設定檔要寫在各個虛擬主機設定裡面,無法放在全域變數裡,但是把它直接寫在 sites-available 裡面會很亂,所以筆者是習慣額外寫在其他地方,在用 include 的方式引入。這樣測試完成後,也可以取消這個紀錄檔紀錄的功能,來節省系統檔案空間。

編輯 /etc/apache2/DeflateNote.conf :

<IfModule mod_deflate.c>
  DeflateFilterNote Input instream
  DeflateFilterNote Output outstream
  DeflateFilterNote Ratio ratio
  LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate

# 紀錄檔位置設定建議不要放在這裡,這樣可以多個虛擬主機共用 DeflateNote.conf
# 並且紀錄檔都分別紀錄到不同的地方。
#  CustomLog /var/log/apache2/deflate.log deflate
</IfModule>

接下來要把這個功能放到虛擬主機設定裡面,編輯您要紀錄的虛擬主機設定檔吧!編輯 /etc/apache2/sites-available/default :

<VirtualHost *>
# 在 VirtualHost 後面加上以下這兩行。
  include /etc/apache2/DeflateNote.conf                   # 引入壓縮率紀錄 
  CustomLog /var/log/apache2/deflate-default.log deflate  # 設定紀錄檔放置位置

設定好後,重新啟動 Apache2,最後開放主機給使用者測試,過一段時間後,讀者可以去分析紀錄檔,看省下來的頻寬有多少,各種不同格式的壓縮率是多少,是否有可以壓縮的檔案類別沒有加上去或不可壓縮的類別被壓縮到了,再去細部調整規則。

觀看壓縮率紀錄檔:
dbtsai@ubuntu:~ $ more /var/log/apache2/deflate-default.log
"GET /cindex.php HTTP/1.1" 5558/26844 (20%)
"GET /pic/pic%20dll/c-paper1.gif HTTP/1.1" -/- (-%)
"GET /cindex.php?name=./c/project.htm HTTP/1.1" 9240/30380 (30%)
"GET /pic/title/c-program.gif HTTP/1.1" -/- (-%)
"GET /cindex.php?name=links.htm HTTP/1.1" 5281/24956 (21%)
"GET /pic/title/tlink.png HTTP/1.1" -/- (-%)
"GET /pic/lorp.gif HTTP/1.1" -/- (-%)

如筆者網站,幾乎所有純文字檔的網頁壓縮後只有原來的 25% 左右,若考慮圖檔沒有壓縮的話,大概頻寬可以節省一半,並且 CPU 資源大約多個 5% 而已。使用者也回報網站反應速度變快了!記得喔,測試完了以後,建議把壓縮率紀錄檔拿掉,不然很佔空間。

啟用個人網頁

在 Ubuntu 裡面,Apache2 把使用者個人網頁獨立到一個額外的模組和設定檔。因此要開啟或關閉使用個人網頁的功能是很簡單的。

啟用個人網頁:

sudo a2enmod userdir
sudo /etc/init.d/apache2 restart

關閉個人網頁:

sudo a2dismod userdir
sudo /etc/init.d/apache2 restart

個人網頁的設定一般可以不需要修改,但是預設的設定有啟用 Indexes,也就是瀏覽器在找不到預設網頁時會列出所有該目錄下的檔案,所以讀者可以視自己需要去修改預設的設定。這些設定的內容已經在 14-3-2 有詳細的說明,讀者可以參考那裡的解釋。

個人網頁設定檔 /etc/apache2/mods-available/userdir.conf:

<IfModule mod_userdir.c>
# 在使用者家目錄底下的 public_html 為個人網頁目錄
        UserDir public_html        
 
# 關閉 root 不能使用個人網頁
        UserDir disabled root

# 以下是預設的個人網頁目錄設定,若讀者要修改成不是放在 public_html 的話,
# 要同時修改 UserDir 和 以下的 Directory 裡面的目錄位置。
        <Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        </Directory>
</IfModule>

設定好了以後,一般使用者可以在自己家目錄底下建立 public_html 的目錄來存放網頁,並且瀏覽器可以透過 http://192.168.0.183/~UserName/ 來連到該使用者的個人網頁,其中 UserName 是使用者的帳號。

PHP 設定

設定檔設定

配合 Apache2 使用的 PHP 模組基本上不需要再修改,但是有些網頁是用 APS style tag 或者有些舊的程式再傳遞變數的時候採用全域變數的做法,但在 PHP5 預設已經關閉全域變數傳遞來避免一些安全性問題。這時候若想要跑這些早期的程式,就得要自己修改一下 PHP 設定檔。所以這裡不能免俗的要稍微介紹一下設定檔內容。提醒讀者一下,在 PHP 的設定檔是使用分號 ; 來當成註解的開頭,讀者不要搞錯了唷!

PHP 設定檔重要部份擷選 /etc/php5/apache2/php.ini:

; 啟用 ASP style tag,通常用在早期使用 FrontPage 開發 ASP 程式時,
; 用 <? phpinfo(); ?> 這種 tag 來取代 <? phpinfo();?> 這種正規的 tag。
asp_tags = Off

; 每個 PHP 程式最大可以執行的時間 (秒),通常不需要改動。
max_execution_time = 30 

; 每次 PHP 程式分析要求的數據所能使用的最大時間 (秒)。    
max_input_time = 60 

; PHP 程式最大能使用的記憶體空間。如果有些程式需要比較多的記憶體,
; 可以自己到 32M 或者更高。
memory_limit = 8M   

; 啟動全域變數,這是很不安全的唷!但是若您早期的程式在 POST 和 GET 的
; 變數沒有考慮到這個問題,就得要把它 On 起來。不過誠懇的建議您找本 PHP 的
; 書來弄懂這個問題,然後修正程式碼。筆者曾經處理過利用這種 bug 被入侵的站台,
; 可見打開這個選項的安全性危害很大,所以建議不要打開。
register_globals = Off

; 最大可以上傳的檔案大小。		
upload_max_filesize = 2M

記得修改 php.ini 後,一定要重新啟動 Apache2 Server 才會生效唷!

使用 eAccerator 來加速 PHP程式

雖然 PHP 程式碼很容易撰寫,成為中小型網站最佳的解決方案,但是它不是沒有缺點的。由於 PHP 屬於直譯式語言,所以在執行的時候需要直譯器 (interpreter) 把程式碼即時翻譯成為機械語言 (opcode),所以效能沒有那些需要編譯的 C++ 或者 Java 那麼快!由於是即時翻譯成 opcode,所以在 PHP 引擎上也很難最佳化一些迴圈策略等,這也是 PHP 效能不彰的另外一個原因。

所以市面上就出現了各種加速器,可以把 PHP 直譯後的 opcode 儲存起來,不需要每一次執行都需要在重新翻譯一次,此時執行 PHP 的效能會比沒有使用還要快,也就是可以透過加速器來減少 PHP 在伺服器上所使用的 CPU 資源。效能增加的多寡和網頁的複雜度有關,網頁越複雜可以最佳化的地方越多,也可以省下來越多即時翻譯的時間,按照筆者的經驗是可以增加大約 10% 到 400% 左右的網頁伺服器效能,也就是不考慮頻寬問題的話,在相同的硬體資源可以平均增加大約一倍的使用者。

最有名的商業加速器就是 Zend Optimizer。而 PHP Engine 也是由同一公司維護的。該公司在 PHP 引擎是採取開放原始碼模式,讓大家都可以使用 PHP 來寫網頁,並且從服務與加速器來獲得公司的利潤。當然該公司也是 PHP 的核心維護者,所以相容性和效能是最好的,但是價格也是最貴的,這裡筆者要和讀者分享的是開放原始碼方案。

幾年前效能最好的 PHP 加速器是 Turck MMCache,但是該加速器的作者被 Zend 挖角,所以 MMCache 就幾乎就沒有發展了。後來一群人接下了 MMCache 的原始碼,並且重新改寫,成立了接下來要介紹的新專案 eAccelerator。

由於 eAccelerator 目前還沒有被 Ubuntu 收錄,而在 Ubuntu 套件庫裡面的 MMCache 不支援 PHP 5,所以以下示範我們將從 tarball 安裝。

首先從 http://www.eaccelerator.net/ 下載原始碼,由於 eAccelerator 要 0.9.5 以上才支援 Ubuntu 內附的 PHP 5.1,所以這裡筆者使用 0.9.5-rc1 作為範例,讀者可以安裝最新的版本。

安裝 eAccelerator:

# 下載原始碼,路徑可能會更動,讀者自己去下載點抓吧!
dbtsai@www:~$ wget http://bart.eaccelerator.net/source/0.9.5/eaccelerator-0.9.5-rc1.tar.bz2

# 解壓縮原始碼
dbtsai@www:~$ tar xvf eaccelerator-0.9.5-rc1.tar.bz2

# 安裝編譯時所需的套件和函式庫
dbtsai@www:~$ sudo apt-get install build-essential php5-dev

dbtsai@www:~$ cd eaccelerator-0.9.5-rc1

# 產生編譯所需的組態設定檔
dbtsai@www:~/eaccelerator-0.9.5-rc1$ phpize
dbtsai@www:~/eaccelerator-0.9.5-rc1$ ./configure

# 開始編譯
dbtsai@www:~/eaccelerator-0.9.5-rc1$ make
# 安裝到系統上
dbtsai@www:~/eaccelerator-0.9.5-rc1$ sudo make install 

# 建立 eaccelerator 所使用的暫存目錄
dbtsai@www:~$ sudo mkdir /tmp/eaccelerator
dbtsai@www:~$ sudo chmod 0777 /tmp/eaccelerator

接下來要編輯 php.ini 把 eAccelerator 的模組啟動。讀者只需要在 php.ini 的最後面加上以下幾行就可以啦!

在 /etc/php5/apache2/php.ini 最後面加上以下幾行:

; ‧‧‧(略)‧‧‧
; 設定檔解釋請參考 http://eaccelerator.net/wiki/Settings
extension="eaccelerator.so"
; shm_size 為 eAccelerator 可以使用的記憶體大小,預設的 16 有點不夠,可以
; 改到 64 或 128,視您伺服器上的記憶體而定
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

重新啟動 Apache2 讓剛剛的設定生效:

dbtsai@www:~$ sudo /etc/init.d/apache2 restart

這樣子就安裝好了唷!接下來可以測試到底效能增加多少,在業界網頁伺服器的效能是使用 Apache Benchmark (ab2) 這個程式來測試。由於 ab2 會消耗掉待測主機的資源,並且會讓整個網路都趨於繁忙的狀態,所以您若要測試您的伺服器,請在本機上或者同一個區域網路內測試,這樣才會有正確的結果。也因為這個程式會消耗掉幾乎所有被測試主機的資源,所以若對非您的主機測試的話,可能會被視為阻斷式 (DoS) 攻擊,所以別亂對非經過授權的主機測試喔!

ab2 使用方式:

# 這個範例就是對該網址發出 5000 個請求,並且使用 20 的 thread
 ab2 -n 5000 -c 20 http://xxx.xxx.xxx/index.php

在筆者自己的測試結果中,原先伺服器每秒可以提供 11 個動態請求,安裝了加速器後可以提供 32 個動態請求,大約增加三倍的網頁伺服器效能,也就是在同樣多的使用者下,可以約省下三分之二的 CPU 資源。

另外讀者也可以透過 14-2-2 裡面提及的 phpinfo() 函式來瞭解到 eAccelerator 已經被正確的安裝,此時會如圖 14-4-1 出現 eAccelerator v0.9.5-rc1 的字串。 圖 14-4-1

配合之前提到的網頁文字檔壓縮來節省頻寬,在加上使用 eAccelerator 來節省處理動態網頁所需要的 CPU 資源,在筆者的個人網站可以讓最高線上人數在多上三倍,這也是在有限的資源內壓榨出最好的效能。包含全球最大的開放原始碼網站 http://sourceforge.net/ 都使用 eAccelerator 了,其它的網站更是不計其數。並且對於討論區或者一些大型的架站機如 xoops 等,加速效果更是明顯,聰明的讀者為何不給它一個機會去嘗試看看呢?

MySQL 設定

從 1995 年 MySQL 釋出到網路上給大眾使用,到現在已經過了十幾個年頭。隨著使用的人愈來愈多,越來越成熟,它也開始跨足原來大型商業資料庫市場。而原來的開發者組成了 MySQL AB 公司,以服務或者商業授權來獲得公司的利益。該公司讓 MySQL 擁有雙重授權,一個是 GPL 授權,一個是私有軟體授權,讓一般符合 GPL 法規的應用可以直接在網路上下載使用,若遇到問題,可以考慮付費給 MySQL AB 公司解決。若是要整合 MySQL 來作非自由軟體使用,那麼 MySQL AB 也有私有軟體的授權可以賣給您。

因為商業化的關係,MySQL 的開發者在有金費的開發環境下可以無後顧之憂的改善 MySQL,目前它漸漸擁有一些商業資料庫所需要的特性,因此傳統的資料庫軟體公司開始受到威脅,慢慢的也開放他們的產品在某些條件下免費使用,形成良性競爭。

由於 SQL 是一門獨立的學問,在這裡筆者無法詳細的討論,基本上 MySQL 的東西需要一本專書才能通盤瞭解,因此這裡只能給讀者一些很基礎的概念,例如怎樣備份和修改密碼等等。在管理資料庫上,若要使用文字模式來管理其實很不方便,讀者可以考慮安裝 phpMyAdmin 來管理,詳細使用方式請參考網路上文章或者相關書籍。 [編輯] 忘了或修改 MySQL 密碼

在 Ubuntu 或 Debian 的 MySQL 都有一個很特殊的帳號 debian-sys-maint,這個帳號是安裝完 MySQL 後自動產生的,並且擁有所有權限。它的帳號和密碼寫在 /etc/mysql/debian.cnf 裡面。為了安全因素,它的權限是 600,也就是只有 root 可以看的到它!由於這個帳號的密碼是隨機產生的,所以並不適合用在網頁中或者其他正式用途上,讀者應該把這個帳號當成救急用或者管理使用。還有一個需要讀者注意的是,讀者不能直接改 debian.cnf 來改這個帳號的密碼,這是沒有效的!實際上它的密碼是放在資料庫,所以你改了該檔案後還是不會同步回資料庫裡面,Ubuntu 把密碼寫在那個檔案純粹是提醒讀者和救急使用的唷!若真的逼不得已要改,必須修改 debian.cnf 後,再用後面講到的方式修改該帳號的密碼到資料庫。

debian.cnf :

dbtsai@ubuntu:~ $ sudo more /etc/mysql/debian.cnf

  1. Automatically generated for Debian scripts. DO NOT TOUCH!

[client] host = localhost user = debian-sys-maint # 救急用帳號 password = bsP8stUuZRqKvhre # 救急用密碼 socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] host = localhost user = debian-sys-maint password = bsP8stUuZRqKvhre socket = /var/run/mysqld/mysqld.sock

當知道某帳號的密碼時,可以使用以下方式修改,這個方式一般個人 MySQL 使用者也可以使用。

在知道原始密碼的情況下修改 MySQL 密碼:

mysqladmin -u <帳號> -p password <輸入您要的新密碼>

  1. 按 ENTER 後輸入原來的舊密碼

當您不知道原先的密碼時,或者密碼遺失等等,可以使用救急帳號的帳號密碼來修改其他帳號的密碼。當您修改過 debian.cnf 要把他同步回資料庫,也可以使用這種方式。

用急救帳號或者 root 帳號修改其他帳號的 MySQL 密碼:

  1. 若使用者知道 MySQL root 密碼時,也可以使用同樣方式來修改其他帳號密碼。
  2. 當使用救急帳號時,其實可以不用輸入帳號和密碼,直接用以下指令引入 debian.cnf
  3. mysql --defaults-extra-file=/etc/mysql/debian.cnf

dbtsai@ubuntu:~ $ mysql -u <救急帳號> -p Enter password: <---- 這裡輸入在 Debian.cnf 看到的密碼 mysql> use mysql

  1. 以下範例修改 root 密碼為 abcdef,同樣的方式可以改其他帳號
  2. 也可以用 set password for root@localhost = password('abcdef);
  3. 不過這個是明確指定修改在主機 localhost 上的帳號。

mysql> update user set password=password('abcdef') where user='root';

  1. 將權限紀錄更新

mysql> flush privileges; mysql> quit

最後一種情形是 debian.cnf 裡面的帳號莫名其妙的不能用,而且 root 帳號的密碼也搞丟了,這時候就比較麻煩了!此時需加上省略帳號認證的參數來略過帳號檢查並進入 MySQL 系統中。

當什們帳號密碼都不知道時,修改 MySQL 密碼的方式:

dbtsai@ubuntu:~ $ sudo /etc/init.d/mysql stop # 關閉 MySQL dbtsai@ubuntu:~ $ sudo mysqld_safe --skip-grant-table & dbtsai@ubuntu:~ $ mysql

  1. 接下來就和上一個範例一樣,輸入 SQL 指令來修改密碼,唯一不同的是
  2. 這個方式進入 MySQL 是不用密碼的!注意,改完後要趕快關閉 MySQL
  3. 再用正常的方式重新啟動,不然很容易被入侵!

dbtsai@ubuntu:~ $ mysqladmin -u root -p shutdown # 關閉 MySQL 伺服器 Enter password: <---- 輸入剛才改完的密碼 dbtsai@ubuntu:~ $ sudo /etc/init.d/mysql start # 啟動 MySQL 伺服器

[編輯] 資料庫備份

除了透過 phpMyAdmin 來用網頁介面備份資料庫,常見的作法是備份整個 /var/lib/mysql,還原的方式也很簡單,只要拷回去即可,通常會配合 crontab 定時把該目錄 tar 起來。

使用 tar 備份完整資料庫:

sudo tar zcvf sql_backup.tgz /var/lib/mysql

但是透過備份 /var/lib/myqsl 的交換性比較差,有時候換到不同版本的 MySQL 主機可能會不相容,所以這裡筆者比較常把 SQL 資料 dump 到一個文字檔裡面,這裡面還會包含還原資料庫的 SQL 指令,所以很容易帶到不同主機上還原使用。

使用 mysqldump 備份資料庫:

  1. 使用以下指令可以用 root 身份備份 mysql 這個資料庫到 filename.sql
  2. 若要寫在 crontab 裡面使用,那麼輸入 MySQL root 帳號的密碼是很麻煩的!
  3. 此時筆者會配合 --defaults-extra-file=/etc/mysql/debian.cnf
  4. 自動輸入帳號密碼。若要備份整個資料庫的話,需要用 --all-databases 的參數。

mysqldump -u root -p --databases mysql > filename.sql

以下範例將會引入 debian.cnf 來達成不需要輸入密碼的備份,且將系統上所有的資料庫都備份起來,同時也壓縮成 gz 檔。因為不需要輸入密碼,很適合放在 crontab 裡面自動定時備份。dump 下來的 SQL 原始檔是文字檔,有時候在傳遞時會因為不同系統換行等問題把檔案損毀,所以壓縮起來可以避免這個問題,且大約會讓備份的檔案減少到原來的 30% 左右。

使用 mysqldump 的範例:

  1. 以下有兩行,第一行最後面的 \ 代表換行。如果不打 \ 也可以,就接下去打,
  2. 不用換行。讀者也可以用 bzip 取代 gzip,壓縮率會比較好,不過壓縮
  3. 時間會多很多倍!

dbtsai@ubuntu:~ $ sudo mysqldump --defaults-extra-file=/etc/mysql/debian.cnf \

--all-databases | gzip > backup.sql.gz
  1. 察看備份檔內容

dbtsai@ubuntu:~ $ zcat backup.sql.gz -- MySQL dump 10.10 -- Host: localhost Database: -- Server version 5.0.22-Debian_0ubuntu6.06.2-log ‧‧‧(略)‧‧‧ dbtsai@ubuntu:~ $

上面使用 mysqldump 下來的資料庫備份檔本質是文字檔,那我們要如何復原到資料庫裡面?其實我們只要使用 mysql -u root -p < backup.sql 來匯入該文字檔。遇到壓縮過的資料庫檔案,其實道理是一樣的。因為之前舉的例子是壓縮過的,所以在以下範例中筆者使用 zcat 透過 stdin 送到 mysql 這個程式,並且利用 debian.cnf 裡面的帳號密碼來達成不需要輸入密碼的功能。

將壓縮後的 backup.s ql.gz 資料庫備份還原範例:

dbtsai@ubuntu:~ $ zcat backup.sql.gz | sudo mysql \ --defaults-extra-file=/etc/mysql/debian.cnf

[編輯] 開啟 port 3306 讓非本地端主機連線

為了安全性因素,預設 MySQL 是不允許 client 端從非本機端連線查詢資料。在預設的行為中,client 端只能在本機透過 /var/run/mysqld/mysqld.sock 來和 MySQL 伺服器溝通,也就是在傳遞資料時是不透過 port 3306 而是透過該 socket 來提供內部存取和查詢。

若讀者系統的規劃是 MySQL 主機獨立出來,此時網頁主機就需要透過 port 3306 來和 MySQL 主機連接,這時候就必須在 MySQL 上開啟 port 3306。或者讀者想要讓該 MySQL 主機提供給很多非本地端的使用者使用,也需要打開 port 3306。在打開 port 3306 後,建議讀者要設防火牆來限制可以存取該 MySQL 伺服器的 client 端位置,不然很容易被入侵。

要讓非本地端使用者可以使用 MySQL 只要如以下範例去修改 /etc/mysql/my.cnf,整個過程只要註解掉一行,接下來重新啟動 MySQL 伺服器讓新設定生效。

‧‧‧(略)‧‧‧
# 註解掉下一行來啟用非本地端存取
# bind-address            = 127.0.0.1
‧‧‧(略)‧‧‧