免費IT建置--網頁伺服器的完美組合LAMP(下)
文‧圖/柳百郁 2011/7/19 下午 03:07:06
在Linux作業系統上安裝Apache網頁伺服器並完成相關設定後,其實已完成最基礎的網站建置了,但對於網站上資料的管理、網頁應用程式-例如搜尋、列出表單等動作,還需要資料庫作進一步的管理,並以網頁語言撰寫處理這些資料的方式。
上一期介紹了Linux作業系統的選擇與建置,但對於網站上資料的管理、網頁應用程式-例如搜尋、列出表單等動作,還需要資料庫作進一步的管理。本期,將介紹Linux常見的MySQL資料庫與PHP程式語言,文末還將針對基本的Linux系統設定與防護作出說明。
資料庫-MySQL
無論是企業提供的服務、產品介紹、購物網站或是部落格,其網頁伺服器背後都可能需要資料庫的支援,以有系統的方式儲存資料,不僅便於歸類、查詢,在備份與復原上也會容易得多。MySQL是Linux世界裡的老字號資料庫應用,不但有許多Linux分支套件內建MySQL,其跨平台的支援讓Windows、Solaris甚至是Mac OS的使用者也能使用它。
即便在商業角度上MySQL前途未明,但現在仍是Linux使用者的愛用的資料庫套件,開放源碼社群裡許多的網頁服務與應用,也常見以它為基礎架構。雖然mysql.org搖身一變成了mysql.com,開放源碼使用者還是能夠在dev.mysql.com找到可自由下載的套件與相關說明文件。
Fedora下安裝MySQL的方式,除了圖形界面的套件管理,前文所述的命令列模式yum自動化安裝,以及官方網站原始碼下載自行編譯(compile)外,這裡要介紹的是RPM搜尋網站http://rpm.pbone.net/。RPM pbone集結了90%的rpm套件,在Linux長時間的使用後,使用者常會發現並非所有想要用的套件,都能在分支套件的軟體倉儲裡找到。透過RPM pbone的好處,在於幾乎能找到絕大多數的套件,缺點是必須用rpm程式安裝,而這很可能遇到相依性問題,使用者必須自行解決:
# yum search opennms <== 搜尋opennms套件
Loaded plugins: refresh-packagekit
Warning: No matches found for: opennms
No Matches found <= 回應找不到
# wget ftp://ftp.pbone.net/mirror/ftp.sourceforge.net/pub/sourceforge/o/project/op/opennms/OldFiles/opennms-1.6/opennms-webapp-standalone-1.6.2-1.noarch.rpm <== 利用wget指令,將檔案抓回來
…
# rpm -Uvh opennms-webapp-standalone-1.6.2-1.noarch.rpm <== 以rpm程式安裝套件
警告:opennms-webapp-standalone-1.6.2-1.noarch.rpm: 表頭 V3 DSA signature: NOKEY, key ID 4c4cbbd9
錯誤:相依性偵測失敗:
opennms-core = 1.6.2-1 被 opennms-webapp-standalone-1.6.2-1.noarch 所需要
yum在Fedora的軟體倉儲裡找不到opennms套件,因此到RPM pbone搜尋opennms,在列出的套件清單裡,最末欄顯示的是分支套件(平台),找到你所使用的分支套件-也可以在檔名裡看出端倪,例如opennms-webapp-1.2.3-1_rhl9.i386.rpm為RedHat 9/i386平台所使用的套件,opennms-webapp-standalone-1.6.2-1.noarch.rpm則不限使用平台。找到對應套件下載點後,透過wget加上載點的url(FTP或HTTP皆可)便能將檔案抓回來。就這裡opennms的例子來看,安裝失敗,因為要安裝opennms-webapp-standalone必須一併安裝opennms-core,此即為相依性,這時必須以相同方式找到opennms-core載點並一併安裝,但難保不會再遇上其它相依性問題:為了安裝opennms-core而必須安裝其它套件。
安裝MySQL與圖形管理界面
這裡要安裝的是MySQL伺服器,因此選擇mysql-server套件(套件mysql為伺服器用戶端應用),在此另外選擇在管理者的電腦上安裝MySQL圖形管理界面:
# yum install mysql-server mysql-gui-tools
Loaded plugins: refresh-packagekit
Setting up Install Process
Resolving Dependencies
...
Dependencies Resolved
=============================================================
Package Arch Version Repository Size
=============================================================
Installing:
mysql-gui-tools x86_64 5.0r12-11.fc11 fedora 12 k
mysql-server x86_64 5.1.47-1.fc11 updates 11 M
Installing for dependencies:
mysql-administrator x86_64 5.0r12-11.fc11 fedora 1.7 M
mysql-gui-common x86_64 5.0r12-11.fc11 fedora 221 k
mysql-query-browser x86_64 5.0r12-11.fc11 fedora 1.5 M
Transaction Summary
=============================================================
Install 5 Package(s)
Upgrade 0 Package(s)
Total download size: 14 M
Is this ok [y/N]:
<略>
在這裡,yum同時安裝mysql-server與mysql-gui-tools兩個套件,是除了指定安裝的這兩個套件之外,因為相依性問題,必須另外安裝mysql-administrator、mysql-gui-common與mysql-query-browser。yum會自動找到並列出套件清單詢問系統管理者是否一併安裝。
相對來說,若此時管理者用的是rpm程式進行套件安裝,出現相依性問題警告,程式只會顯示它所缺乏的檔案,管理者必須自已找出另外這三個套件的載點下載再重新執行rpm一併安裝的動作,耗費的心力會是使用yum的好幾倍:我們不會知道為了安裝套件A,而必須安裝B時,同時安裝它們會不會又出現為了安裝B而必須安裝C。MySQL圖形管理界面管理程式安裝完成後,在Fedora下可透過『應用程式/系統工具/MySQL Administrator』啟動:
▲ 登入後的MySQL的圖形管理界面
其它資料庫
近年來雲端的掘起,SaaS供應商在提供服務後端的基礎架構上大量使用MySQL,但Oracle間接買下MySQL的動作,令這些雲端供應商對MySQL未來使用上的權益,與Oracle的競爭性開始擔憂。雖然在Linux世界裡,除了MySQL,還有PostgreSQL等其它選擇,不過以雲端應用來講,還有更不錯的新選項-CouchDB。CouchDB是Apache針對雲端服務所推出的資料庫專案,屬於文件導向的資料庫,主要格式為JSON,不過支援二進制附加檔,所以影像的存儲也不會有問題。
這套分散式的資料庫系統,讓所有裝置(包括伺服器、桌面環境、平板電腦或智慧型手機等等)都能在同一資料庫裡擁有獨立的複本,出現變動的時侯,兩邊都會作複製的動作。文件導向的資料庫因為可以輕鬆用Javascript去作query,所以對辦公室套件與SaaS應用來說,會有相當的吸引力。只是這樣的架構,仍讓網路應用開發人員在安全性方面存有許多疑慮。
網頁程式PHP
PHP是近年來網站應用的主流程式選項,也是最多網站開發人員使用的語言。LAMP的起源雖將P定義為PHP,但隨著企業需求日新月異,在開放源碼世界裡的自由概念,P可以不單單代表PHP,它也可以是Python或Perl。PHP、Python與Perl的選擇並沒有孰優孰劣,只有目的為何的問題。一個優秀的程式設計師,會視情況運用這些程式,同樣的功能使用不同的工具所耗費的時間也大不相同。
Android手機應用TagMe開發人員Jason認為:『當我要快速開發一個網站時我用PHP,因為它簡單好學,當我想爬一個網站(hack)抓出資料時我用Perl,因為它有現成模組,當我想開發需要用到Socket的程式時,我用python,程式不分好壞,端視需求決定你要用什麼。』這裡指的並非開發網站只能用PHP、Socket應用程式只有python適用,而是對開發人員本身而言,主觀認為哪一套工具解決此需求最快最方便。
▲ 程式與工作需求(取自OdinJobs網站)
上圖是來自OdinJobs網站,統計2007年對PHP、Perl與Python的人力需求,平均下來每個月有11000份工作,要求必須會Perl,是PHP 3300份工作的三倍,當然此值僅供參考。
LAMP後的系統防護
系統上線前,系統管理者都應該盡其所能對系統設定保護,小至登入人員的控管、檔案程式執行權限的設定,大到防火牆組態等等,主機應在其它安全設備的防護之外,也能自我保護。以下所提及的防護設定仍不能算完備,沒有系統能作到100%安全,但好的系統管理者應定期瀏覽系統log檔、瞭解現今的安全性威脅保持警覺,也要能夠針對當下系統可能遭受的破壞,提出事前事後的應變方式。
主機服務存取權限
Linux將系統的眾多設定檔放在etc目錄下,其中有兩個重要檔案,關係到哪些主機可以或不可以,連結到本機的哪些服務-hosts.deny與hosts.allow。當你對Linux的指令的使用方式不瞭解時,可透過man <指令>瞭解使用方式,對部份設定檔來說,man也適用,透過man hosts.deny可以找到這兩個設定檔的組態方式。首先,第一步建議先將hosts.deny內容設定為ALL: ALL,第一個ALL指的是所有服務,第二個ALL指的是所有主機。這裡的想法是先關掉所有的門(通訊埠),再開啟你想開啟的那些門,第二步就是設定hosts.allow:
# vi /etc/hosts.allow
ALL: 192.168.1.0/255.255.255.0
sshd: 192.168.0.10
此處的hosts.allow組態內容有兩行,第一行設定192.168.1.x的網路區段主機,皆可連結到這台主機,第二行設定只有192.168.0.10這台主機,能連結存取本機的ssh服務。網路區段的部份除上述IP address外亦可使用domain name設定,192.168.1.0/255.255.255.0也能用192.168.1.0/24取代之。
Linux本機防火牆
Linux下的防火牆套件為iptables,對有經驗的Linux管理者或資訊安全專家來說,可直接變更iptables設定檔再重新啟動iptables:
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# /etc/init.d/iptables restart
範例內容的iptables規則:接受目的地為通訊埠80的封包。即便是最簡易型的iptables,都必須由數行規則組成,規範不在規則裡封包的處理方式,範例僅取出一條規則,初學者可先試著解讀這些已存在的規則,對防火牆的處理方式有基礎認知。
▲ Fedora的防火牆管理
Fedora也提供了防火牆的圖形管理界面『系統/管理/防火牆』,使用者可在此設定,再比對iptables的組態檔,瞭解各種設定所必須下的組態為何。iptables可以是執行中的命令,使用者可以在命令列下一道iptables的指令,讓防護立即生效,再將設定加入至組態檔裡,讓下次防火牆重啟時套用此規則。
主機服務執行權
一開始,將selinux設定為disable會是比較建議的作法,雖然這麼作不見得安全。Selinux設定讓你對系統服務的運作與權限有深入瞭解,但即便是Linux老手都不見得能瞭解各個服務與selinux的對應關係,更別說對selinux有全盤性的瞭解。舉例來說,selinux裡決定了httpd能執行的檔案、週邊,當為httpd加上一個較罕見的功能,必須用到正規情況下不會用到的設備時,很可能因selinux的設定,而令httpd這個新增的功能不能運作,這種問題大部份都能在log裡找出原因,但不見得找得到解答。
如果你的服務與伺服器設定沒問題,系統所有組態也都查過一遍,網路運作亦確認正常,卻還是不知道服務為什麼就是起不了作用時,查查selinux的設定吧:
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive <= 當下selinux的模式
Mode from config file: permissive
Policy version: 21
Policy from config file: targeted
Seinux的模式除了enabled與disabled之外還有個permissive的選項,它能對系統進行保護,但不像enabled那樣滴水不漏、也並非disabled那樣放任不管。系統運作中變更selinux狀態的指令為selinuxenabled,執行selinuxenabled 0為啟用,反之設為1則為停用,此設定只在執行的當下生效,重新開機後仍會套用組態檔/etc/selinux/config裡的設定,因此若你想令設定永久有效需變更此檔。
關掉不必要的服務
安裝過程中選擇了哪些服務,關係到開機時間的長短:啟動的服務越多時間越長、曝露的漏洞也越多。資安專家的建議是,不該開的服務就不要開、不應揭露的資訊就應該隱藏,此乃系統安全的基本原則之一。指令chkconfig可以列出在各個執行層級(runlevel)下哪些服務會自動開啟、哪些不會。
# chkconfig --list <= 列出所有服務
NetworkManager 0:關閉 1:關閉 2:關閉 3:關閉 4:關閉 5:關閉 6:關閉
acpid 0:關閉 1:關閉 2:開啟 3:開啟 4:開啟 5:開啟 6:關閉
…
# export LANG=C
# chkconfig --list | grep 3:on
acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
<略>
# chkconfig mysqld --level 3 off
由於並非所有終端機界面都能接受中文輸入,為了透過grep找出在執行層級3或5下,開啟的服務有哪些,這裡使用export指令暫時將執行環境語言設定為C(中文界面預設為zh_TW.UTF-8),這麼一來就能透過grep找出執行層級3之下開啟的服務(3:on)。
在本機上,你可以透過『yum info <套件名稱>』或『rpm -i <套件名稱>』的方式,查詢套件相關資訊,或連上網路以關鍵字查詢套件用途。例如:yum info acpid找出套件敘述為『Description: acpid 系統程式能將 ACPI 事件,分配到使用者空間的程式』。以此作法逐項清查,會發現其實有很多不必要的服務或伺服器,在開機時會自動啟動,像是在資料庫伺服器上啟動藍芽(bluetooth),或在網頁伺服器上啟動UNIX列印系統(cups),幾乎都是沒有必要的。在chkconfig指令搭配off選項,可關閉該服務的開機自動啟動功能,範例最後一行即為關閉執行層級3下的MySQL daemon,如希望在所有開機模式下都不要自動啟動mysqld服務,只要省略執行層級的指定『--level 3』即可。
Linux下共有七個開機執行層級(runlevel),以擔任伺服器功能的系統而言,啟動在文字模式下節省系統使用資源會是較好的作法,文字模式為執行層級3,而以桌面環境應用,或需要圖形界面的使用者而言,系統開機時自動進入圖形界面為執行層級5。Fedora系統啟動時會在哪一個執行層級,是由/etc/inittab設定檔裡的『id:5:initdefault:』決定,各執行層級的功能亦可參考該檔,簡單說明如下。
0 - halt。關機,不要把預設init執行層級設為這個。
1 - Single user mode。單一使用者模式,在忘記密碼等問題修復時會用到這個模式。
2 - 使用者但無NFS功能的模式,在不使用網路的情況下它和runleve 3是一樣的。
3 - 多使用者模式。
4 - 保留未使用(定義)的模式。
5 - X11。開機時啟動圖形界面。
6 - reboot。重開機,不要把預設init執行層級設為這個。
套件自動更新
Fedora作業系統可設定自動更新套件,基於安全性的考量,建議使用者讓系統裡的套件盡可能維持最新版本,但還必須加入穩定性為考量,已上線的服務是否會因為套件版本更新,而出現不在預期之內的問題?部份套件版本的重大變更可能造成伺服器運作失常,例如MySQL從4更新到5或PHP等,管理者若將系統設定成自動更新時,可將這類套件設定為例外原則,手動執行更新前,建議在測試環境下先作一遍-例如使用虛擬機器,確認新版本不致影響既有服務,再套用至已上線的服務。
yum.conf組態檔裡為yum的全域性設定,個別設定檔(.repo)裡未指定的參數即以此檔為準。/etc/yum.repos.d/下除了預設的fedora.repo等,指定系統更新時應向哪些軟體倉儲找套件,亦有一些應用本身提供repo檔,讓管理者可以透過yum自動更新並處理相依性問題,例如google-chrome與雲端管理軟體convirt。
結論
Linux已不再是需要耗費很多心力設定與安裝的作業系統,在市場上常見的幾個分支套件,例如Fedora、Ubuntu或OpenSUSE等等,已經將安裝介面設計得相當友善,由於對硬體週邊的支援亦趨完整,安裝過程大多穩定流暢,最重要的是主流的幾個分支套件,大多已提供完整的中文支援-無論是安裝過程、線上文件或安裝完成後的使用界面。經過長時間的努力,Linux已變得相當平易近人,一般資訊人員或新手只要找對分支套件,將網頁伺服器架起來並非難事。當然,在系統安裝完成之後,伺服器的建置、設定檔的瞭解、系統安全的防護,套件版本的控制,才是系統管理者的挑戰。
當你對Linux系統瞭解得越深入,越會發現它能為你作的更多,完成LAMP的建置,是Linux學習之路的開始。
參考網站:
Fedora:http://fedoraproject.org/
Apache:http://www.apache.org/
MySQL:http://dev.mysql.com/
PHP:http://php.net/
CouchDB:http://couchdb.apache.org/
LAMP HowTo:http://www.lamphowto.com/
RPM PBone Search:http://rpm.pbone.net/