動手學 VPS 架站:使用 CentOS 7 + Nginx + PHP-FPM + MariaDB (1) - 準備

LNMP

還在使用虛擬主機嗎?改用虛擬專用伺服器 (VPS),擁有更多控制權吧~

前言

早期我需要一台伺服器來運行一些我自己的程式,一般的虛擬主機只提供網站的功能,不能依自己的需求做設定,而且費用還不低,那時候還不流行 VPS 所以也沒得租,於是我把一台舊電腦拿來安裝 Linux,為了顧及省電及安靜,不使用傳統硬碟,那時候也還沒有便宜的 SSD,我測試把 Linux 安裝在一個 8GB SD卡上,雖然一度熱當,但還是安裝成功而且可以運行。

之後有聽說 Linode 有提供 VPS (Virtual Private Server) 的服務,不過當時價格不低。2011 年中 DigitalOcean 開始服務了,而且只要一個月 $5 美元就有 SSD 硬碟的方案可用,雖然硬體配置有點低,但對我來說已經夠用,試用了一陣子,就一直用到現在了。

我大概是 2013 年左右開始使用 DigitalOcean,那時候還沒有亞洲機房,所以就隨便選了一個紐約機房來試用,除了 Ping 值稍慢外,沒什麼大問題。大約 2014 年初,DigitalOcean 建立了新加坡機房,但是因為擔心新機房會不會有問題,就想說再等等。

去年(2017年)終於打算將主機換到新加坡的機房,做了一番研究後發現,可以快速的將原本的主機以映像檔的方式搬移到新加坡機房後重建。不過考慮到我原本使用的是 CentOS 6 32 位元版本,它的維護期間也快到期了 (2020年),不如直接使用 CentOS 7 64位元版本 (2024年) 吧。另外,這次也打算改用 Nginx 網頁伺服器,換掉使用了很久的 Apache,所以也花了一點時研究如何設定及使用 Nginx。

我一直有做筆記的習慣,之前建立伺服器的時候找了許多資料,不過那時候的筆記有點零碎。這次在重建整個伺服器時,想到每次做的這些設定其實都有一定的流程,那不如就把整個流程做個有系統的整理,寫成一個操作手冊,方便自己日後使用,也可以分享給需要的人。

這裡有個重要的事情必須說明,所謂事業有專攻,一般來說會有專門的網管人員來建立及管理伺服器,程式設計師專責寫程式,網站及資料庫伺服器的部份也許還有個專人來負責,所以這份操作手冊並不打算包括這些全部的專業,而是專注在最小必要的部份,讓你可以靠自己就能打造一個安全可靠的伺服器,未來有需要更專業、更進階的功能再自行去研究,或請專業的人來管理。

最後我要稍為聊一下 AWS。AWS (Amazon Web Services) 是那個做書店網站起家的亞馬遜提供的雲端運算服務,它把服務分的非常細,造成初次使用的人在使用之前必須花點時間瞭解,而且它是以使用時間或使用量去計費,聽起來好像不錯,可是對於一個剛起步的個人或新創公司來說太複雜,而且費用的不確定性太高。Linode 和 DigitalOcean 不同的地方在於,它是以一個固定的價格來提供不同的使用方案,讓開發者可以自行選擇需要的方案,要付多少費用非常清楚,不用擔心費用會超過預算。

亞馬遜在 2016 年的時候也開始推出固定費用式的 Amazon Lightsail 的服務,打算來搶 Linode 及 DigitalOcean 的客人,你就知道還是有許多開發者是選擇這類方案的。DigitalOcean 的創辦人就曾提過,為了避免和亞馬遜硬碰硬,所以才採取針對獨立開發者或新創公司提供這樣的服務,但現在看來亞馬遜要開始跨過界線了,或許是因為這個原因,Linode 及 DigitalOcean 的最低 $5 方案已經把記憶體升級到 1GB 了,而 Amazon Lightsail 還是 512 MB 喔。

1. 開始之前

技術架構的選擇通常會有多方面的考量,這裡會簡單說明我選用的技術架構的原因。

1.1 為什麼選擇 CentOS

在說明為什麼選擇 CentOS 之前,我們先來聊聊微軟的 Windows。如果你是用 ASP.NET 來開發網站的話,通常會選擇 IIS 網頁伺服器來執行,並且放在 Windows Server 上,所以如果你是使用微軟的技術架構,這份文件可能就對你無用,雖然現在微軟有提供 SDK 可以讓你在 Linux 上運行,這部分就請自行研究了。

選擇 Windows 或 Linux 並無好壞之分,純看個人需要。

Linux 有非常多的發佈版本,不過較為流行的有兩個,一個是 Debian,另一個就是 Red Hat。桌面版本很受歡迎的 Ubuntu 就是 Debian 系,如果要用 Red Hat 系的可以選擇 Fedora。

伺服器一般不安裝圖形介面,通常以終端機連線並以指令操作。你可以使用 Debian 或 Ubuntu 出的伺服器版本,或是我選擇的 CentOS;Fedora 的伺服器版本偏向實驗性質會有很多新功能,但穩定性可能不佳。

Red Hat 是一間公司的名稱,它發行的 Linux 全名是 Red Hat Enterprise Linux (RHEL),這個是給企業用的付費版本,有提供咨詢服務,它以相同的程式碼另外發佈了一個免費的版本 CentOS。

我們不比較 Debian 及 CentOS 的優缺點,它們除了同樣使用 Linux 核心外,其他的設計理念及發佈週期等均不同,選擇哪一個因人而異。選擇 CentOS 有幾個好處,因為它使用和 RHEL 同樣的程式碼,要遇到更新緩慢或漏洞沒有修補的機率就小一些,另外就是 CentOS 使用的人較多,要找資料時就相對方便,這點很重要。

Debian 的套件管理工具是 APT,CentOS 則是 YUM;CentOS 和 RHEL 可以使用 Fedora EPEL 來擴充軟體套件。

1.2 為什麼選擇 Nginx

早期大家都是用 Apache 當網頁伺服器,用得好好的沒什麼問題,直到發現當連線數增加到一個程度後,運行的效率會開始變差,稱為 C10K 問題,即一個網站伺服器最多只能同時處理 10000 個請求的連線數,之後無論硬體如何加強,伺服器也無法負荷。

後來 (2002年) 一位俄羅斯人 Igor Sysoev 開發了一個名為 Nginx (唸 engine-x) 的網頁伺服器,號稱可以解決 C10K 的問題。慢慢的有越來越多人使用 Nginx (見下圖,或請看網頁伺服器調查 February 2018 Web Server Survey),Apache 的使用率從 2012 年左右開始下降,Nginx 則緩慢的往上升,從前的 LAMP 技術架構逐漸變成 LNMP (Linux + Nginx + MySQL + PHP)。
圖片來源:https://news.netcraft.com/archives/2018/02/13/february-2018-web-server-survey.html

在決定選用 Nginx 之前,我花了一點時間研究 Nginx 如何設定及使用,還有效能方面的實驗。在配置檔的文件方面,相較於 Apache 的角括號區塊指令 <指令>...</指令>,我反而比較喜歡 Nginx 的大括號表示方式 指令 { ... }

在效能實驗方面,Nginx 不只回應速度比較快,每秒請求連線數 (Request per second) 高,也真的如傳說中耗用的資源比較少,像是 CPU 及記憶體的使用量,這點很重要,因為我打算租用最低價方案的 VPS,而最低價方案只提供 512 MB 的記憶體 (現在已升級為 1GB) 。

如果想瞭解實際的測試數據,可以參考 Web server performance comparison 的比較,它測試 5k 的 PNG 檔在 25000 個請求數下耗用的記憶體;另外,效能測試可以參考 Linux Web Server Performance Benchmark – 2016 Results,Apache 的成績真的都不太好。

1.3 PHP-FPM 是什麼

CGI (Common Gateway Interface) 稱為通用閘道介面,是伺服器請求處理程式之間的一種資料傳輸標準,請求處理程式可以用任何一種程式語言撰寫,早期比較常用 Perl。CGI 有個很大的缺點,就是每當請求發生時,就會產生一個程序來處理,當請求增加時,對硬體資源的消耗就會很大;於是有了 FastCGI (Fast Common Gateway Interface) 來解決這個問題。

FastCGI 伺服器會建立一個持續性的程序來處理一連串的請求,這個程序由 FastCGI 伺服器來管理,而不是網頁伺服器。當一個請求進來時,網頁伺服器把這個請求的所有資料透過兩種方式傳遞給 FastCGI 伺服器來處理,一種是 Socket,另一種是 TCP connection;Socket 適合網頁伺服器和 FastCGI 伺服器同在一台機器上,而 TCP 連線則可以連到遠端的 FastCGI 伺服器。

Apache 可以使用模組的方式,直接處理 PHP 程式,也可以使用 mod_fcgid 模組,透過 FastCGI 的方式來處理。

FastCGI 和 CGI 一樣是個資料傳輸標準,所以任何人都可以以此標準來開發處理程式,PHP-FPM 就是其中一種。FPM 全名為 FastCGI Process Manager,所以 PHP-FPM 就是 PHP FastCGI 標準的一種實作,它的任務就是管理 PHP 的處理程序。Nginx 可以透過 FastCGI 將有關 PHP 的請求傳遞給 PHP-FPM 來處理。

PHP-FPM 會像是網頁伺服器一樣,以 daemon 的方式在背景執行。

1.4 資料庫的部份

資料庫的種類非常多,概分為關聯式資料庫及非關聯式資料庫 (NoSQL) 兩種。
較知名的關聯式資料庫: 非關聯式資料庫較知名的有: 和前面所說的一樣,技術是選你所需要的,在大部份情況下你是不需要用到非關聯式資料庫的,甚至基於 DBMS (Database Management System) 的關聯式資料庫也不需要;如果你的系統讀取多於寫入,而且不需要太多的 transaction (即全執行或全不執行),一個 SQLite 檔案式資料庫即可滿足需求。

瞭解你所選擇的資料庫的特性及強項是否能滿足你的需求,並且在研究如何操控它之後才使用它。

1.5 要選哪家 VPS

這裡只談月租固定價格的 VPS 商,並且因為我只有用過 DigitalOcean,所以沒辦法直接告訴你該怎麼選擇,你可以依需求自行選擇。因為是月租固定價格,所以不用擔心費用超支,如果有需要增加硬體規格,例如 CPU 的數量、記憶體及硬碟的容量等,可以之後依需求調整或選擇其他方案,容不容易擴增就是一個可以考慮的點。

另外,DigitalOcean 有提供一鍵安裝 One-click applications 的功能,只需要不到 55 秒的時間就能裝好像是 LNMP 的架構系統,在使用上非常快速方便。如果你需要台灣的連線有較快的反應時間 (Ping 值),有沒有亞洲機房就是很重要的考慮因素,東京機房又勝過新加坡機房,這都要考慮。
以下為 2018 年 6 月,各家 VPS 商的方案:

 LinodeDigitalOceanVlturAmazon Lightsail
成立時間2003年2011年2014年2016年
費用方案$5$5$5 (註1)$5
CPU (註2)1111
RAM1 GB1 GB1 GB512 MB
Storage25 GB SSD25 GB SSD25 GB SSD20 GB SSD
Transfer (註3)1 TB1 TB1 TB1 TB
是否有東京機房有 x2有 x1有 x1
是否有新加坡機房有 x1有 x1有 x1有 x1
  • 註 1 :Vltur 最低價方案為 $2.5
  • 註 2 :雖然同為 1 個虛擬 CPU ,但是各家所用的實體 CPU 規格可能不同,提供的效能就會有所差異。
  • 註 3 :傳輸量分為流入及流出,大部分只計算流出的流量;有些會限制流入的流量或沒有註明。
  • 註 4 :台灣連外的頻寬第一是美國、第二是日本,新加坡只有第五,但是美國太遠,所以一般來說,大家都希望選日本的機房;但是如果你的使用者都在美國,那當然選美國機房。聽說 Linode 的東京機房必須用搶的;我自己用 DigitalOcean 的新加坡機房速度不錯,雖然 Ping 值大約 100 ms 左右,但還可以接受。

繼續閱讀:動手學 VPS 架站:使用 CentOS 7 + Nginx + PHP-FPM + MariaDB (2) - Linux 入門

本文網址:http://blog.tonycube.com/2018/07/vps-centos-7-nginx-php-fpm-mariadb-1.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。