背景
我不知道有多少人是在自己的服务器上部署Hexo博客服务的,反正我是这样的。最早是因为github在国内访问有点太慢了,国内的pages服务又还没有出来,刚好自己在云服务上有一台用来玩的服务器,所以就直接部署上去。虽然后面国内的pages的也有了,但也懒得再迁移过去了。但是自己的服务器上部署Hexo有几个问题,就是数据同步问题。用过Hexo的人都知道,hexo是在我们自己的电脑写博文,然后生成静态文件,然后再将public目录发布出去。如果是用pages,只需要push上去就行了,如果是在自己的服务器中,就需要先登录到服务器,然后pull,想想都麻烦。
解决方案
以前我都是用Rsync,配置麻烦,用起来也不是不方便,不过因为一年也没写几次博文,也懒得折腾了。最近工作有变动,想着把划水的时间用来看书写博文,所谓工欲善,必先利其器,所以准备把整个博客系统弄完整一点。
通过上图,大家能知道我的整个博客系统的部署情况以及实现哪些功能。
有三个东西:
- Nginx,使用它的反向代理功能,来实现请求转发
- 一个是我的hexo博客源码(不是生成文件)
- Hexo-Manager管理系统(我自己用写的一个Hexo管理系统)
Nginx配置
在整体架构图中,我的服务器有两个服务,一个是基于Hexo的博客服务,一个是用于管理Hexo的Hexo-Manager服务。而我希望blog.robinwu.com的请求到博客系统,而manager.robinwu.com的请求到Hexo-Manager服务。我原来用nodejs的时候,用express可以很好的解决这个问题,但是用java写hexo-manager的时候,却没有找到比较好的方式,而且把两个服务分开会比较好,毕竟当Hexo-Manager挂掉后,我还是希望博客服务可以继续可用。
Nginx是一个高性能的HTTP和反向代理web服务器,所以我部署了一个Nginx在服务器上,用于请求转发。
安装Nginx
在mac和linux上安装Nginx还是比较简单,至于windows,因为我没有安装过,所以大家如果相应需求,可以自行gogole下。
mac上安装
brew install nginx
linxu安装
yum install nginx
配置反向代理
在安装完Nginx后,我们需要修改配置文件。
在linux中,配置文件路径为/etc/nginx/nginx.conf。
在mac中,配置文件路径为/usr/local/etc/nginx/nginx.conf。
client_max_body_size 20m; #上传文件大小限制为20M
server {
listen 80 default_server;
server_name *.robinwu.com; # 域名
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
if ($http_host ~* "^(.*?)\.robinwu\.com$") {
set $domain $1;
}
location / {
if ($domain ~* "www") {
root /usr/share/nginx/BlogSource/public; #Hexo生成目录路径
}
if ($domain ~* "blog") {
root /usr/share/nginx/BlogSource/public;
}
if ($domain ~* "") {
root /usr/share/nginx/BlogSource/public;
}
if ($domain ~* "manager") {
proxy_pass http://localhost:8080; #Hexo-Manager的本地服务地址
root index;
}
tcp_nodelay on;
proxy_read_timeout 300; #设置代理读超时时间为5分钟,必现上传文件超时报错
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
上面的配置文件,就是我服务器上Nginx的配置项,有几个东西需要注意下:
client_max_body_size 20m;
这个配置项使用来配置上传文件大小,如果超过这个值,Nginx就会报错,我在Hexo-Manager也相应做了这个限制。*server_name .robinwu.com;
域名,可以根据自己的情况进行修改**if (") **
我需要让Nginx根据blog和manager的前缀进行转发请求,所以这个正则是用来获取这个前缀的root /usr/share/nginx/BlogSource/public;
配置Hexo的生成文件地址,这个路径必须是Nginx有权限的,所以建议跟我一样,直接放到Nginx的目录下proxy_read_timeout 300;
Nginx到Hexo-Manager的转发请求是有超时时间的,为了避免上传文件超时,所以我将这个值配置为300S
hexo博客源码
hexo需要用ssh的方式clone到服务器上,建议目录为/usr/share/nginx/,因为这样就不需要再配置Nginx的访问权限了。
Hexo-Manager部署
在开发Hexo-Manager的时候,我也不知道其他人是否也有这个需求,但是我还是尽量将大部分配置弄成可自定义的,附件大小除外,因为我想如果一个附件需要超过20M,还是在其他平台上传后,再复制到文档中会比较好。
配置Hexo-Manager
Hexo-Manager的所有的配置都写在/data/hexo-manager/config.json中
{
"userName":"登录的用户名",
"passWord":"登录的密码",
"hexo.root.dir.path":"/Users/robinwu/Documents/Blog/BlogSource/",
"hexo.posts.dir.path":"/Users/robinwu/Documents/Blog/BlogSource/source/_posts/",
"hexo.drafts.dir.path":"/Users/robinwu/Documents/Blog/BlogSource/source/_drafts/",
"oss.access.key.id":"",
"oss.access.key.secret":"",
"oss.endPoint":"",
"oss.bucketName":"",
"wechat.appId":"",
"wechat.secret":"",
"blog.url":"http://localhost"}
几个配置项我解释下:
userName和passWord
hexo-manager是有登录功能,毕竟是部署在外网的,所以需要账号密码hexo.root.dir.path
用来配置Hexo在服务器上的相关路径,记得最后面的/oss
是用来配置阿里云的参数的,目前来说一定要设置,如果有朋友不需要,可以跟我说私信或者在简书评论,我可以做成可配置的,或者直接自己拿代码改,后续我会把代码开源wechat
是用配置微信公众号,目前来说没用,可以不填,因为我发现我的订阅号是个人的,无法认证,也就无法自动发布博文,所以写一半就没有继续写了blog.url
是用来从hexo-manager的文档列表跳转到具体博文页面的
部署Hexo-Manager
下载安装包:hexo-manager.zip
安装包中有下面几个文件:
config.json 为配置文件
hexo-manager-0.0.1-SNAPSHOT.jar 是具体的应用程序
run.sh 当应用程序上传到服务器上后,到具体目录,就可以运行此文件启动或者直接运行
nohup java -jar -Djava.security.egd=file:/dev/./urandom hexo-manager-0.0.1-SNAPSHOT.jar > access.log 2>&1 &
解释下启动命令
nohup和最后&
配合使用,让程序在后台运行,避免你退出后,程序也退出了,注意需要用exit来退出服务器java -jar
启动jar程序-Djava.security.egd=file:/dev/./urandom
我用UUID来生成登录凭证,但是有时候这个过程会很慢,所以配置这个,让生成过程快点。> access.log 2>&1
让程序的命令行输出都到access.log文件中
使用Hexo-Manager
登录界面
当你没有登录的时候,访问manager.robinwu.com的时候,都会跳转登录界面
Hexo管理界面
登录过后,就会跳转到Hexo管理页面
有几个功能:
- git同步,当上传代码的git仓库,可以通过这个按钮可以让你服务器上的的Hexo代码进行git同步
- clean,用来清除你服务器上的Hexo的生成文件,也就public目录,具体命令为hexo clean
- 生成静态文件,用来让你服务器的上的Hexo生成静态文件或者刷新,具体命令为hexo generate
Posts页面
该页面会展示你Hexo的_posts目录里面的文件,并且提供相应的连接可以跳转到具体博文页面、简书的编辑页、微信公众号的管理页面,后面这两个没啥用,加进去是让自己方便点,记得同步到简书和微信公众号
Drafts页面
该页面会展示你Hexo的_draft目录里面的文件
上传附件页面
该页面可以用来上传服务,上传文件后,会返回一个url显示在页面上
总结
每次做完以前想做的事情后,就会觉得好像就这样,没啥了不起的,也没啥成就感,远远比不上过程中的充实。Hexo-Manager满足我很早以前想要的git同步、hexo生成以及附件功能,但缺少了简书同步和微信公众号的同步,有些遗憾。我也不知道有多少人会有和我同样的需求,希望对一些同道中人有些帮助吧。