LAMP Web Server 網頁伺服器快速建置入門

前言 …

LAMP 是透過 Linux + Apache + MySQL + PHP 這種方式來架設網站伺服器組合的簡稱,分別代表著

  1. Linux 作業系統
  2. Apache http 網頁伺服器
  3. MySQL 資料庫
  4. PHP 網頁後端語言

LAMP 是非常廣泛被使用的網站環境建置組合,也有將其中的元件替換為其它相同功能但不同產品的組合,例如把 Linux 改為 FreeBSD 或 Windows 的 FAMP、WAMP,把 Apache 改為 NGINX 的 LNMP 等,本篇是使用 Ubuntu / Debian 作為示範,但基本上基於 Debian 以及 Ubuntu 的 GNU/Linux distributions 操作方式都大同小異,要注意不同版本的使用上多少會略有差異,本篇僅供參考。

根據撰寫本篇紀錄時 W3Techs 的統計,Linux 在 web server 的作業系統市佔率高達 36.2% ( Unix 佔總共的 68%、Linux 佔其中的 53.2% ),其中 Debian / Ubuntu 就分別佔了 Linux 的 32.6% / 31.1%:

w3techs-usage-of-operatingSystems-unix-Mar-1-2016

Apache 在 Web Server 的領域有著 55% 過半的驚人市佔率:

w3techs-usage-of-WebServers-Mar-1-2016

最新、更多資料請參考 W3Techs :

寫這篇的原因,主要是因為推薦不少人來使用 WordPress 撰寫部落格、筆記,WordPress 在此時已經擁有高達 26% 的網頁套裝軟體市佔率,而且持續成長中,平均每四個網站就有一個是使用 WordPress 架設,可想而知 WordPress 不管是在社群、生態系方便都已經相當成熟,考量到自行架設 WordPress 會比直接使用 WordPress.com 現成的服務來的更有彈性、功能更加強大,同時又可以學技術,但對於初學者對於遇到問題的恐懼一直是最大的阻礙,故撰寫這份 LAMP 簡易安裝筆記供入門者參考,對於其他同樣使用 PHP 語言的網站平台基本上都適用。

根據 2016 年 3 月 W3Techs 的統計,WordPress 在網頁市場的佔有率已經高達 26%,在使用了 Content Management System (CMS) 管理網站裡面的市佔率更高達六成 (59.2%):

w3techs-usage-of-CMS-Mar-1-2016.png

W3Techs :

目前 PHP 最新的版本為 7.x,因推出時間還不夠久,並未被所有 Debian / Ubuntu 的官方套件庫收錄到穩定的發行版所使用的套件庫 (Ubuntu Xenial Xerus 16.04 LTS 開始的版本會有),而市占率最高的 PHP 版本截至目前為止都還是 5.6 ,除了新版的作業系統會將新版的 PHP 一併整合進去套件庫外,Ubuntu 也可以透過 PPA (Personal Package Archives) 安裝這個途徑來取得新版的 PHP,PHP 的版本不是本篇重點(因為 WordPress 對 PHP 5.x/7.x 都已經有良好的支援了),安裝時依照需求選擇系統發行版提供的版本或是透過 PPA 安裝最新的版本即可。如果有興趣在 Ubuntu 16.04 以前的版本使用 PHP 7 或是想使用較新發布的 PHP 版本可以自行加入 ondrej/php 這個 PPA (指令: sudo add-apt-repository ppa:ondrej/php ) 。

接下來正文開始

本篇假設你已經會基本的 Unix 操作,使用的環境為 Ubuntu 14.04 server 版,如果還沒安裝的話可以參考這篇:

在已經有了 Ubuntu / Debian (Linux) 的情境下,最快速、簡單把 LAMP 裝起來的方式可以濃縮為以下一行 (如果想忽略長篇大論,本篇實做也就只有下面這行):

$ sudo apt-get install apache2 libapache2-mod-php5 php5 php5-mysql php5-json mysql-server

如果你是使用 Ubuntu 16.04 或是透過 PPA 引入了 PHP 7 請注意不要使用 php5,把數字 5 拿掉或改成 7.x (x 要換成對應能取得的版本,例如 7.0 或 7.1) 應該就會動了 ,像這樣 (下面所有 php5 的命令亦同,請自行調整):

$ sudo apt-get install apache2 libapache2-mod-php php php-mysql php-json mysql-server
debian-apt-get-install-lamp
debian-apt-get-install-lamp-done

過程中會要求設定資料庫的密碼,輸入兩次確認後大致就只需要等設定跑完就OK了,其實不難,如果你對於長度較長的指令感到恐懼,在 Ubuntu based Linux 底下可以試試看使用 tasksel 來安裝 lamp-server,至於 Debian 底下預設是沒有 lamp-server 這個選項的,雖然有 web-server 可以選,但卻不包含 MySQL 資料庫的安裝,建議直接用 apt-get 來完成安裝就好了,不必特地使用 tasksel 。

其實之前有提過 tasksel ,裏面紀錄了各種變形版本 (Lubuntu, Kubuntu 等) 以及常用到的套件組合,讓使用者可以快速的安裝、切換需要的功能,有興趣的話可以翻這篇:

在 Ubuntu 裏面其中有一項就是 lamp-server, 透過下面的命令就可以快速安裝(但剛剛已經有透過 apt 指令安裝過對應的套件就不須要重複操作這段囉),過程中也是會設定資料庫密碼:

$ sudo tasksel install lamp-server

執行後就會進行安裝,圖為開始準備套件的畫面:

tasksel_installing
tasksel_setup_mysql_password

詢問資料庫密碼:

tasksel_setup_mysql_password_2

確認資料庫密碼:

tasksel_installing_2

安裝套件:

tasksel_installing_3

因為基本要用到的套件並不多,所以最簡易的架設到這邊就完成了,接下來會進行依些基本的驗證工作,確認有成功安裝並啟動相關服務。

安裝完了,接下來開始驗收/驗證

1. 確認 Apache 正常運作

透過 curl 這個命令向本機 (127.0.0.1) 送 http request 並使用 -I 參數只取得回應的標頭 (header) :

$ curl -I 127.0.0.1

Ubuntu 14.04.4 LTS:

$ curl -I 127.0.0.1
HTTP/1.1 200 OK
Date: Thu, 25 Feb 2016 17:11:41 GMT
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Thu, 25 Feb 2016 15:33:31 GMT
ETag: "2cf6-52c99e79eb044"
Accept-Ranges: bytes
Content-Length: 11510
Vary: Accept-Encoding
Content-Type: text/html

Debian 8.3:

$ curl -I 127.0.0.1
HTTP/1.1 200 OK
Date: Fri, 26 Feb 2016 11:57:22 GMT
Server: Apache/2.4.10 (Debian)
Last-Modified: Fri, 26 Feb 2016 11:43:55 GMT
ETag: "2b60-52caad05f4514"
Accept-Ranges: bytes
Content-Length: 11104
Vary: Accept-Encoding
Content-Type: text/html

有看到 HTTP/1.1 200 OK 的訊息就表示成功了! 關於 http 代碼代表的含義可以參考維基百科:List of HTTP status codes

同時我們也可以透過瀏覽器開啟對應的網頁畫面,如果是在本機上架設可以開啟 http://localhost/http://127.0.0.1/http://0.0.0.0/ ,如果不是在本機架設的伺服器,則請輸入對應的 IP 位置或是網域名稱 (虛擬機會需要設定連接埠轉送/port redirect),成功的話應該會看到下面這樣的畫面(Apache2 Ubuntu / Debian Default Page),如果你使用的不是 Ubuntu / Debian ,畫面可能不盡相同,但大同小異,通常都會有 It works! 的字樣,到這邊就確認完 Apache 有正常運作了:

Apache2UbuntuDefaultPage
Apache2DebianDefaultPage
Apache2ItWorks

上面的 Apache2 Ubuntu / Debian Default Page 還帶有一些設定檔、檔案目錄結構等說明資訊,建議新手可以把他們看懂!確認完 Apache 能夠獨立正常運後,接下來要確認的是 Apache 的 php 模組是否能正常運作。

2. 確認 Apache 搭配 PHP 正常運作,作法是寫一個簡單的 PHP 涵式,將檔案存檔為副檔名 php 的檔案,送出要求到 Apache ,透過回應結果來確認程式是否有被正常執行。

剛剛上面的 Apache2 Ubuntu / Debian Default Page 有提到,預設的網頁伺服器檔案根目錄(document root) 為 /var/www/html ,以本篇的範例環境來說,這個檔案目錄預設的擁有者及群組會是 root ,所以編輯、存檔的時候別忘了使用 sudo 來提升權限,這邊要做的事情是把下面這段 php 程式碼放到 /var/www/html 底下:

<?php phpinfo();

直接執行下面這行指令就可以達到上述操作:

$ echo '<?php phpinfo();' | sudo tee /var/www/html/phptest.php
phpinfo-5.5.9-1ubuntu4.14

接著就像前面確認 Apache 是否正常運作一樣從瀏覽器打開對應的位置,但記得在網址最後面加上對應的檔名,例如 http://localhost/phptest.php,成功的話應該會看到這樣的畫面:

3. 確認資料庫正常運作

資料庫的確認比較簡單,執行下面這樣的指令後,輸入密碼,按下 enter 鍵,確認是否能成功登入:

$ mysql -u root -p

登入成功的畫面:

mysql-login-success

確認登入後可以按 Ctrl + d 或是 輸入 exit 再按下鍵盤上的 Enter 鍵離開 (用 quit 也行!)

4. 最後是確認 Web server 透過 PHP 可以正常存取資料庫,我們這邊透過知名的資料庫工具 phpMyAdmin 來測試,下載頁面網址:https://www.phpmyadmin.net/downloads/,這邊示範下載 phpMyAdmin-4.5.5-all-languages.tar.xz 這個檔案

phpmyadmin-download-page

下載後將檔案解壓縮到前面所提到的 /var/www/html/ 目錄:

$ sudo tar -xvf phpMyAdmin-4.5.5-all-languages.tar.xz -C /var/www/html/
download-and-extract-phpmyadmin
download-and-extract-phpmyadmin-done

接著一樣從瀏覽器存取對應的位置,例如 :http://localhost/phpMyAdmin-4.5.5-all-languages/

打開後沒想到出現了錯誤訊息:

phpmyadmin-json-missing

如果看到這樣的畫面,或甚至畫面一片白,表示有模組沒有啟用、或沒安裝到,以上圖為例,缺的是 json 模組,如果沒有出現錯誤訊息也可以到 /var/log/apache2/error.log 這個錯誤日誌裏面看看,是不是用到了什麼 undefined function (未定義的涵式) ,再 安裝 / 啟用 對應的功能就可以了。

事實上我們在前面不管是用 apt-get 還是 tasksel 兩種方法,都有安裝到 php5-json 套件,所以原因應該是套件沒有被啟用。Debian / Ubuntu 底下有一個好用的工具叫作 php5enmod (安裝完 php5-common 這個套件後才有的,前面因為套件相依性的關係會被安裝到,php7 請使用 phpenmod),我們可以透過這個命令來啟用 php 的 json 模組:

$ sudo php5enmod json

(關於 phpMyAdmin 所需要使用到的 php 功能可以參考這邊 http://docs.phpmyadmin.net/en/latest/require.html)

啟用模組後重新啟動 Apache:

$ sudo service apache2 restart

這邊不是重新啟動 PHP 而是重新啟動 Apache 的原因是因為我們上述安裝的方式都是選用將 PHP 包成 Apache 模組的架構,有點類似將兩者綁在一起的架構,其優點是容易安裝、使用,缺點則是效能較差、需要使用較多的資源。(以 Ubuntu 為例,如果好奇系統上目前有哪些已經安裝好可以使用的模組請參考這個目錄:/etc/php5/mods-available/)

重新啟動完 Apache 後可以重新整理網頁看看,應該就會成功看到登入畫面了:

phpmyadmin-login

帳號請輸入預設的 root ,密碼則輸入安裝資料庫時設定的密碼,登入後的畫面大概會長這樣:

phpmyadmin-main

到這邊基本上就完成了 LAMP 伺服器的最基本建置。

後記

LAMP 架設完了,其實並不難,之後會再利用空閒時間寫一篇關於架設好 LAMP 後安裝 WordPress 的筆記。

關於安全性的部分,本篇並沒有涵蓋到 header 資訊隱藏、以及 https / SSL(TLS) 加密的部份,也就是說使用者可以很輕易的從 HTTP header 取得系統建置的相關套件、版本,且在存取網頁時,包含帳號密碼在內的所有資訊都是未經加密的明文,很容易被相關工具撈出來 (如 Wireshark 或 tcpdump),簡單來說就是安全性還有加強的空間,對這兩件事情有興趣的話可以參考以下兩篇筆記:

另外如前面所說,本篇撰寫的時候其實 PHP 7 已經推出了,關於 PHP 7.x 和 PHP 5.x 的效能差異可參考這邊的效能測試:

最後要說的是 … 上面只有告訴大家怎樣確認功能有正常運作,但沒有告訴大家如果沒有正常運作該怎麼辦,恩,該怎麼說呢,除錯、偵錯的難度比較高,也很難一一列舉,建議遇到問題時儘量記下錯誤訊息、將錯誤訊息的畫面截圖,再透過錯誤訊息提供的資訊以及檢驗、確認自己的操作步驟是否正確、每一步驟執行完後是否成功?是否有其他錯誤訊息?最後是卡在哪一步等相關資訊,慢慢找出問題,真的看不出所以然時,也才可以用這些 “重要資訊” 向他人求救!

LAMP picture original from http://www.programmableweb.com/news/what-mean-stack-and-why-it-better-lamp/analysis/2015/12/22

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。