最近使用Hexo在Github上部署了个人博客,个人博客地址,使用Hexo部署很方便,写作用markdown语法,本地html全站静态化构建,一条命令直接部署到github上,相当方便,但是有1个问题,就是百度无法收录 Github Pages网站的内容,因为Github把百度爬虫给屏蔽了,正好手上有1个aws服务器,就想着把博客部署到aws也不错,反正一年的免费,其他的云主机(阿里云、腾讯云)都类似,只要是一台独立的主机(VPS即可),那么开始吧!
hexo本地部署
不管怎么样,先在本地跑起来再说
安装hexo
本地需要有 node 环境,全局安装 hexo-cli1
npm i hexo-cli g
hexo初始化项目
假如需要在D盘新建一个 blog 项目1
2
3
4
5
6
7
8
9cd 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 | # 更新源 |
nginx在ubuntu下的配置
很简单在ubuntu上安装好了nginx,配置nginx的系统开机启动和命令
以下参考的Ubuntu 16.04安装Nginx1
2
3
4# nginx默认配置文件目录
/etc/nginx
# nginx默认网站文件目录
/var/www/html
配置nginx软连接1
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
配置开机启动1
2cd /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
### 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 | # 设置服务脚本有执行权限 |
配置完成后,系统就有了nginx开机启动服务,并且有以下的命令:1
sudo service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}
服务器上建立放博客文件的仓库
1 | # aws安装的ubuntu系统默认使用ubuntu用户登陆,并且使用的pem密匙登陆 |
本地配置SSH访问git仓库
- 在本地的.ssh目录下新建config文件,windows 10应该在
C:\Users\username\.ssh - 手动新建config文件,输入以下内容
1
2
3
4Host 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
4cd /home/ubuntu/git/blog.git
cd hooks
# 创建post-receive钩子,在git仓库文件更新后会自动更新nginx下的静态文件
vi post-receive
粘贴以下内容进去1
2
3
4
5
6
7
8
9
# 清除原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 | # hexo可以一键自动生成并部署到git |
现在用aws的ip地址打开,可以看到你的博客了
完成!!!