前言
本文旨在通過 快速部署一個 wordpress 網站到阿裡雲
函數計算平台 這個示例來展示 serverless web 新的開發模式, 包括 FUN 工具一鍵初始化 NAS, 同步網站到 NAS, 一鍵部署等能力, 展現函數計算的開發靈活特性、自動彈性伸縮能力、免運維和完善的監控設施。
相關參考文檔:
https://yq.aliyun.com/articles/6409121.1 DEMO 概述
- DEMO 示例效果入口: http://hz.mofangdegisn.cn
- 賬号: fc-test-user
- 密碼: fc-test-pwd
- DEMO 示例工程位址: fc-wordpress
開通服務
免費開通函數計算, 按量付費,函數計算有很大的免費額度。
免費開通檔案存儲服務NAS, 按量付費
1.2 解決方案

如上圖所示, 當多個使用者通過對外提供的 url 通路web服務的時候時候,每秒的請求幾百上千都沒有關系, 函數計算平台會自動伸縮, 提供足夠的執行執行個體來響應使用者的請求, 同時函數計算提供了完善的監控設施來監控您的函數運作情況。
1.3 Serverless 方案與傳統自建 web 方案對比
ITEM | 成本 | 穩定性 |
---|---|---|
基于 VM 方案 | 使用 ecs.t5-lc1m1.small, 22.8元/月 | 伺服器和資料庫在同一台VM, 均無主備容災,同時該規格的主機本身性能弱 |
輕量應用伺服器 | 60元/月(1vCPU 1GB 1Mbps 20GB[ssd]) | |
sqlite3 版本約為 1元/月 mysql 版本大約 26元/月 | 高 |
函數計算完整費用詳情:
- 每月前 100 萬次函數調用免費, 每月前 400000(GB*秒) 費用免費, 函數的記憶體可以設定為 128M 或者 256M, 是以對于一個一個月通路量低于 100 萬次的網站, 該項是免費的
- 對于低成本的網站, 假設一個月的産生的公網流量為 1GB, 0.8元
- NAS, US$0.06/GB/Month, 網站大小為 50M, 即使按 1G 計算, 0.42元
- RDS mysql 最基本的單機版本, 25元/月
|
NAS 定價如上所述, 在低成本網站領域, 函數計算具有十分明顯的成本優勢,同時還保持了彈性能力,以後業務規模做大以後并沒有技術切換成本(可能需要做的隻是更換一個更強的關系型資料庫), 同時财務成本增長配合預付費也能保持平滑。低成本網站變成高可用高性能網站如絲般順滑, 高性能網站詳情可以參考文末
FAQ中的 Q1 問題。
函數計算運作 PHP 架構原理
在具體操作部署之前, 先簡單梳理一遍 函數計算運作 PHP 架構原理
2.1 傳統伺服器 PHP 運作原理
- 原理示意圖
一進制建站-基于函數計算 + wordpress 建構 serverless 網站前言函數計算運作 PHP 架構原理案例操作步驟FAQ - A simple nginx conf
一進制建站-基于函數計算 + wordpress 建構 serverless 網站前言函數計算運作 PHP 架構原理案例操作步驟FAQ
從上面原理示意圖我們可以看出,Web 伺服器根據 conf 中 location将 PHP 腳本交給 php-fpm 去解析,然後将解析後的結果傳回給 client 端
2.2 FC 驅動 PHP 工程原理
- 函數計算的執行環境執行個體相當于傳統 web 服務的 Apache/Nginx
- 使用者函數相當于實作 Apache/Nginx 的 conf 中 location
- 使用者将 Web 網站部署在 NAS,然後挂載 NAS 到函數的執行環境, 比如下面代碼中
目錄/mnt/auto
- 對于 WordPress 入口函數代碼就是這麼簡單: index.php 其中函數計算為使用者提供了一個
對象用來和 php-fpm 進行互動,對$GLOBALS['fcPhpCgiProxy']
PHP 工程中的 php 檔案進行解析,該對象提供了兩個重要的接口:
- requestPhpCgi
requestPhpCgi($request, $docRoot, $phpFile = "index.php", $fastCgiParams = [], $options = [])
- `$request`: 跟 `php http invoke` 入口的參數一緻
- `$docRoot`: Web 工程的根目錄
- `$phpFile`: 用于拼接 cgi 參數中的 SCRIPT_FILENAME 的預設參數
- `$fastCgiParams`: 函數計算内部盡量根據 $request給您構造 `default cgi params`, 但是如果您不是想要的,可以使用`$fastCgiParams`覆寫一些參數 (reference: [cgi](https://en.wikipedia.org/wiki/Common_Gateway_Interface))
- `$options`: array類型,可選參數, debug_show_cgi_params 設為 true ,會列印每次請求 php 解析時候的 cgi 參數, 預設為 false ;readWriteTimeout 設定解析的時間, 預設為 5 秒
如果您有興趣, 可以了解下函數計算 PHP Runtime:
案例操作步驟
準備條件
有一個域名, 比如 abc.com, 并将域名 CNAME 解析到 函數計算(FC) 對應的 region
如您想在杭州的 region 部署 wordpres 網站, 則将 abc.com CNAME 解析到 12345.cn-hangzhou.fc.aliyuncs.com, 其中 12345 是您的 accountId
3.1 安裝最新的 Fun 工具
3.2 Clone 工程
git clone https://github.com/awesome-fc/fc-wordpress.git
3.3 根據需要使用的資料庫進入不同的目錄
- 複制 .env_example 檔案為 .env, 并且修改 .env 中的資訊為自己的資訊
如果使用 mysql 資料庫, 參考章節 3.3.1
如果使用 sqlite3 資料庫, 參考章節 3.3.2
3.3.1 使用 mysql 資料庫
- 進入 目錄 fc-wp-mysql
fun nas init
fun nas info
fun nas init: 初始化 NAS, 基于您的 .env 中的資訊擷取(已有滿足條件的nas)或建立一個同region可用的nas
如果你沒有修改 templata.yml 中的配置 service名字, 那麼則可以進入下一步; 如果有修改, 會在目前目錄生成新的目錄 .fun/nas/auto-default/{serviceName} (fun nas info 可以列出新的目錄), 将預設目錄下的 .fun/nas/auto-default/fc-wp-mysql/wordpress 的wordpress目錄拷貝到 .fun/nas/auto-default/{serviceName} 下, 同時可以删除目錄 .fun/nas/auto-default/fc-wp-mysql/wordpress
- 上傳 wordpress 網站到 NAS
fun nas sync
fun nas ls nas:///mnt/auto/
: 将本地 NAS 中的内容(.fun/nas/auto-default/fc-wp-mysql)上傳到 NAS 中的 fc-wp-mysql 目錄
fun nas sync
: 檢視我們是否已經正确将檔案上傳到了 NAS
fun nas ls nas:///mnt/auto/
3.3.2 使用 sqlite3 資料庫
- 進入 目錄 fc-wp-sqlite
fun nas init
fun nas info
如果你沒有修改 templata.yml 中的配置 service名字, 那麼則可以進入下一步; 如果有修改, 會在目前目錄生成新的目錄 .fun/nas/auto-default/{serviceName} (fun nas info 可以列出新的目錄), 将預設目錄下的 .fun/nas/auto-default/fc-wp-sqlite/wordpress 的wordpress目錄拷貝到 .fun/nas/auto-default/{serviceName} 下, 同時可以删除目錄 .fun/nas/auto-default/fc-wp-sqlite/wordpress
- 本地完成安裝過程, 初始化 sqlite3 資料庫
- 在目錄 .fun/nas/auto-default/fc-wp-sqlite/wordpress 中輸入指令:
php -S 0.0.0.0:80
- 修改 host 檔案,添加
127.0.0.1 hz.mofangdegisn.cn
其中 hz.mofangdegisn.cn 是您預先準備的域名
- linux/mac : vim /etc/hosts
- windows7: C:WindowsSystem32driversetc
- 通過浏覽器輸入 hz.mofangdegisn.cn, 這個時候沒有mysql資料庫設定頁面,完成 wordpress 安裝過程
成功安裝以後, 這個時候, .fun/nas/auto-default/fc-wp-sqlite/wordpress/wp-content 下面應該有一個 database 的目錄, ls -a 檢視, 應該有 .ht.sqlite 這個 sqlite3 資料庫檔案
-
回退 host 檔案的修改
注: 中間修改 host 的目的是初始化 sqlite3 資料庫的時候, base site url 是提前準備的域名, 而不是 127.0.0.1
fun nas sync
fun nas ls nas:///mnt/auto/
: 将本地 NAS 中的内容(.fun/nas/auto-default/fc-wp-sqlite)上傳到 NAS 中的 fc-wp-sqlite 目錄
fun nas sync
fun nas ls nas:///mnt/auto/
3.4 部署函數到FC平台
接下來将函數部署到雲平台:
- 修改 index.php 中的 $host 中的值
- 修改 template.yml LogConfig 中的 Project, 任意取一個不會重複的名字即可
- 修改 template.yml 自定義域名為自己提前準備好的域名
- 執行
fun deploy
登入控制台
https://fc.console.aliyun.com,可以看到service 和 函數已經建立成功, 并且 service 也已經正确配置。
通過浏覽器打開自己之前配置的域名, 比如本例中的 hz.mofangdegisn.cn
- mysql 版本資料庫, 可以直接跟傳統的 wordpress 一樣,直接進入安裝過程
- sqlite3 版本資料庫, 由于之前已經完成初始化,可以直接進入網站首頁或網站背景
Q1: 函數計算能開發高性能高可用網站嗎?
A: 可以, 使用函數計算的單執行個體多并發功能和高性能資料庫
- 單執行個體多并發
- 選擇高性能關系型資料庫,比如高可用的 雲資料庫POLARDB
有必要再加上這些優化:
- 預留執行個體消除冷啟動 + 預付費優化成本
- 極速型 NAS
- OSS 對象存儲 + CDN 來存儲和分發靜态資源
目前 PHP Runtime 并不支援單執行個體多并發, 使用 Custom Runtime,可以将基于傳統模式 nginx + php-fpm + mysql 開發的網站直接簡單無縫遷移到函數計算平台,示例工程 customruntime-php
使用OSS對Wordpress進行圖檔動靜分離
Q2: 使用低成本 sqlite3 版本的網站, 冷啟動第一次打開很慢怎麼辦?
A: 用一個 timer trigger 的函數 keep warm
Q3: 使用低成本 sqlite3 版本的網站, 能支援多大的qps?
A: 由 sqlite3 資料庫性能決定, 這邊有一些壓測結果:
每次壓力增大時候, 都有些冷啟動,時間慢點,但是支援從壓測結果來看支援 50 QPS 是沒有疑問的, 是足夠支援一些中小網站的。
Q4: 使用其他語言基于函數計算開發 serverless 網站可以嗎?
A: 可以, 比如 python:
https://yq.aliyun.com/articles/603249, 或者直接使用 custom runtime, 内置了 java、python 和 node,
Custom Runtime 使用者手冊,
Custom Runtime 使用集錦“ 阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”