亚马逊AWS服务器上搭建独立的Hexo个人博客

最近使用Hexo在Github上部署了个人博客,个人博客地址,使用Hexo部署很方便,写作用markdown语法,本地html全站静态化构建,一条命令直接部署到github上,相当方便,但是有1个问题,就是百度无法收录 Github Pages网站的内容,因为Github把百度爬虫给屏蔽了,正好手上有1个aws服务器,就想着把博客部署到aws也不错,反正一年的免费,其他的云主机(阿里云、腾讯云)都类似,只要是一台独立的主机(VPS即可),那么开始吧!

hexo本地部署

不管怎么样,先在本地跑起来再说

安装hexo

本地需要有 node 环境,全局安装 hexo-cli

1
npm i hexo-cli g

hexo初始化项目

假如需要在D盘新建一个 blog 项目

1
2
3
4
5
6
7
8
9
cd d
# 初始化hexo项目
hexo init blog
# 安装npm依赖
npm i
# 启动hexo,hexo在初始化的时候会自动新建一篇 hello hexo的md文档,在/source/_posts 目录下
hexo s
# 或者以debug模式启动,文章修改后hexo自动重新编译
hexo s --debug

其他hexo的相关配置自行上官网查看即可,不难 hexo文档

aws服务器配置

我在aws的服务器安装的是Ubuntu 16.04,其他系统差不多,反正就是安装一个nginx

安装nginx
1
2
3
4
# 更新源
sudo apt-get update
# 安装nginx
sudo apt-get install nginx
nginx在ubuntu下的配置

很简单在ubuntu上安装好了nginx,配置nginx的系统开机启动和命令
以下参考的Ubuntu 16.04安装Nginx

1
2
3
4
# nginx默认配置文件目录
/etc/nginx
# nginx默认网站文件目录
/var/www/html

配置nginx软连接

1
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

配置开机启动

1
2
cd /etc/init.d
sudo vi nginx

复制以下内容到上述文件

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/bin/sh

### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx

# Include nginx defaults if available
if [ -r /etc/default/nginx ]; then
. /etc/default/nginx
fi

STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"

test -x $DAEMON || exit 0

. /lib/init/vars.sh
. /lib/lsb/init-functions

# Try to extract nginx pidfile
PID=$(cat /usr/local/nginx/conf/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
if [ -z "$PID" ]; then
PID=/run/nginx.pid
fi

if [ -n "$ULIMIT" ]; then
# Set ulimit if it is set in /etc/default/nginx
ulimit $ULIMIT
fi

start_nginx() {
# Start the daemon/service
#
# Returns:
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
$DAEMON_OPTS 2>/dev/null \
|| return 2
}

test_config() {
# Test the nginx configuration
$DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
}

stop_nginx() {
# Stops the daemon/service
#
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
RETVAL="$?"
sleep 1
return "$RETVAL"
}

reload_nginx() {
# Function that sends a SIGHUP to the daemon/service
start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME
return 0
}

rotate_logs() {
# Rotate log files
start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME
return 0
}

upgrade_nginx() {
# Online upgrade nginx executable
# http://nginx.org/en/docs/control.html
#
# Return
# 0 if nginx has been successfully upgraded
# 1 if nginx is not running
# 2 if the pid files were not created on time
# 3 if the old master could not be killed
if start-stop-daemon --stop --signal USR2 --quiet --pidfile $PID --name $NAME; then
# Wait for both old and new master to write their pid file
while [ ! -s "${PID}.oldbin" ] || [ ! -s "${PID}" ]; do
cnt=`expr $cnt + 1`
if [ $cnt -gt 10 ]; then
return 2
fi
sleep 1
done
# Everything is ready, gracefully stop the old master
if start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PID}.oldbin" --name $NAME; then
return 0
else
return 3
fi
else
return 1
fi
}

case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
start_nginx
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
stop_nginx
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
restart)
log_daemon_msg "Restarting $DESC" "$NAME"

# Check configuration before stopping nginx
if ! test_config; then
log_end_msg 1 # Configuration error
exit $?
fi

stop_nginx
case "$?" in
0|1)
start_nginx
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
reload|force-reload)
log_daemon_msg "Reloading $DESC configuration" "$NAME"

# Check configuration before stopping nginx
#
# This is not entirely correct since the on-disk nginx binary
# may differ from the in-memory one, but that's not common.
# We prefer to check the configuration and return an error
# to the administrator.
if ! test_config; then
log_end_msg 1 # Configuration error
exit $?
fi

reload_nginx
log_end_msg $?
;;
configtest|testconfig)
log_daemon_msg "Testing $DESC configuration"
test_config
log_end_msg $?
;;
status)
status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
;;
upgrade)
log_daemon_msg "Upgrading binary" "$NAME"
upgrade_nginx
log_end_msg $?
;;
rotate)
log_daemon_msg "Re-opening $DESC log files" "$NAME"
rotate_logs
log_end_msg $?
;;
*)
echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2
exit 3
;;
esac

1
2
3
4
5
# 设置服务脚本有执行权限
sudo chmod +x /etc/init.d/nginx
# 注册自启动服务
cd /etc/init.d/
sudo update-rc.d nginx defaults

配置完成后,系统就有了nginx开机启动服务,并且有以下的命令:

1
sudo service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

服务器上建立放博客文件的仓库
1
2
3
4
5
6
7
8
9
10
# aws安装的ubuntu系统默认使用ubuntu用户登陆,并且使用的pem密匙登陆
# 正常情况下,你能使用ssh免密登陆aws
# 创建blog.git仓库,目录可随意
cd /home/ubuntu
mkdir git
cd git
git init -bare blog.git
# 使用ubuntu用户对git仓库进行授权
# 因为我们默认可以使用ubuntu用户进行ssh登陆
chown -R ubuntu:ubuntu blog.git
本地配置SSH访问git仓库
  • 在本地的.ssh目录下新建config文件,windows 10应该在
    C:\Users\username\.ssh
  • 手动新建config文件,输入以下内容
    1
    2
    3
    4
    Host 1.2.3.4 #aws的ip地址
    HostName 1.2.3.4 #aws的ip地址
    User ubutu #默认登陆aws的用户
    IdentityFile C:/Users/Mr.Li/.ssh/aws.pem #aws分配的pem登陆密匙文件

如此这般之后,我们可以测试是否可以是否可以管理刚刚新建的git仓库

1
2
# ubuntu为登陆用户名,路径为刚刚服务器新建的git参路绝对路径
git clone ubuntu@aws ip地址:/home/ubuntu/git/blog.git

服务器git仓库设置

测试ok之后,我们还要关键一下关联的git仓库文件与nginx的静态文件

1
2
3
4
cd /home/ubuntu/git/blog.git
cd hooks
# 创建post-receive钩子,在git仓库文件更新后会自动更新nginx下的静态文件
vi post-receive

粘贴以下内容进去

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 清除原nginx目录文件
sudo rm -rf /var/www/html
# 把git仓库的文件复制到nginx的目录文件下
sudo git clone /home/ubuntu/git/blog.git /var/www/html
# 重启nginx
sudo service nginx force-reload
# 给予post-receive钩子运行权限,我这里给的是777权限
chmod +x post-receive

hexo本地一键部署设置

安装部署依赖
1
npm i hexo-deployer-git -S
hexo部署设置

打开本地的blog项目的config文件(_.config.yaml)

1
2
3
4
5
6
7
8
# 在文件的最后输入以下配置
# hexo部署支持多个git仓库同时部署
# github pages 的配置可自行搜索,很简单
deploy:
type: git
repo:
github: git@github.com:xiechao1211/xiechao1211.github.io.git
aws: ubuntu@aws的ip地址:/home/ubuntu/git/blog.git

部署
1
2
# hexo可以一键自动生成并部署到git
hexo g -d

现在用aws的ip地址打开,可以看到你的博客了
完成!!!