博客的遷移及自動化部署并全站https化

過完年來想把博客做一個遷移谦疾,放到自己購買的服務(wù)器上,并實現(xiàn)?自動化部署含友,并啟用全站HTTPS

hexo本地部署

這一步驟網(wǎng)上有很多教程怯邪,這里不再多說了

服務(wù)器自動化部署

大體的流程就是,我們通過hexo g命令在本地生成靜態(tài)文件以后丙者,通過git push到我們的遠(yuǎn)程倉庫(這里我用的是GitHub)复斥,然后由于我們事先在項目庫中配置了webhooks,由它post到你的服務(wù)器一個請求鏈接械媒,我們的服務(wù)器收到請求后目锭,對應(yīng)執(zhí)行我們提前寫好的腳本,再將push的內(nèi)容同步到我們的服務(wù)器纷捞,從而更新了服務(wù)器的內(nèi)容痢虹。

服務(wù)器環(huán)境配置

我們通過ssh(windows用戶可以通過putty登錄)登錄到我們的服務(wù),我這里用的是Ubuntu系統(tǒng)主儡,安裝好nodejs,git,nginx后奖唯,將我們的文件從遠(yuǎn)程倉庫拉下來

mkdir blog
cd blog
git init
git remote add origin https://github.com/yuxingxin/yuxingxin.github.io.git
git pull origin master
  1. 配置nginx
    這個配置之前寫的有相關(guān)文章,不明白得可以看這里糜值,不過這里的系統(tǒng)是Ubuntu丰捷,所以nginx的安裝路徑也不太一樣(/etc/nginx)
    默認(rèn)我們需要在/etc/nginx/conf.d/目錄下添加配置文件blog.conf
    注意這里的后綴名一定是.conf
vim /etc/nginx/conf.d/blog.conf

然后配置上我們的域名,端口和映射地址

server {
    listen       80;  #修改這里為其他端口如8081
    server_name  yuxingxin.com www.yuxingxin.com; # 這里是你的域名
    location / {
        root   /root/blog/; #修改這里的路徑為自己的路徑
        index  index.html index.htm;
    }
}

然后重啟nginx通過域名就可以訪問我們的博客了

nginx -s reload
  1. webhooks配置
    也就是人們常說的鉤子寂汇,是一個很有用的工具病往。你可以通過定制 Webhook 來監(jiān)測你在 Github.com 上的各種事件,最常見的莫過于 push 事件,如果你設(shè)置了一個監(jiān)測 push 事件的 Webhook骄瓣,那么每當(dāng)你的這個項目有了任何提交停巷,這個 Webhook 都會被觸發(fā),這時 Github 就會發(fā)送一個 HTTP POST 請求到你配置好的地址榕栏。如此一來畔勤,你就可以通過這種方式去自動完成一些重復(fù)性工作;比如扒磁,你可以用 Webhook 來自動觸發(fā)一些持續(xù)集成(CI)工具的運(yùn)作庆揪,比如 Travis CI;又或者是通過 Webhook 去部署你的線上服務(wù)器渗磅。
    Webhook 的配置是十分簡單的嚷硫。首先進(jìn)入你的 repo 主頁,通過點(diǎn)擊頁面上的按鈕 [settings] -> [Webhooks & service] 進(jìn)入 Webhooks 配置主頁面始鱼。在Payload URL配置鏈接仔掸,比如:
http://xxxxx.com:8246/webhooks/push/deploy

這樣一來,倉庫的配置就算好了医清,接下來看服務(wù)器端如何響應(yīng)

  1. 服務(wù)器配置webhooks響應(yīng)
    首先我們在我們的博客目錄下創(chuàng)建一個js文件起暮,用來啟動我們的監(jiān)聽服務(wù),端口就是我們在倉庫配置那里的端口地址:8246
var http = require('http')
var exec = require('child_process').exec
http.createServer(function (req, res) {
    if(req.url === '/webhooks/push/deploy'){
        exec('sh ./deploy.sh',function(error,stdout,stderr){
         if(error){
          console.log(error.stack);
          console.log('Error code:'+ error.code);
         }else{
              console.log('success');
         }
    })
    }
    res.end()
}).listen(8246)

這段代碼就能啟動一個nodejs服務(wù),監(jiān)聽8246端口负懦。
當(dāng)請求過來的url完全匹配的時候筒捺,執(zhí)行deploy.sh。
再新建一個deploy.sh文件處理部署相關(guān)腳本

git pull origin master
  1. 運(yùn)行nodejs服務(wù)
node ./webhooks.js

如果你使用上面的命令運(yùn)行nodejs服務(wù)纸厉,nodejs服務(wù)會在前臺運(yùn)行系吭,可以使用pm2使nodejs運(yùn)行在后臺。
安裝
npm install pm2 -g
啟動服務(wù)
pm2 start webhooks.js
停止服務(wù)
pm2 stop webhooks.js
重啟服務(wù)
pm2 restart webhooks.js
另外我們也可以實時查看pm2的日志服務(wù)
pm2 logs

到此為止我們的自動化部署就全部完成了颗品,以后我們只需在本地將文件push到遠(yuǎn)程倉庫肯尺,就會自動同步到我們的服務(wù)器上

啟用全站HTTPS

這里簡單總結(jié)下在 Nginx 配置 HTTPS 服務(wù)器:主要簽署第三方可信任的證書和配置HTTPS

關(guān)于證書

SSL證書需要向國際公認(rèn)的證書證書認(rèn)證機(jī)構(gòu)(簡稱CA,Certificate Authority)申請躯枢。
CA機(jī)構(gòu)頒發(fā)的證書有3種類型:

  • 域名型SSL證書(DV SSL):信任等級普通则吟,只需驗證網(wǎng)站的真實性便可頒發(fā)證書保護(hù)網(wǎng)站;
  • 企業(yè)型SSL證書(OV SSL):信任等級強(qiáng)锄蹂,須要驗證企業(yè)的身份氓仲,審核嚴(yán)格,安全性更高得糜;
  • 增強(qiáng)型SSL證書(EV SSL):信任等級最高敬扛,一般用于銀行證券等金融機(jī)構(gòu),審核嚴(yán)格朝抖,安全性最高舔哪,同時可以激活綠色網(wǎng)址欄。

關(guān)于證書服務(wù)槽棍,市面上大體的都是收費(fèi)的證書,當(dāng)然也有部分是免費(fèi)的抬驴,比如Let's Encrypt 剛剛又拍云也上線了免費(fèi)的 SSL 證書炼七,另外StartSSL也提供免費(fèi)證書,有效期3年布持;另外還有騰訊云和阿里云都有相關(guān)的免費(fèi)證書豌拙,這里我使用的是Let's Encrypt ,這也是目前最知名的開源SSL證書。

證書申請

申請 Let's Encrypt 證書不但免費(fèi)题暖,還非常簡單按傅,雖然每次只有 90 天的有效期,但可以通過腳本定期更新胧卤,配好之后一勞永逸唯绍。Let's Encrypt 的證書簽發(fā)過程使用的就是 ACME 協(xié)議,這里也推薦一個小工具就是acme-tiny,它可以幫助我們簡化創(chuàng)建證書的流程。

  1. 創(chuàng)建帳號
    創(chuàng)建一個目錄存放私鑰證書等各種文件枝誊,然后進(jìn)入后創(chuàng)建我們的RSA賬戶私鑰
mkdir ssl
cd ssl
openssl genrsa 4096 > account.key
  1. 創(chuàng)建 CSR 文件
    這一步生成我們的證書簽名文件况芒,即CSR,首先要創(chuàng)建RSA私鑰
openssl genrsa 4096 > domain.key

接下來就可以生成我們的證書文件了叶撒,單個域名和多個域名生產(chǎn)的參數(shù)還不太一樣.

//單個域名
openssl req -new -sha256 -key domain.key -subj "/CN=yuxingxin.com" > domain.csr
//多個域名(比如yuxingxin.com和www.yuxingxin.com)
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yuxingxin.com,DNS:www.yuxingxin.com")) > domain.csr
  1. 配置驗證服務(wù)
    CA 在簽發(fā) DV(Domain Validation)證書時绝骚,需要驗證域名所有權(quán)耐版,而大部分都是通過郵件驗證的方式,Let's Encrypt 則是在你的服務(wù)器上生成一個隨機(jī)驗證文件压汪,再通過創(chuàng)建 CSR 時指定的域名訪問粪牲,如果可以訪問則表明你對這個域名有控制權(quán)。
    首先創(chuàng)建用于存放驗證文件的目錄
mkdir ~/www/challenges/

然后配置一個 HTTP 服務(wù)止剖,以 Nginx 為例:

server {
    listen       80;
    # 這里改成自己的域名
    server_name yuxingxin.com www.yuxingxin.com;
   
    location /.well-known/acme-challenge/ {
        alias /root/www/challenges/;
        try_files $uri =404;
    }
}
  1. 生成網(wǎng)站證書
    先把a(bǔ)cme-tiny腳本保存到之前的ssl目錄
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

指定賬戶私鑰腺阳、CSR 以及驗證目錄,在ssl目錄下執(zhí)行腳本

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /root/www/challenges/ > ./signed.crt

如果一切正常滴须,當(dāng)前目錄ssl下就會生成一個 signed.crt舌狗,這就是申請好的證書文件。
這里遇到一個錯誤,大致如下:

ValueError: Wrote file to /root/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yuxingxin.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg

網(wǎng)上查了一些方案扔水,覺得有一個比較靠譜痛侍,也得到了解決,大致就是原來庫做了一個驗證導(dǎo)致有些情況通不過魔市,這里有人fork源庫修改了部分代碼主届,地址在這里,如果出現(xiàn)上述錯誤待德,可以獲取這個庫的腳步然后在執(zhí)行上面那條命令君丁。

  1. 下載中間證書
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
  1. 為了后續(xù)能順利啟用 OCSP Stapling,我們再把根證書和中間證書合在一起:
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
  1. 修改nginx證書配置
server {
    listen 443;
    #修改成自己的域名
    server_name yuxingxin.com www.yuxingxin.com;

    ssl on;
    #這里注意證書路徑
    ssl_certificate /root/ssl/chained.pem;
    ssl_certificate_key /root/ssl/domain.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_dhparam /root/ssl/dhparam.pem;
    ssl_prefer_server_ciphers on;
    resolver 8.8.8.8;
    ssl_stapling on;
    ssl_trusted_certificate /root/ssl/signed.crt;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;preload";

    location / {
        # 這里要改成自己存放博客靜態(tài)網(wǎng)頁的目錄
        root  /root/blog;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    # 這里改成自己的域名
    server_name yuxingxin.com www.yuxingxin.com;
    ssl_certificate /root/ssl/chained.pem;
    ssl_certificate_key /root/ssl/domain.key;

    location / {
        return 301 https://$host$request_uri;
    }

    location /.well-known/acme-challenge/ {
        alias /root/www/challenges/;
        try_files $uri =404;
    }

    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

配置自動更新

Let's Encrypt 簽發(fā)的證書只有 90 天有效期将宪,推薦使用腳本定期更新
創(chuàng)建腳本文件并賦予執(zhí)行權(quán)限

mkdir shell
cd shell
vi renew_cert.sh

并復(fù)制下面內(nèi)容

#!/bin/bash
cd /root/ssl/
python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /root/www/challenges/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
service nginx reload

這里借助crontab來定時執(zhí)行任務(wù)绘闷,它是一個可以用來根據(jù)時間、日期较坛、月份印蔗、星期的組合來調(diào)度對重復(fù)任務(wù)的執(zhí)行的守護(hù)進(jìn)程。
執(zhí)行

crontab -e

然后 添加如下內(nèi)容

0 0 1 * * /root/shell/renew_cert.sh >/dev/null 2>&1

這樣以后證書每個月都會自動更新丑勤,一勞永逸华嘹。
另外這里也推薦一個網(wǎng)站,可以監(jiān)測你的證書的有效期
https://letsmonitor.org

這樣的話就算完了法竞,但是這里有幾點(diǎn)做說明

  • dhparam的生成
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
  • 強(qiáng)制HTTPS
#另外還有兩種其他的配置方式耙厚,可以自行Google
 location / {
        return 301 https://$host$request_uri;
    }
  • 關(guān)于HSTS
    HTTP Strict Transport Security的縮寫,即:“HTTP嚴(yán)格傳輸安全”岔霸。假設(shè)一個用戶從來沒有訪問過我的網(wǎng)站薛躬,,并且他第一次訪問的時候訪問的是 http://yuxingxin.com 呆细,在正常的情況下泛豪,我的服務(wù)器就會給這位用戶返回一個 301 跳轉(zhuǎn)到 https://yuxingxin.com ,并且?guī)仙厦媾渲玫腍STS頭,在用戶下次訪問我的博客時诡曙,只要 HSTS 還在有效期中臀叙,瀏覽器就會直接跳轉(zhuǎn)到相對應(yīng)的 https 頁面,并且這是不需要經(jīng)過數(shù)據(jù)傳輸?shù)募勐保苯釉诒镜貫g覽器進(jìn)行的處理劝萤。
    目前大部分瀏覽器對HSTS的支持已經(jīng)相當(dāng)完美,具體各瀏覽器和版本的支持情況可以在這里上查看慎璧。 但是HSTS是有缺陷的床嫌,第一次訪問網(wǎng)站的客戶端,HSTS并不工作胸私。 要解決這個問題厌处,就需要我們下面要講解的HSTS preload list。它是一個站點(diǎn)的列表岁疼,并通過硬編碼寫入 Chrome 瀏覽器中阔涉,列表中的站點(diǎn)將會默認(rèn)使用 HTTPS 進(jìn)行訪問,此外捷绒,F(xiàn)irefox 瑰排、Safari 、IE 11 和 Edge 也同樣用一份 HSTS 站點(diǎn)列表暖侨,它申請加入需要一些條件:
  • 有一張有效的證書(如果是使用了 SHA-1 證書簽名算法的必須在 2016 年前失效)
  • 重定向所有的 HTTP 流量到 HTTPS ( HTTPS ONLY )
  • 全部子域名的流量均通過 HTTPS 椭住,如果子域名的 www 存在的話也同樣需要通過 HTTPS 傳輸。
  • 在相應(yīng)的域名中輸出 HSTS 響應(yīng)頭
    1 過期時間至少大于 18 周(10886400 秒)
    2 必須聲明 includeSubdomains
    3 必須聲明 preload
    4 跳轉(zhuǎn)過去的那個頁面也需要有 HSTS 頭
    點(diǎn)擊這里開始申請字逗,申請成功后京郑,你的域名就會加入到這個列表
    ssl.png

    如果大多數(shù)瀏覽器都已經(jīng)更新到新的列表,那么針對國內(nèi)的 VPS 葫掉,不打開80端口傻挂,只打開 443 ,瀏覽器同樣會跳轉(zhuǎn)過來挖息,這樣就可以免備案了,不過好像這樣對搜索引擎就不太友好兽肤。

測試

所有這些工作完成以后套腹,我們可以對證書進(jìn)行檢測。這里是檢測地址 资铡,下面是我的域名的檢測報告电禀。

report.jpeg

如果是A+,則說明你的配置是好著的。另外這里也給出一個國內(nèi)也列一個檢測網(wǎng)站

另外上面如果覺得麻煩的話笤休,這里推薦一個別人寫的腳本,它是一個快速獲取/更新 Let's encrypt 證書的 shell script尖飞,使用該腳本可以簡化上面的流程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市政基,隨后出現(xiàn)的幾起案子贞铣,更是在濱河造成了極大的恐慌,老刑警劉巖沮明,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辕坝,死亡現(xiàn)場離奇詭異,居然都是意外死亡荐健,警方通過查閱死者的電腦和手機(jī)酱畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來江场,“玉大人纺酸,你說我怎么就攤上這事≈贩瘢” “怎么了餐蔬?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長在张。 經(jīng)常有香客問我用含,道長,這世上最難降的妖魔是什么帮匾? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任啄骇,我火速辦了婚禮,結(jié)果婚禮上瘟斜,老公的妹妹穿的比我還像新娘缸夹。我一直安慰自己,他們只是感情好螺句,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布虽惭。 她就那樣靜靜地躺著,像睡著了一般蛇尚。 火紅的嫁衣襯著肌膚如雪芽唇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天取劫,我揣著相機(jī)與錄音匆笤,去河邊找鬼。 笑死谱邪,一個胖子當(dāng)著我的面吹牛炮捧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惦银,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼咆课,長吁一口氣:“原來是場噩夢啊……” “哼末誓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起书蚪,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤喇澡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后善炫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撩幽,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年箩艺,在試婚紗的時候發(fā)現(xiàn)自己被綠了窜醉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡艺谆,死狀恐怖榨惰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情静汤,我是刑警寧澤琅催,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站虫给,受9級特大地震影響藤抡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抹估,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一缠黍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧药蜻,春花似錦瓷式、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踱卵,卻和暖如春廊驼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惋砂。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工妒挎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人班利。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像榨呆,于是被迫代替她去往敵國和親罗标。 傳聞我的和親對象是個殘疾皇子庸队,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容