一元建站-基於函數計算 + wordpress 構建 serverless 網站

前言

本文旨在經過 快速部署一個 wordpress 網站到阿里雲函數計算平臺 這個示例來展現 serverless web 新的開發模式, 包括 FUN 工具一鍵初始化 NAS, 同步網站到 NAS, 一鍵部署等能力, 展示函數計算的開發敏捷特性、自動彈性伸縮能力、免運維和完善的監控設施。php

相關參考文檔: https://yq.aliyun.com/articles/640912html

1.1 DEMO 概述

開通服務node

免費開通函數計算, 按量付費,函數計算有很大的免費額度。python

免費開通文件存儲服務NAS, 按量付費mysql

1.2 解決方案

1.png

如上圖所示, 當多個用戶經過對外提供的 url 訪問web服務的時候時候,每秒的請求幾百上千都沒有關係, 函數計算平臺會自動伸縮, 提供足夠的執行實例來響應用戶的請求, 同時函數計算提供了完善的監控設施來監控您的函數運行狀況。linux

1.3 Serverless 方案與傳統自建 web 方案對比

ITEM 成本 穩定性
基於 VM 方案 使用 ecs.t5-lc1m1.small, 22.8元/月 服務器和數據庫在同一臺VM, 均無主備容災,同時該規格的主機自己性能弱
輕量應用服務器 60元/月(1vCPU 1GB 1Mbps 20GB[ssd]) 服務器和數據庫在同一臺VM, 均無主備容災,同時該規格的主機自己性能弱
函數計算 sqlite3 版本約爲 1元/月 mysql 版本大約 26元/月

函數計算完整費用詳情:nginx

  • 每個月前 100 萬次函數調用免費, 每個月前 400000(GB*秒) 費用免費, 函數的內存能夠設置爲 128M 或者 256M, 所以對於一個一個月訪問量低於 100 萬次的網站, 該項是免費的
  • 對於低成本的網站, 假設一個月的產生的公網流量爲 1GB, 0.8元
  • NAS, US$0.06/GB/Month, 網站大小爲 50M, 即便按 1G 計算, 0.42元
  • RDS mysql 最基本的單機版本, 25元/月

函數計算計費 | NAS 訂價git

如上所述, 在低成本網站領域, 函數計算具備十分明顯的成本優點,同時還保持了彈性能力,之後業務規模作大之後並無技術切換成本(可能須要作的只是更換一個更強的關係型數據庫), 同時財務成本增加配合預付費也能保持平滑。低成本網站變成高可用高性能網站如絲般順滑, 高性能網站詳情能夠參考文末 FAQ 中的 Q1 問題。github

函數計算運行 PHP 框架原理

在具體操做部署以前, 先簡單梳理一遍 函數計算運行 PHP 框架原理

2.1 傳統服務器 PHP 運行原理

  • 原理示意圖

2.png

  • A simple nginx conf

3.png

從上面原理示意圖咱們能夠看出,Web 服務器根據 conf 中 location將 PHP 腳本交給 php-fpm 去解析,而後將解析後的結果返回給 client 端

2.2 FC 驅動 PHP 工程原理

4.png

  • 函數計算的執行環境實例至關於傳統 web 服務的 Apache/Nginx
  • 用戶函數至關於實現 Apache/Nginx 的 conf 中 location
  • 用戶將 Web 網站部署在 NAS,而後掛載 NAS 到函數的執行環境, 好比下面代碼中  /mnt/auto 目錄
  • 對於 WordPress 入口函數代碼就是這麼簡單: index.php

其中函數計算爲用戶提供了一個 $GLOBALS['fcPhpCgiProxy'] 對象用來和 php-fpm 進行交互,對 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:

案例操做步驟

準備條件

免費開通函數計算, 按量付費,函數計算有很大的免費額度。

免費開通文件存儲服務NAS, 按量付費

有一個域名, 好比 abc.com, 並將域名 CNAME 解析到 函數計算(FC) 對應的 region

如您想在杭州的 region 部署 wordpres 網站, 則將 abc.com CNAME 解析到 12345.cn-hangzhou.fc.aliyuncs.com, 其中 12345 是您的 accountId

3.1 安裝最新的 Fun 工具

  • 安裝版本爲8.x 最新版或者10.x 、12.x nodejs
  • 安裝 funcraf

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/
fun nas sync: 將本地 NAS 中的內容(.fun/nas/auto-default/fc-wp-mysql)上傳到 NAS 中的 fc-wp-mysql 目錄
fun nas ls nas:///mnt/auto/: 查看咱們是否已經正確將文件上傳到了 NAS

3.3.2 使用 sqlite3 數據庫

  • 進入 目錄 fc-wp-sqlite
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-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
  • linux/mac : vim /etc/hosts
  • windows7: C:WindowsSystem32driversetc

其中 hz.mofangdegisn.cn 是您預先準備的域名

  • 經過瀏覽器輸入 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

  • 上傳 wordpress 網站到 NAS
fun nas sync
fun nas ls nas:///mnt/auto/
fun nas sync: 將本地 NAS 中的內容(.fun/nas/auto-default/fc-wp-sqlite)上傳到 NAS 中的 fc-wp-sqlite 目錄
fun nas ls nas:///mnt/auto/: 查看咱們是否已經正確將文件上傳到了 NAS

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 版本數據庫, 因爲以前已經完成初始化,能夠直接進入網站首頁或網站後臺

FAQ

Q1: 函數計算能開發高性能高可用網站嗎?

A: 能夠, 使用函數計算的單實例多併發功能和高性能數據庫

有必要再加上這些優化:

目前 PHP Runtime 並不支持單實例多併發, 使用 Custom Runtime,能夠將基於傳統模式 nginx + php-fpm + mysql 開發的網站直接簡單無縫遷移到函數計算平臺,示例工程 customruntime-php
使用OSS對Wordpress進行圖片動靜分離

Q2: 使用低成本 sqlite3 版本的網站, 冷啓動第一次打開很慢怎麼辦?

A: 用一個 timer trigger 的函數 keep warm

Q3: 使用低成本 sqlite3 版本的網站, 能支持多大的qps?

A: 由 sqlite3 數據庫性能決定, 這邊有一些壓測結果:

5.png

6.png

每次壓力增大時候, 都有些冷啓動,時間慢點,可是支持從壓測結果來看支持 50 QPS 是沒有疑問的, 是足夠支持一些中小網站的。

Q4: 使用其餘語言基於函數計算開發 serverless 網站能夠嗎?

A: 能夠, 好比 python: https://yq.aliyun.com/articles/603249 , 或者直接使用 custom runtime, 內置了 java、python 和 node, Custom Runtime 用戶手冊 , Custom Runtime 使用集錦

7.png

阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」
相關文章
相關標籤/搜索