前面有大段函數計算的概念介紹,為了避免看概念介紹占用我這個一小時,是以大家可以看後面的教程内容,操作完了再來回顧這裡的内容。
前言
在像阿裡雲ECS這種 IaaS 類的産品大火前,有一種 PaaS 模式的雲産品是非常火的,也就是各種 APP Engine,比如說最早做的谷歌GAE、新浪SAE,以及後期湧現的阿裡雲ACE和百度雲BAE,但是現在來看我們都知道其結果,他們都已經不存在了,盡管在當時看來 App Engine 是對虛拟主機和實體伺服器的一場革新,但是過分超前的理念和不切實際的體驗葬送了各類 AE。
是以雲計算的普及也是漸進式的,不是一蹴而就的,大家傳統伺服器用的好好就要一下次大跨步的使用 PaaS 類 SaaS 類服務。
ServerLess (無伺服器化)是最近很火的一個概念,讓我想起了曾經的 APP Engine,但是随着 ServerLess 的不斷發展其實我們可以發現,ServerLess 已經變得和傳統伺服器一樣好用了,受到的限制也随着版本的疊代服務的更新變得越來越少,就像阿裡雲的函數服務其實并沒有太大的學習成本和變動。
上圖是 ServerLess 發展的小簡史,網站背後的運作技術服務的發展其實就像是我們對物質從分子到原子到電子、誇克的了解:
- 實體伺服器時代,從大型機、小型機中脫離開來,1U、2U的伺服器就可以支撐我們的服務,同時将伺服器托管給IDC機構,不再考慮機房的建設維護問題,典型應用是 伺服器租賃托管和虛拟主機。
- 虛拟化時代,我們使用 XEN、KVM等虛拟化技術,隔離了硬體以實作作業系統級别的隔離,讓伺服器的購買更加優惠同時粒度更細,我們以 CPU、記憶體計費并以月計費,不再考慮實體伺服器采購和維護的問題,典型應用是 VPS。
- 雲計算時代,我們使用雲計算進一步地自動管理這些虛拟化的資源,更安全更便捷同時也更便宜,不僅僅可以将伺服器拆的更細,也能将多台伺服器整合成一台超性能伺服器,同時計費粒度到了小時級别。 不僅僅是伺服器,資料庫、存儲等等我們都不再考慮實施部署的問題,典型應用是各類雲計算産品,特别是雲資料庫、雲存儲等。
- 容器化時代,我們使用 Docker、k8s 等容器技術,通過微服務的拆解将應用粒度變得更細膩,維護和實施變得更加友善。典型應用是各大企業開發能力、效率提升。
現在,我們有了 Serverless,一種粒度更細的形式出現了,我們以 計算 * 時間 的方式計費,同時又獲得了将應用拆解的更加細膩的方式,讓我們無需考慮任何後端的問題,随着請求的增長,ServerLess 會自動進行伸縮,而不像傳統雲服務一樣要自行搭建負載均衡和配置可擴充的無狀态環境,開發人員不用考慮伺服器的安全問題,不用考慮Docker的部署問題,不用考慮 Runtime 調優、更新、安全等問題等等。
當然了,ServerLess 遠不是那麼簡單的産品,我也隻是淺淺的了解了一層。
介紹
ServerLess 在阿裡雲上是 函數計算(Function Compute)是一個事件驅動的全托管計算服務。這裡是介紹:
通過函數計算,您無需管理伺服器等基礎設施,隻需編寫代碼并上傳。函數計算會為您準備好計算資源,以彈性、可靠的方式運作您的代碼。更棒的是,您隻需要為代碼實際運作消耗的資源付費 - 代碼未運作則不産生費用。
如果要搜尋一些 ServerLess 的中文教程,或者阿裡雲函數計算的相關教程,個人建議就用
函數計算
代替
ServerLess
來避免大量搜到其他比不要的 ServerLess 教程的噪音。
下面是傳統方式搭建服務和 ServerLess 的對比:
項目開發效率 | 傳統方式搭建服務 | 函數計算方式 |
---|---|---|
采購伺服器等基礎設施 | 需要 | 不需要 |
管理伺服器等基礎設施 | ||
開發業務服務子產品 | ||
部署業務服務子產品 | 需要,但是很簡單,提供了很多工具 | |
通過 nginx 搭建反向代理、https 和負載均衡 | 不需要,通過阿裡雲 API 網關或函數 HTTP 觸發器可以實作 | |
搭建相關日志服務 | 不需要,通過日志開關開啟日志服務 | |
配置安全通路規則 | 不需要,自帶基礎安全通路配置,API 網關提供更多的配置 | |
運維負擔 | 重 | 輕 |
開發效率 | 低 | 高,通常幾天就能完成 |
Serverless | ||
---|---|---|
維護成本 | 維護成本低,無需管理伺服器等基礎設施,隻需編寫代碼并上傳,程式員從底層裝置維護中解放出來,隻考慮實際業務邏輯即可。 | 維護成本高,自行維護伺服器,需要處理伺服器當機、伺服器擴容等一系列底層瑣碎的事情 |
可用性 | 可用性高,函數計算為使用者準備彈性、可靠的計算資源,具有根據流量自動scale特性,對有明顯波峰波谷的運用效果奇佳 | 伺服器故障會對應用服務産生嚴重影響 |
費用 | 按需付費,隻為實際使用的計算資源付費,代碼未運作則不産生費用 | 需要支付伺服器的費用,代碼運作與否都要收費 |
不足
當然了 ServerLess 是很誘人,但卻不是萬能的,有些場景還是不适合的。
- ServerLess 不僅僅是一門技術也是一種理念和微服務一樣,很多老系統不能直接上 ServerLess,得相應的進行更新和拆解才能更好的适應 ServerLess,這是一個門檻。
- 同時 ServerLess 針對開發語言的可定制性和可開放性,ServerLess 會選擇處于穩定版的語言且更新具有一定的滞後性,特别是 Node.JS 這樣的版本更新帝,最新穩定版是10,但是提供的卻是8。同時如果對語言有底層的修改而無法通過 Plugin 實作同樣也無法适應相關場景。
- 不适合長時間的進行計算處理的場景,ServerLess 是産生計算後按時間計費的,适合那些觸發類短時間計算的,如果有長時間進行計算的場景就不适合。
教程
本次教程,我們将介紹如何在阿裡雲的 ServerLess 産品中部署 WordPress。 因為在部落格這種計算量小的場景也是比較适合放在 ServerLess 中的,不過因為 WordPress 的插件庫又很豐富用了不同的插件完全可以實作不同的場景功能,是以到底适不适合放還得評估一下。
如上圖所示,函數計算代替了像 Apache Httpd、Nginx 之類的傳統 Web 服務軟體本身,使用者函數代替了Web 服務軟體的
.conf
配置檔案。 PHP Runtime 代替 PHP 這個就很好了解了。然後 NAS 則作為存儲檔案并提供寫入的地方,不然像 APP Engine 一樣無法進行寫入操作就很難操作了。
準備
一、 函數計算FaaS,可按量付費,有免費額度
二、 檔案存儲NAS,可按量付費
三、 雲資料庫RDS
四、 日志服務LOG(可選),可按量付費,有免費額度
每個産品都開設在同一個地域同一個 VPC 下。
動手吧
NAS
因為檔案托管需要依賴 NAS,是以得開通 NAS。
一、進入 NAS 控制台
https://nas.console.aliyun.com/二、 選擇好地域後,建立檔案系統
三、存儲類型建議還是用 SSD性能型,因為 NAS 的讀寫性能相比雲盤還是有些低的,NAS 隻要地域對任何可用區都可以挂載使用。
四、建立完之後 添加挂載點
五、選擇專有網絡,選擇好對應的VPC網絡和交換機,權限組選擇 全部允許
函數計算
一、進入函數計算控制台
https://fc.console.aliyun.com二、選擇地域後建立新的函數服務
三、開啟進階配置,開通公網通路,不然網站都打不開:
四、需要配置專有網絡,在專有網絡下才能更安全的使用函數計算并整合其他雲産品。
五、配置NAS的使用者(uid)和使用者組(gid),例如我填的是
10005
,這個用在到時候 chown 給予權限上,然後選擇之前建立過的 NAS挂載點,本地目錄選擇挂載在
/mnt/www
六、日志配置建議就隻是選擇空白項目和空白倉庫好了,日志服務是有一定免費的額度的。 當然不開也不影響服務運作。
七、相關服務間的調用需要進行授權,是以我們可以選擇 建立角色 ,在系統模闆授權中勾選服務所需要的系統授權,然後如圖中搜尋
AliyunECSNetworkInterfaceManagementAccess
權限,并選擇。
八、然後會跳轉到 角色快捷建立 的頁面,也不用管太多,直接 同意授權 即可。
九、傳回後就是授權成功了。
十、點選建立即可,成功了就直接成功了,如果傳回說:
VSwitch 'vsw-2zenbov6s8r8kwad6c0bd' is in unsupported zone 'cn-beijing-e' (allowed zones: cn-beijing-c)
意思就是說目前函數計算隻支援建立在 cn-beijing-c 的專有網絡·虛拟交換機。 不同的地域具體支援的可用區可能不同。 在專有網絡哪裡建立一個
allowed zones: xxxxx
可用區的虛拟交換器然後重新建立函數計算即可。
十一、然後建立函數
十二、選擇建立一個空白函數
十三、選擇建立 HTTP 觸發器,認證方式選擇 anoymous,請求方式全部勾選
十四、運作環境選擇 PHP 7.2,不然怎麼跑 WordPress
十五、代碼配置這塊,選擇 線上編輯,貼入下面我提供的代碼即可。
<?php
use RingCentral\Psr7\Response;
function endsWith($haystack, $needle) {
$length = strlen($needle);
return $length === 0 ||
(substr($haystack, -$length) === $needle);
}
function handler($request, $context): Response{
$uri = $request->getAttribute("requestURI");
$uriArr = explode("?", $uri);
// default php / or /wp-admin/
if (preg_match('#/$#', $uriArr[0]) && !(strpos($uri, '.php'))) {
$uriArr[0] .= "index.php";
$uri = implode($uriArr);
}
$proxy = $GLOBALS['fcPhpCgiProxy'];
$root_dir = '/mnt/www';
//php script
if (preg_match('#\.php.*#', $uri)) {
$host = "pressless.mf8.biz"; // 此處填寫你的域名
$resp = $proxy->requestPhpCgi($request, $root_dir, "index.php",
['HTTP_HOST' => $host, 'SERVER_NAME' => $host, 'SERVER_PORT' => '80'],
['debug_show_cgi_params' => false, 'readWriteTimeout' => 60000]
);
return $resp;
} else {
// static files, js, css, jpg ...
$filename = $root_dir . explode("?", $uri)[0];
$filename = rawurldecode($filename);
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
$headers = [
'Content-Type' => $proxy->getMimeType($filename),
'Cache-Control' => "max-age=8640000",
'Accept-Ranges' => 'bytes',
];
return new Response(200, $headers, $contents);
}
}
注意:
第25行需要修改為你自己的域名
$host = "pressless.mf8.biz"; // 此處填寫你的域名
其他的環境配置,比如說記憶體大小、逾時秒數都可以自行設定。
十六、授權這塊因為一開始我們就建立過,是以可以直接下一步,如果應用比較複雜那麼就再修改一下。
十七、在觸發器中點選之前建立好的
wp-func
觸發器
十八、可以看到這邊又配置自定義域名的位置
十九、然後點選建立域名
二十、填寫域名名稱就是域名這個沒毛病。 然後路由設定中,路徑填寫:
/*
,然後函數就選擇之前建立的觸發器的函數。
二十一、然後會提示你下面的:
domain name 'pressless.mf8.biz' has not been resolved to your FC endpoint, the expected endpoint is '1572623648803837.cn-beijing.fc.aliyuncs.com.'
意思就是咱們得先把域名解析到提示的:
1572623648803837.cn-beijing.fc.aliyuncs.com
上才行。
那我就把我要綁定的
pressless.mf8.biz
域名CNAME解析到
1572623648803837.cn-beijing.fc.aliyuncs.com
上就行。
二十二、接下來就是上傳WordPress程式了,這時候需要就需要繼續用到 NAS 了。鑒于建立一個轉移函數遷移壓縮包内容到NAS很多人不太會,是以我更建議開一台按量的 ECS 挂載NAS然後通過SFTP進行可視化操作。 當然還可以拿這台 ECS 來做資料庫伺服器在前期可以降低購買雲資料庫的成本。
例如我通過下面的指令将 NAS 通過 NFS 的方式挂載至
/mnt
目錄下:
mount -t nfs -o vers=4.0 16d3e4b609-cub21.cn-beijing.nas.aliyuncs.com:/ /mnt
二十三、通路我們綁定的域名,例如我是:
http://pressless.mf8.biz二十四、那我這裡就通過 ECS 自建的 MySQL 資料庫,然後内網位址連接配接是可以進行正常連接配接和安裝的。 如果是通過雲資料庫的話,那麼需要在白名單哪裡添加
0.0.0.0/0
,同樣的ECS自建也要保證專有網絡内網内可以被通路。
二十五、如果我們安裝WP插件和更新WP遇到了需要填寫FTP的要求的話,我們别忘了之前我們建立函數服務的時候有填寫過 uid 和 gid。
那我們還得在 ECS 中進行操作。
chown -R 10005:10005 /mnt/*
因為我之前設定過的 uid 和 gid 是 10005,是以這裡寫的是 10005,大家可以自己頂一,然後NAS挂載在
/mnt
目錄下,是以是
/mnt/*
總結
就這樣我們完成了一個 WordPress 的 ServerLess 化,因為大家都是第一次接觸是以教程寫的很細步驟很多,自己踩的坑都寫了一遍。
WordPress 的 ServerLess 化下一步應該是進行前後端分離通過 API 通信來減少動态請求減少函數的計算。
然後現在函數計算還不支援 Rewrite(僞靜态),不過相關技術應該是可行的,大家可以給我的這條聆聽點個贊:
【功能建議】函數計算ServerLess添加對Rewrite(僞靜态)的支援再然後其實函數計算還需要一款按量計費的ServerLess化的關系型資料庫,因為 TableStore 是支援按量的 NoSQL,同樣這是聆聽建議的連結:
【功能建議】資料庫體系中還需要一款能按量使用的關系型資料庫,可以是 POLARDB ServerLess