发表日期:2017-02 文章编辑:小灯 浏览次数:2360
过完年来想把博客做一个迁移,放到自己购买的服务器上,并实现�自动化部署,并启用全站HTTPS
这一步骤网上有很多教程,这里不再多说了
大体的流程就是,我们通过hexo g
命令在本地生成静态文件以后,通过git push到我们的远程仓库(这里我用的是GitHub),然后由于我们事先在项目库中配置了webhooks,由它post到你的服务器一个请求链接,我们的服务器收到请求后,对应执行我们提前写好的脚本,再将push的内容同步到我们的服务器,从而更新了服务器的内容。
我们通过ssh(windows用户可以通过putty登录)登录到我们的服务,我这里用的是Ubuntu系统,安装好nodejs,git,nginx后,将我们的文件从远程仓库拉下来
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
这样一来,仓库的配置就算好了,接下来看服务器端如何响应
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服务,监听8246端口。
当请求过来的url完全匹配的时候,执行deploy.sh。
再新建一个deploy.sh文件处理部署相关脚本
git pull origin master
node ./webhooks.js
如果你使用上面的命令运行nodejs服务,nodejs服务会在前台运行,可以使用pm2使nodejs运行在后台。
安装
npm install pm2 -g
启动服务
pm2 start webhooks.js
停止服务
pm2 stop webhooks.js
重启服务
pm2 restart webhooks.js
另外我们也可以实时查看pm2的日志服务
pm2 logs
到此为止我们的自动化部署就全部完成了,以后我们只需在本地将文件push到远程仓库,就会自动同步到我们的服务器上
这里简单总结下在 Nginx 配置 HTTPS 服务器:主要签署第三方可信任的证书和配置HTTPS
SSL证书需要向国际公认的证书证书认证机构(简称CA,Certificate Authority)申请。
CA机构颁发的证书有3种类型:
关于证书服务,市面上大体的都是收费的证书,当然也有部分是免费的,比如Let's Encrypt刚刚又拍云也上线了免费的 SSL 证书,另外StartSSL也提供免费证书,有效期3年;另外还有腾讯云和阿里云都有相关的免费证书,这里我使用的是Let's Encrypt ,这也是目前最知名的开源SSL证书。
申请 Let's Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。Let's Encrypt 的证书签发过程使用的就是 ACME 协议,这里也推荐一个小工具就是acme-tiny,它可以帮助我们简化创建证书的流程。
mkdir ssl cd ssl openssl genrsa 4096 > account.key
openssl genrsa 4096 > domain.key
接下来就可以生成我们的证书文件了,单个域名和多个域名生产的参数还不太一样.
//单个域名 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
mkdir ~/www/challenges/
然后配置一个 HTTP 服务,以 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 以及验证目录,在ssl目录下执行脚本
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /root/www/challenges/ > ./signed.crt
如果一切正常,当前目录ssl下就会生成一个 signed.crt,这就是申请好的证书文件。
这里遇到一个错误,大致如下:
ValueError: Wrote file to /root/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yuxingxin.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg
网上查了一些方案,觉得有一个比较靠谱,也得到了解决,大致就是原来库做了一个验证导致有些情况通不过,这里有人fork源库修改了部分代码,地址在这里,如果出现上述错误,可以获取这个库的脚步然后在执行上面那条命令。
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 / { # 这里要改成自己存放博客静态网页的目录 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 签发的证书只有 90 天有效期,推荐使用脚本定期更新
创建脚本文件并赋予执行权限
mkdir shell cd shell vi renew_cert.sh
并复制下面内容
#!/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来定时执行任务,它是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。
执行
crontab -e
然后 添加如下内容
0 0 1 * * /root/shell/renew_cert.sh >/dev/null 2>&1
这样以后证书每个月都会自动更新,一劳永逸。
另外这里也推荐一个网站,可以监测你的证书的有效期
https://letsmonitor.org
这样的话就算完了,但是这里有几点做说明
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
#另外还有两种其他的配置方式,可以自行Googlelocation / { return 301 https://$host$request_uri; }
所有这些工作完成以后,我们可以对证书进行检测。这里是检测地址 ,下面是我的域名的检测报告。
另外上面如果觉得麻烦的话,这里推荐一个别人写的脚本,它是一个快速获取/更新 Let's encrypt 证书的 shell script,使用该脚本可以简化上面的流程。
日期:2018-04 浏览次数:6658
日期:2017-02 浏览次数:3340
日期:2017-09 浏览次数:3537
日期:2017-12 浏览次数:3425
日期:2018-12 浏览次数:4677
日期:2016-12 浏览次数:4468
日期:2017-07 浏览次数:13540
日期:2017-12 浏览次数:3385
日期:2018-06 浏览次数:4162
日期:2018-05 浏览次数:4346
日期:2017-12 浏览次数:3466
日期:2017-06 浏览次数:3889
日期:2018-01 浏览次数:3836
日期:2016-12 浏览次数:3805
日期:2018-08 浏览次数:4331
日期:2017-12 浏览次数:3592
日期:2016-09 浏览次数:6283
日期:2018-07 浏览次数:3107
日期:2016-12 浏览次数:3125
日期:2018-10 浏览次数:3281
日期:2018-10 浏览次数:3370
日期:2018-09 浏览次数:3463
日期:2018-02 浏览次数:3484
日期:2015-05 浏览次数:3415
日期:2018-09 浏览次数:3209
日期:2018-06 浏览次数:3334
日期:2017-02 浏览次数:3778
日期:2018-02 浏览次数:4234
日期:2018-02 浏览次数:4038
日期:2016-12 浏览次数:3481
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.