為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2017-02 文章編輯:小燈 瀏覽次數(shù):2456
過完年來想把博客做一個(gè)遷移,放到自己購買的服務(wù)器上,并實(shí)現(xiàn)?自動(dòng)化部署,并啟用全站HTTPS
這一步驟網(wǎng)上有很多教程,這里不再多說了
大體的流程就是,我們通過hexo g
命令在本地生成靜態(tài)文件以后,通過git push到我們的遠(yuǎn)程倉庫(這里我用的是GitHub),然后由于我們事先在項(xiàng)目庫中配置了webhooks,由它post到你的服務(wù)器一個(gè)請(qǐng)求鏈接,我們的服務(wù)器收到請(qǐng)求后,對(duì)應(yīng)執(zhí)行我們提前寫好的腳本,再將push的內(nèi)容同步到我們的服務(wù)器,從而更新了服務(wù)器的內(nèi)容。
我們通過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
/etc/nginx
)/etc/nginx/conf.d/
目錄下添加配置文件blog.conf.conf
vim /etc/nginx/conf.d/blog.conf
然后配置上我們的域名,端口和映射地址
server { listen 80;#修改這里為其他端口如8081 server_nameyuxingxin.com www.yuxingxin.com; # 這里是你的域名 location / { root /root/blog/; #修改這里的路徑為自己的路徑 indexindex.html index.htm; } }
然后重啟nginx通過域名就可以訪問我們的博客了
nginx -s reload
http://xxxxx.com:8246/webhooks/push/deploy
這樣一來,倉庫的配置就算好了,接下來看服務(wù)器端如何響應(yīng)
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)
這段代碼就能啟動(dòng)一個(gè)nodejs服務(wù),監(jiān)聽8246端口。
當(dāng)請(qǐng)求過來的url完全匹配的時(shí)候,執(zhí)行deploy.sh。
再新建一個(gè)deploy.sh文件處理部署相關(guān)腳本
git pull origin master
node ./webhooks.js
如果你使用上面的命令運(yùn)行nodejs服務(wù),nodejs服務(wù)會(huì)在前臺(tái)運(yùn)行,可以使用pm2使nodejs運(yùn)行在后臺(tái)。
安裝
npm install pm2 -g
啟動(dòng)服務(wù)
pm2 start webhooks.js
停止服務(wù)
pm2 stop webhooks.js
重啟服務(wù)
pm2 restart webhooks.js
另外我們也可以實(shí)時(shí)查看pm2的日志服務(wù)
pm2 logs
到此為止我們的自動(dòng)化部署就全部完成了,以后我們只需在本地將文件push到遠(yuǎn)程倉庫,就會(huì)自動(dòng)同步到我們的服務(wù)器上
這里簡單總結(jié)下在 Nginx 配置 HTTPS 服務(wù)器:主要簽署第三方可信任的證書和配置HTTPS
SSL證書需要向國際公認(rèn)的證書證書認(rèn)證機(jī)構(gòu)(簡稱CA,Certificate Authority)申請(qǐng)。
CA機(jī)構(gòu)頒發(fā)的證書有3種類型:
關(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證書。
申請(qǐng) Let's Encrypt 證書不但免費(fèi),還非常簡單,雖然每次只有 90 天的有效期,但可以通過腳本定期更新,配好之后一勞永逸。Let's Encrypt 的證書簽發(fā)過程使用的就是 ACME 協(xié)議,這里也推薦一個(gè)小工具就是acme-tiny,它可以幫助我們簡化創(chuàng)建證書的流程。
mkdir ssl cd ssl openssl genrsa 4096 > account.key
openssl genrsa 4096 > domain.key
接下來就可以生成我們的證書文件了,單個(gè)域名和多個(gè)域名生產(chǎn)的參數(shù)還不太一樣.
//單個(gè)域名 openssl req -new -sha256 -key domain.key -subj "/CN=yuxingxin.com" > domain.csr //多個(gè)域名(比如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
mkdir ~/www/challenges/
然后配置一個(gè) 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; } }
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
指定賬戶私鑰、CSR 以及驗(yàn)證目錄,在ssl目錄下執(zhí)行腳本
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /root/www/challenges/ > ./signed.crt
如果一切正常,當(dāng)前目錄ssl下就會(huì)生成一個(gè) signed.crt,這就是申請(qǐng)好的證書文件。
這里遇到一個(gè)錯(cuò)誤,大致如下:
ValueError: Wrote file to /root/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yuxingxin.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg
網(wǎng)上查了一些方案,覺得有一個(gè)比較靠譜,也得到了解決,大致就是原來庫做了一個(gè)驗(yàn)證導(dǎo)致有些情況通不過,這里有人fork源庫修改了部分代碼,地址在這里,如果出現(xiàn)上述錯(cuò)誤,可以獲取這個(gè)庫的腳步然后在執(zhí)行上面那條命令。
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem cat intermediate.pem root.pem > full_chained.pem
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; indexindex.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_page404/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來定時(shí)執(zhí)行任務(wù),它是一個(gè)可以用來根據(jù)時(shí)間、日期、月份、星期的組合來調(diào)度對(duì)重復(fù)任務(wù)的執(zhí)行的守護(hù)進(jìn)程。
執(zhí)行
crontab -e
然后 添加如下內(nèi)容
0 0 1 * * /root/shell/renew_cert.sh >/dev/null 2>&1
這樣以后證書每個(gè)月都會(huì)自動(dòng)更新,一勞永逸。
另外這里也推薦一個(gè)網(wǎng)站,可以監(jiān)測你的證書的有效期
https://letsmonitor.org
這樣的話就算完了,但是這里有幾點(diǎn)做說明
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
#另外還有兩種其他的配置方式,可以自行Googlelocation / { return 301 https://$host$request_uri; }
所有這些工作完成以后,我們可以對(duì)證書進(jìn)行檢測。這里是檢測地址 ,下面是我的域名的檢測報(bào)告。
另外上面如果覺得麻煩的話,這里推薦一個(gè)別人寫的腳本,它是一個(gè)快速獲取/更新 Let's encrypt 證書的 shell script,使用該腳本可以簡化上面的流程。
日期:2018-04 瀏覽次數(shù):6777
日期:2017-02 瀏覽次數(shù):3456
日期:2017-09 瀏覽次數(shù):3676
日期:2017-12 瀏覽次數(shù):3544
日期:2018-12 瀏覽次數(shù):4843
日期:2016-12 瀏覽次數(shù):4595
日期:2017-07 瀏覽次數(shù):13659
日期:2017-12 瀏覽次數(shù):3522
日期:2018-06 瀏覽次數(shù):4279
日期:2018-05 瀏覽次數(shù):4458
日期:2017-12 瀏覽次數(shù):3570
日期:2017-06 瀏覽次數(shù):3995
日期:2018-01 瀏覽次數(shù):3958
日期:2016-12 瀏覽次數(shù):3925
日期:2018-08 瀏覽次數(shù):4441
日期:2017-12 瀏覽次數(shù):3733
日期:2016-09 瀏覽次數(shù):6453
日期:2018-07 瀏覽次數(shù):3223
日期:2016-12 瀏覽次數(shù):3241
日期:2018-10 瀏覽次數(shù):3396
日期:2018-10 瀏覽次數(shù):3503
日期:2018-09 瀏覽次數(shù):3593
日期:2018-02 瀏覽次數(shù):3611
日期:2015-05 瀏覽次數(shù):3538
日期:2018-09 瀏覽次數(shù):3318
日期:2018-06 瀏覽次數(shù):3448
日期:2017-02 瀏覽次數(shù):3884
日期:2018-02 瀏覽次數(shù):4347
日期:2018-02 瀏覽次數(shù):4191
日期:2016-12 瀏覽次數(shù):3587
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.