因为之前的SSD更换资料丢失原因, 许多hexo的文章也丢了, 这次借着换云主机(VPS)就重写一下关键的
hexo部署顺便可以加深对
gitpage机制的理解. 另外如果是主机迁移推荐使用Docker打包好, 这样一键迁移Nginx相关再也无需配置
0x00. 环境准备
首先需要对Git服务有个比较好的了解, 包括.git的文件大致作用, git hook原理,以及Linux的用户组SSH生成/权限,nginx基本使用,安装git/nginx环境等. 这里就不说明了, 请自行查阅. 后面默认已了解这些前置知识. (不单独说什么生成公私钥之类)
就算只是简单理解这些原理,你hexo部署上出了什么问题,也都比较快的定位(papa).
下面说一下核心的部署思路, 再来动手, 我们根本需要是让hexo 能独立部署在我们自己的服务器上, 然后对外提供访问, 两条路:
- 原生搭建环境, 主要需要
git+nginx, 优点是写好文档简单好上手, 缺点是每次需要重新部署. 修改配置, 安全性低 - 使用Docker容器化封装, 优点是一键迁移, 安全性高. 缺点是构建镜像有较高的成本.
然后两种方式我都尝试一下吧, 因为 git/nginx 都是典型的无状态应用, 所以更倾向于使用 Docker 来构建, 当然自己部署网站, 性能和安全性自然也是很需要考虑的事, 包括后续启用的HTTP2等
更新: 考虑到海外 VPS 访问速度可能很不友好, 目前更新为双线部署, 然后 DNS 解析的时候自动区分国内/外, 以及负载均衡 (但是这样国内服务器 80 默认需要单独备案, 否则会被云厂商 ban 掉, 443 能活多久也不好说, 请特别注意这个问题.)
0x01. 自建git仓库
为什么要配置一个git 仓库呢? 因为我们 hexo 的生成的html文件, 本质是传输到 git 仓库上做版本控制的, 然后再给前端去渲染展示, 所以每次hexo deploy就是执行git push 文件到这个指定仓库, 具体步骤如下:
创建一个专属git用户.(这步不建议省. 不建议直接用
root, 不安全)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# 初始化 git 用户
adduser git
# 1. 切换git用户, 然后创建~/.ssh文件夹, 修改默认权限
su - git
mkdir .ssh && chmod 700 .ssh
# 2. 创建 auth 文件, 修改默认权限
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
# 3. 修改默认的ssh端口为五位数, 并禁止密码/root登录(必须)
# 可从[Masscan常扫端口](https://paper.seebug.org/1052/#top)
# 比如改成51234, 然后
sed -i 's/^.*Port.*/Port 51234/g' /etc/ssh/sshd_config \
&& sed -i 's/^.*PasswordAuthentication.*/PasswordAuthentication no/g' /etc/ssh/sshd_config \
&& sed -i 's/^.*PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config \
# 允许root登录可选, 我觉得可以允许, 目前设置的yes, 拒绝设置no
# 3.2 切换回root (多开一个terminal)
# 下面都用root执行
# ubuntu记得开放新的端口
ufw allow 51234/tcp
# 4. 在root权限下,关闭git的shell权限,以及禁止密码登录 (必须)
vi /etc/passwd
# 修改git的一行为如下,就是修改了原本的bash为git-shell.
git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell
# 成功设置后, 你直接用git用户ssh登录会提示如下
fatal: Interactive git shell is not enabled.
# 注: 如果你发现修改后无法ssh验证通过, 可尝试使用↓, 或者不关闭ssh权限.
git:x:1000:1000:,,,:/home/git:/usr/sbin/nologin添加你本机PC到服务器的SSH认证
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 1. 建议通过命令传输追加, 更稳妥(不过建议第二次开始用)
ssh-copy-id -i ~/.ssh/hexo.pub -p port git@serverIP
# 1.2 也可以手动去添加, 比较原生, 但是不建议vi然后复制(容易出错)
echo "publicKeyxxx" >> .ssh/authorized_keys
# 2. VPS主机验证是否添加
cat /home/git/.ssh/authorized_keys
# 2.1 重启ssh服务
systemctl restart sshd # ssh
# 2.2 本地PC验证ssh是否联通
ssh -T -p port git@serverIP测试SSH正常后,关闭git用户ssh的shell权限. 然后初始化一个git仓库比如
/var/repo/hexo.git1
2
3
4
5
6
7
8
9# 1. 创建git仓库目录,和钩子文件(原本post-receive可能不存在)
mkdir /var/repo && cd /var/repo && git init --bare hexo.git
# 2. 写入钩子内容, 然后给执行权限(必要)
vi hexo.git/hooks/post-receive # 内容见4
chmod +x hexo.git/hooks/post-receive && chown -R git:git hexo.git
# 3. 创建fe目录 (nginx访问)
mkdir -p /var/www/hexo && chown -R git:git /var/www/hexo && chmod -R 755 /var/www/hexo最后在.
git/hooks/post-receive写了个临时的脚本,简单说就是两个杯子换水的办法, 引入中介.最后chmod +x post-receive加执行权限. 以及修改git仓库和网站目录用户组权限. (钩子内容如下)
1 |
|
2021.4更新: 首先, 看到不少同学人云亦云的去修改/etc/sudoers 给 git 用户加上免密root权限, 说是因为后续部署会提示没权限, 当然是不需要且非常不合理的做法, 请勿使用..
0x02.配置Nginx + HTTPS
Nginx的结构比较经典的主从, 一个master进程和多个worker进程搭配, 默认这些进程都是单线程的.master负责处理配置, 管理woker, 写日志等;而worker自然是工作的小兵, 处理client发来的请求. 所以它有不少的配置优化点
2021.4更新: 如果每年会迁移一次服务器的话, 建议还是容器化 Nginx 到私库, 然后自己可以一键迁移, 如果手动, 请务必保存文件到本地文件夹汇总
1. 配置Ngingx
1 | # Ubuntu安装必备软件 |
然后默认 nginx 采用的配置方式是: 公用配置文件 + 私有配置文件(优先级更高), 也推荐这样使用, 好处是多个应用不耦合, 关系清晰
先配置一下公用的配置文件/etc/nginx/nginx.conf, 这里设置一系列通用的nginx优化项, 对网站性能/安全影响最明显, 有些配置和私有重复是因为怕私有漏写了.
1 | user www-data; |
正向代理隐藏真实客户端,反向代理隐藏真实服务端
2. HTTPS访问 + 安全策略
这里顺便配置一下CA证书实现 https + http2 + http 兼容访问, 以腾讯云/网易云这种免费1年解析为例(到期一键续期), 虽然他们不支持泛解析二级域名, 但是你无需申请两个SSL证书, 比如imbajin.com 和www.imbajin.com ,自己做个转发/重定向. www也会默认使用顶级域名的证书.
当然建议使用Docker容器的nginx去运行.然后顺便把之前的步骤包到容器内(就像gogs的docker版一样.) 之后补充. 配置主要如下:
1 | # vi /etc/nginx/sites-available/default # Ubuntu下默认apt安装路径 |
特别注意 : 因为这样做重定向是一个死循环, 所以网页必须先存在, 否则你直接访问空的页面, 会不断进行调整.
然后如果更换了主机IP, 记得同时更换域名解析里的@-A记录. 以及www-A 记录. (10min内生效)
3. Hexo配置
最后更换hexo 配置文件的地址, 当然我强烈建议使用config 给一个别名, 然后无需替换任何字符, 只需要修改config文件就行. (这样方便复用)
1 | #配置例如 |
最后建议清理一次, hexo clean && hexo g -d 测试一下, 不行开启hexo deploy --debug 看看细节(为了避免第一次初始化太慢, 建议先参考QA清理一次记录.) 如果实在太大, 也可以拷贝之前机器的目录:
1 | # 方法1: 推荐优先尝试 (网络正常情况) |
图简单可以直接使用最新的Nginx官方镜像docker pull nginx. (当然如果追求极致可使用极简版自行diy)
0x03.监控报警(可选)
因为其实很多云主机绝大部分资源都是空闲的,为了提高系统完善性,加个基本的监控+报警的定时任务我觉得还是可行的,毕竟这些以后很多地方用的上,建议早用积累shell经验.
因为默认http访问会触发301重定向,所以判断80/443端口的可用性,还不能单纯的使用http状态码.
待补…
0x04. HTTP2/3
HTTP2从性能, 安全性等方面都相对HTTP1做了很大的改变, 自然是个很大的变动, 以前没有启用是考虑到一系列的兼容和稳定性/支持原因.
现在时机也成熟了, 之后会考虑在新版Nginx开启HTTP2. nginx1.18 之后也默认自带了 http2模块, 无需手动编译, 你可以通过/usr/sbin/nginx -V | grep http_v2 来确认是否开启.
虽然一直很懒, 2022年也终于开启了 HTTP2 的支持, 配置文件相关更新如下, 不过由于网站混杂了一些 http, 所以要特别注意, 因为现在绝大部分默认的 HTTP2 都是需要和 https 绑定的, 这样一旦切换到 http, 就会 HTTP2 报错
意事项
1 | # https for imbajin.com |
这里涉及到一些内核参数的优化, 但是我目前没搞清楚原理, 先不急着调, 默认是/etc/sysctl.conf, BBR也会在这记录
1 | #如果想把timewait降下了就要把tcp_max_tw_buckets值减小,默认是180000 |
未完待续, 也许等HTTP3普及一些再换2?
0x0n.QA
首先注意自建Git服务可能有安全问题,注意git的版本(比如默认的很低,可能有漏洞).不然可能会构成git远程执行漏洞. 参考待补.
其次注意Nginx可能有一个比较蛋疼的缓冲区大小问题,详见我[GIT排错最后](../2018-05-25-Git-flow与常见问题#3.Hexo部署时提示The remote end hung up unexpectedly) . 其实后面我发现根本原因是因为hexo频繁推送使用后的.deploy_git/.git文件夹过大(500MB) . 为什么过大呢? 这个之后会在git排查文章里单独补充… 因为如果精确处理,还是很麻烦的.
简单可以直接到.deploy_git文件夹, 然后git gc --prune=now
不过最简单的办法就是你先把 .deploy 整个文件夹复制到另外的目录,让hexo重新生成一次,就是几乎全新的仓库历史了. hexo文章的更新历史其实也没什么用.你需要的时候再把之前备份的替换就行.
关于Chrome/Edge下强制HTTPS 静态资源和其它问题, 详见下一篇