轉載自 -> blog.vvvvvvvvvvvvvvv.com/2018/05/15/…
15v網技術部落格 是由 hexo 生成的靜態站點, 採用 hexo 主題 hexo-theme-next. 全站資源上傳至 阿里 OSS, 並由 CDN 加速訪問. 不用新開一臺伺服器託管該部落格, 也不用佔用15v網主伺服器的資源. HTTPS 證書由免費的 Let's Encrypt 簽發. 該站點只需要付費每個月的 CDN 流量費和 HTTPS 的請求費用.
相比較 github 的靜態託管, 阿里雲 CDN 託管的站點訪問速度可以算一個優勢吧.
Prerequisite
- 一個阿里雲賬號並且開通了物件儲存服務, CDN 服務
- 一個成功通過備案的域名
建立 OSS Bucket
點選這裡:
填入必要的資訊:
- 我這裡已經建立過命名為
15v-blog
的 bucket 所以提醒我重名. - 區域, 如果沒有特殊要求(需要和已有的伺服器同一區域, 以便於內網訪問)的話, 建立離你的地理位置比較近的區域, 上傳速度快一點, ?國內其實也沒有太大的區別.
- 儲存型別為標準儲存, 因為部落格的資源需要經常被訪問
- 讀寫許可權, 我的讀寫許可權為公共讀, 你可以配置為私有, 不過私有的訪問起來需要憑證, 麻煩點, 可以配置為公共讀, 然後設定 referer(在基礎設定 -> 防盜鏈) 來限制訪問, 一定不能設定為公共讀寫.
- 填寫完成之後點選確定, 建立完成.
配置 OSS 為靜態網站託管模式
填寫預設首頁為 index.html
, 404 頁面按需配置
OSS 的概覽:
配置 CDN
進入 CDN 控制檯點選這裡:
填寫資訊:
- 加速域名, 填寫你需要加速的域名, 如
blog.vvvvvvvvvvvvvvv.com
- 業務型別為圖片小檔案型別
- 源站型別為 OSS, 選擇剛剛在上方建立的 OSS 的域名
- 需要 HTTPS, 埠選擇 443 埠, 否則選擇 80 埠就可
選擇 443 埠之後會出現 回源預設不攜帶SNI資訊 什麼是 SNI?, 等會兒要配置 CDN 的 HTTPS 證書, 這裡可以忽略這個提示.
提交之後進入稽核階段並獲取阿里雲分配的 CNAME:
提交之後會進入稽核階段, 稍等一會兒(很快), 就會稽核通過.
稽核通過狀態為配置中, 稍等一會兒, 等待阿里雲系統分配 CNAME, 分配完成:
配置 CNAME:
回到域名管理, 可以看到加速域名對應的 CNAME, 點選複製
點選 CNAME 複製, 進入雲解析 DNS 配置域名解析, 點選這裡:
- 記錄型別 必須指定為 CNAME
- 主機記錄填寫要加速的域名, 我這裡就填了
blog
- 解析線路預設就好
- 記錄值填寫在 CDN 域名管理中分配的域名, 就是剛剛複製的域名
- TTL 值, 為域名紀錄的最長快取時間, 預設的10分鐘也可
點選確認, 新增成功.
不需要 HTTPS, 關於阿里雲的配置這裡就結束了 -> goto HEXO 配置
配置 HTTPS, 需要給自己的加速域名申請一個 HTTPS 證書
DO 有很好的教程, 這裡就不重複了
- how-to-secure-nginx-with-let-s-encrypt-on-centos-7
- how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04
- how-to-secure-nginx-with-let-s-encrypt-on-debian-8
- how-to-secure-apache-with-let-s-encrypt-on-centos-7
- how-to-secure-apache-with-let-s-encrypt-on-ubuntu-18-04
- how-to-secure-apache-with-let-s-encrypt-on-debian-8
回到 CDN -> 域名管理, 點選配置:
配置 HTTPS, 選擇開啟, 選擇自定義上傳證書, 給證書起個名字
將申請的 HTTPS 證書的公鑰和私鑰分別拷貝到對應的輸入框內
以 centos 7 + nginx 申請的 Let's Encrypt 為例
fulllchain.pem
為公鑰, privkey.pem
為私鑰.
下面還有是否強制 HTTP -> HTTPS. 15v網全站採用 HTTPS.
點選確定, HTTPS 證書將會很快生效.
HEXO 配置
npm install -g hexo
cd ~/loveTech
hexo init blog-15v-app
cd blog-15v-app
npm install
複製程式碼
新建完成後,指定資料夾的目錄如下:
.
├── _config.yml
├── package.json
├── scaffolds
├── source
| ├── _drafts
| └── _posts
└── themes
複製程式碼
更多的 hexo 配置請至 hexo 官網 hexo.io/zh-cn/docs/ 檢視
安裝主題 next
請至 github.com/theme-next/… 檢視如何安裝
修改 NEXT 原始碼以滿足要求
使用 hexo generate
命令生成靜態站點, 生成之後的目錄結構為:
預設的訪問路徑為:
http://localhost:4000/2018/05/15/how-depoly-blog-to-alioss-and-use-cdn/
http://localhost:4000/archives/
也就是訪問的路徑都是不帶有 index.html
的, 但是 OSS 的訪問路徑必須為絕對路徑, 必須包含 index.html
, 否則會導致一直訪問的都是 OSS 中配置的首頁, NEXT 主題的配置也沒有該配置項, 可以修改原始碼已滿足要求.
首先, 修改 archives
的訪問地址, 這個的配置在 NEXT 的配置檔案中 themes/next/_config.yml
:
你可以選擇直接修改, 或者是在自己的專案的配置檔案中覆蓋主題的配置檔案, 詳情請見 hexo.io/docs/config…, 中文的文件中沒有這一節哦.
第二步, 修改首頁部落格文的連結, 也就是這裡的連結:
找到 theme/next/layout/_macro/post.swig
, 在 a 連結的後面加上 index.html
:
第三部, 修改文章底部的連結:
找到 theme/next/layout/post.swig
, 在 a 連結的後面加上 index.html
:
至此, 關於 HEXO 的配置也已經完畢, 接下來如何將生成的靜態站點上傳至 OSS
自動化指令碼上傳靜態站點至 OSS
hexo generate
可以將整個靜態網站生成在 public
下面
只需要將整個 public
目錄上傳至 OSS 即可, 但是要保持目錄結構.
看一下我寫的自動化指令碼
需要安裝模組 ali-oss
nodejs 版本需要 10.x+
const fs = require('fs')
const path = require('path')
const util = require('util')
const OSS = require('ali-oss').Wrapper
const promisifyReaddir = util.promisify(fs.readdir)
const promisifyStat = util.promisify(fs.stat)
// 阿里 OSS access key 擁有對 OSS 的全部許可權
const ALIOSSKEY = {
key: '**********',
secret: '***************'
}
const client = new OSS({
// 請填寫你的 Bucket 對應的 region
region: '*******',
accessKeyId: ALIOSSKEY.key,
accessKeySecret: ALIOSSKEY.secret,
// 請填寫對應的 Bucket 名字
bucket: '15v-blog'
})
const publicPath = path.resolve(__dirname, './public')
async function run(proPath = '') {
const dir = await promisifyReaddir(`${publicPath}${proPath}`)
for (let i = 0; i < dir.length; i++) {
const stat = await promisifyStat(path.resolve(`${publicPath}${proPath}`, dir[i]))
if (stat.isFile()) {
const fileStream = fs.createReadStream(path.resolve(`${publicPath}${proPath}`, dir[i]))
console.log(`上傳檔案: ${proPath}/${dir[i]}`)
const result = await client.putStream(`${proPath}/${dir[i]}`, fileStream)
console.log(result)
} else if (stat.isDirectory()) {
await run(`${proPath}/${dir[i]}`)
}
}
}
run()
複製程式碼
如何獲取 OSS key 可以看阿里雲的官方文件 -> help.aliyun.com/document_de…
阿里雲的 OSS 的 Nodejs 的 SDK 文件可以看這裡 -> help.aliyun.com/document_de…
如果不想了解指令碼原始碼, 你可以將該指令碼放置在 hexo 生成的專案根目錄下, hexo generate
生成靜態站點之後, node depoly-to-oss.js
可以將 public
目錄下的檔案上傳至對應的 OSS Bucket, 並保持整個目錄的結構.
上傳檔案至 OSS 不收任何費用
結語
- 使用阿里雲 OSS + CDN 的速度在國內訪問肯定要比 Github 的速度快
- 可以完全使資源完全獨立於主站服務
- 不過要每個月需要支付 CDN 的流量費和 HTTPS 請求費用, 相信你支付的起