網站效能改善方案, 啟用 Apache Event MPM

Google GCP 最近一直提示我的主機有「效能問題」,建議我升級成 g1-small 的方案,意思就是要從免費轉成一個月13USD的方案。第一時間還有點緊張,想說這樣會不會讓瀏覽數下降,沒思索太多就升級了,所以也才生出了之前的 Teraterm 設定 GCP金鑰快速 SSH 登入 這篇文章。但再仔細觀察了一下後,網頁載入的確是不快,但從監控的網頁來看 CPU 使用率都很低啊…於是又把方案改回了免費的 f1-micro,並趁這次機會研究了怎麼提升效能。

花了2天的時間,總算研究出了一些東西。

  • 一個是為了”長遠”的未來研究的 “load balance” 負載平衡,哪天真的訪客多到滿出來(有那天?),可以再開第2台, 第3台, 第4台…preemptible的虛擬機,把一些流量動態轉移過去。
  • 第二個是研究怎麼加速 Apache,把 MPM (Multi-Processing Module) 從 Prefork 改成 Event based 的。

這篇文章是要先介紹 Apache 的 Event MPM模組,這個較易套用,也能看出一些改善。另外,本文是以 Ubuntu 16.04 32bits 來做為解說,要套用命令時可能要注意一下。

 

Event Based 處理方式

Apache 可說是 opensource web server 的先驅,從 1995 釋出的第一版到目前 2019 的 2.4.41,這樣也有將近25年了。但在 2004 時就已經出現了一個強勁的對手,Nginx。Nginx 的最大優點的就是大幅超越 Apache 的效能,相比於 Apache 用了少很多的記憶體,但卻有4倍的效能。

其中一個主要的原因,就是 Apache 對於每個連線都 fork 出一個行程來處理,而 Nginx 在一開始只建立幾個行程,連線的處理則是以線程來進行。行程的產生相較於線程,是更消耗資源的,而在切換上也更花時間,也因此 Nginx 有著更好的效能。

為了改善這個弱項, Apache 也推出了稱為 Event Based 的 MPM,也的確對效能有些改善。

Apache 啟用 Event MPM

一般預裝的Apache會使用 Prefork MPM,因為這是相對穩定的模組了,為了最佳相容性,預設會啟用Prefork。當然也不是說 Event MPM不穩不相容,這都是相對於Prefork的。要怎麼知道自己用的 Apache 是否啟用 Event MPM 了呢?可以用下面指令來觀察使用的 MPM。

在輸出的狀態中,可以看到紅框這行表明了是使用  Prefork ,如果是用 Event MPM 就會顯示 Event。

Apache MPM 種類

設定 Event MPM

本文是參考 server fault 的這篇文章,截取出來的最終修改,有需要可參考原文。請下達下面的命令,來進行設定/安裝Event MPM所需的變動。

首先要修改設定檔,將站台的 .php 處理功能指向 php-fpm,如果是使用 http 的請編輯/etc/apache2/sites-available/000-default.conf,https 請編輯 /etc/apache2/sites-available/default-ssl.conf,然後加入以下設定:

指定PHP處理方式

接著以指令安裝設定下列項目

 

上面有提 php-fpm (FPM=FastCGI process manager),也是為了加快 Apace 在執行 PHP 時的速度。FastCGI 執行時不需重新建立一個行程,而是以固定的一個行程來處理 web server的請求,web server 會以UNIX socket的方式將資料傳遞給此行程來處理。可以看到早期都是以產生行程 (process) 來處理問題,我猜是早期還沒有 thread 的概念吧,或是先求有再求好,近期網路大發達才曝露出原本設計的弱點。

當完成上面設定後,再重新下 apachectl -V,應該就可以看到 Server MPM 變成 event 了。並且,在 ps -aux 內,也可以看到多了 php-fpm 的行程,這樣就算設定完成了。

php-fpm 行程

成功轉換成 event MPM

 

效能改善

套用 Event MPM 後,個人是感覺有快一些些。參考網路上的比較Event MPM 大概可以比 Prefork 快上 50%!聽起來好像還不錯的,的確以免錢方案來講算很好了,但Nginx的效能還是Event MPM的兩倍!不過把web server轉換到 Nginx 可能又是另一番功夫了,也許不會很難,但花的時間肯定是不會少的。

結語

剛開始架站時,對效能一般都不太要求,等到流量大起來後,又不敢隨便 shutdown 更新。所以如果是新架站的朋友,也許可以一開始就選用 Nginx ,畢竟現在 Nginx 市佔看起來跟 Apache 已經是1:1了,所以文件、穩定性都不差才對。如果你已經上了 Apache 的車,或技術能力不太夠,就先用這種方式擋著吧,或者是乾脆就升級成更高級的 CPU 方案,花錢了事也算是種 solution!

Leave a Reply