在自架服务器上搭建Hexo博客并绑定域名

引言

一段时间没看博客,发现coding静态页面给的二级域名变了,而且太难看了,索性就搬到自己的服务器上,再绑定一个域名。最后再弄一个本地和服务器自动同步的功能,外加SSL。综合起来就是Hexo+Centos7+DNSPod+acme.sh


准备域名

因为coding改版,导致原来送的域名无法访问了,造成了很大的影响,其中最重要的是SEO。为了保证站点能够保留SEO的排名,准备首先申请新的域名,然后将原来百度站长和谷歌站长里面的域名转移。(转移需要新旧域名重定向,扑街)这样可以保证在网站的访问不受影响的情况下,去进行后续操作。

购买域名推荐上namesilo,他们的.com域名有的只需要八九刀一年,换算成人民币也就六十多,还是很划算的,而且还附送免费的信息保密功能和一次三天内无理由退款。不过解析速度嘛······还好能把DNS解析转到国内的DNSPod里面。

挑选域名

如果有经验的,或者可以啃英文的,可以跳过这一节。

先进入首页,点击右上角Sign up进行注册,这个看图填信息就好。

这里得吐槽一下下面那个验证码,有点难看,要拿远一点才能看得出来。

然后回到首页,接下来要挑一个顺眼的域名,可以在首页里面进行搜索。

namesilo搜索域名

比方说我搜索littlelittlewhite(没错,这个也是我之前备选之一),搜索了之后会出现一个高级搜索框。

往下滑就会显示可以购买的域名以及其价格。可以看得到,最便宜的竟然只要一刀一年,.com的也只要九刀一年。如果是灰色的,代表不能买哦。

选好了之后点add加入购物车就可以了。了解了这些,就可以开始血拼选择心仪的域名了。选好了之后点击右上角的购物车,如果出现一个这样的界面

就是问你需不需要增值服务,如果有钱的话可以随便浪,没钱的话请和我一起默默地点右下角的skip。点了之后就会跳转到付款页面。

上面的隐私保护功能推荐选我图中选的那个,然后可以填上优惠码littlewhite,可以省一刀。填好了之后点右边的submit就可以了。都弄好了之后点下面的continue付款。付款的话可以选择最后一个,即用支付宝付款。不过需要提前准备一个支付宝邮箱。如果没有的话,需要到电脑上登录网页版支付宝,然后在账户设置里面添加。

DNS解析转移

因为这个namesilo是国外的网站,服务器应该也在国外,DNS解析应该会很慢,所以选择把DNS解析转移到国内的DNSPod网站上。

首先打开域名管理页面,不好找的可以直接点我文中的链接。然后按照图中的操作。

首先按照第一步,勾选你刚刚买的域名,然后点击第二步上面的按钮,进去填信息。填的信息看下图。

两个DNS服务器分别是:f1g1ns1.dnspod.netf1g1ns2.dnspod.net,其余的删掉就行了。填好了之后点submit,再看上面那个图中第三个框的地方,如果变成了Active,就是转移好了。

设置DNS解析

从namesilo里面把DNS解析的任务交给DNSPod之后,就可以进入DNSPod的官网添加域名。

添加好之后,点击进入,去添加DNS解析。

图中上面两条记录是默认的,不用管。下面两条记录是我自己添加的。记录类型CNAME表示是可以把自己的域名解析到(跳转到)另一个域名上,对于我自己而言就是把coding给的二级域名填到记录值里面。如果你们有自己的服务器(也是我后续要更改的),记录类型就应该选择A,这个时候需要把服务器的IP放到记录值。然后主机记其实就是前缀,@表示没有前缀。

如果是使用CNAME,需要到coding或者你自己挂靠的网站的静态网页上面添加自定义域名,不然会解析不上。


SEO转移

由于博客的网址改变了,所以需要在百度站长和谷歌站长里面进行网站改版。

突然发现网站改版需要将旧域名重定向到新域名,扑街了,只能重新做SEO了,也就是重新认证域名。

百度站长域名认证

首先登陆百度站长的网站管理页面添加网站。第一步和第二步都没有什么特别需要注意的,主要是第三步——验证网站。

验证方式有三种,文件验证、HTML标签验证、CNAME验证,由于这一次我们有自己的域名,所以可以选择最后一个CNAME验证,这样的验证最方便。

CNAME验证就按照上面写的,同之前做的一样,将前缀和记录值添加到DNSPod上面就好了。

文件验证适合于网站搭建在自己服务器上。
HTML标签验证适合挂靠在coding、码云这样的网站上。

谷歌站长认证域名

整个步骤需要科学上网,量力而行。

同百度一样,打开谷歌站长,在左上角选择添加资源。然后选择第一个,填入自己的域名。

然后会要你添加一个TXT记录

这个时候返回我们的DNS解析服务商DNSPod,添加一个这样的记录,就完成了。


最后还有一步添加sitemap,可以参看我的老文章


服务器环境搭建

假设大家都有服务器了,没有的可以上很多地方买,比方说阿里云、腾讯云、搬瓦工之类的。

获取SSH的KEY

假设你的git已经安装好了,也有了gitbash。在任意地方打开gitbash,然后输入ssh-keygen -t rsa,一路回车就行了。出现一个类似于下图的图像就成功了。

生成的SSH认证(KEY)在本机的C:\Users\yourname\.ssh\id_rsa.pub文件里面。

其中的yourname表示你的电脑用户名,Users在有的电脑中是中文的用户.ssh是隐藏文件夹,一般不显示,可自行百度如何显示。

与服务器建立SSH信任

现在你电脑上有一个SSH的认证,要把这个KEY放到你的服务器上,这样使用电脑连接服务器的时候就可以免密。本文使用的服务器系统是centos 7。

使用XSHELL登录到服务器之后,输入命令安装环境。

1
2
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install -y git

使用service sshd start命令测试一下是否有SSH服务,没有的话也安装一下yum -y install openssh-server

然后创建一个叫git的用户,使用git用户来进行SSH同步。

1
2
3
4
5
6
7
8
adduser git // 按照提示操作
su git // 这步很重要,不切换用户后面会很麻烦
cd /home/git/
mkdir -p projects/blog // 项目存在的真实目录
mkdir repos && cd repos
git init --bare blog.git // 创建一个裸露的仓库
cd blog.git/hooks
vi post-receive // 创建 hook 钩子函数,输入了内容如下

一般linux中不允许root用户进行SSH连接,所以一般用户来进行SSH连接。

执行完最后一行之后,会进入vi编辑器,不会使用的可以百度一下linux的vi编辑器。然后输入内容为:

1
2
#!/bin/sh
git --work-tree=/home/git/projects/blog --git-dir=/home/git/repos/blog.git checkout -f

往文件里面添加完内容退出来之后,再添加权限。

1
2
3
chmod +x post-receive
exit // 退出到 root 登录
chown -R git:git /home/git/repos/blog.git // 添加权限

然后在本地任意文件夹里面打开gitbash,输入:

1
git clone git@服务器ip:/home/git/repos/blog.git

输入完之后会在你刚刚打开gitbash的文件夹下面产生一个blog文件,里面是空的。


linux的ssh登录端口一般是22,如果修改过端口,这一步会报错。解决办法见最下面的坑->SSH端口非22的git问题


然后开始建立SSH信任(中间会要求输入密码,也就是前面设置的git账户的密码)。
1
ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip

这个运行好了之后,如果显示下图就基本是成功了。

还可以通过命令ssh git@服务器ip来尝试,如果没要求输入密码,就大功告成了!如果有问题的话,可以参看这里


搭建Web服务器(nginx)

可以使用系统自带的安装工具apt或者yum安装nginx。
也可以手动安装,首先是下载安装nginx,下面第五行和第六行二选一。

1
2
3
4
5
6
7
8
cd /usr/local/src
wget http://nginx.org/download/nginx-1.15.2.tar.gz
tar xzvf nginx-1.15.2.tar.gz
cd nginx-1.15.2
./configure // 如果后面还想要配置 SSL 协议,就执行下面一句!
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make && make install
alias nginx='/usr/local/nginx/sbin/nginx' // 为 nginx 取别名,后面可直接用

由于现在可以申请免费的SSL证书,这里第五行就不运行,选择运行第六行。

全部运行完了之后,运行如下打开Web服务器看看,是否安装成功。

1
nginx // 直接来!浏览器查看 server_ip,默认是 80 端口

运行之后,在浏览器里面输入你的服务器ip,就可以看到nginx几个大字。如果没有的话可以检查一下80端口是否开放。

如果可以打开,就开始修改配置文件。

不配置SSL证书(http)

SSL证书的作用是,使我们的网站可以通过https访问了,这样更安全。如果不配置SSL,就直接修改配置文件。首先打开配置文件,使用”nginx -t”可以查看配置文件位置。

1
2
3
nginx -s stop // 先停止nginx
cd /etc/nginx
vi nginx.conf

首先要修改的是配置最开头的部分。

user后面修改为rootuser前面可能还有#,也要去掉,这个是注释的意思。

其次还需要修改的是网页存放的位置。

这个其实就对应了我们前面生成的项目存在的真实目录。然后执行nginx -s reload,就可以通过ip访问了,如果有个人域名,还需要在DNSPod上面添加A记录,后续介绍。

配置SSL证书(https)

众所周知,配置SSL之后网站会安全很多,评分也会更好,SEO排名也更好,巴拉巴拉巴拉。不废话,开干就是。前方繁琐步骤预警

免费SSL证书有很多种,最著名的就是Let’s Encrypt提供的,可以为泛域名提供免费证书(不明觉厉)。由于Let’s Encrypt提供的SSL证书每90天就要更新一次,于是使用acme.sh脚本来进行证书的安装和定时更新。

安装acme.sh脚本

首先安装依赖。

1
yum update && yum install curl -y && yum install cron -y && yum install socat -y

然后安装脚本。

1
2
3
cd /root/
curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh //这一步很关键,不然后面有可能没办法运行acme.sh命令

获取DNSPod的秘钥

进入DNSPod的控制后台,点击右上角头像会看到秘钥管理。

点进去之后点创建秘钥就行了,这里生成的秘钥Token系统不会,需要自行保存。

然后在服务器上面导入秘钥。

1
2
export DP_Id=ID
export DP_Key=Token

这里要注意,ID和Token外面,没有引号!没有引号!没有引号!不然会报错!如果用的不是DDNS,可以参考这里

申请SSL证书

这个也很简单,运行下面这行命令就行了。

1
acme.sh --issue --dns dns_dp -d 域名 -d *.域名

完成了之后就会看到这样的提示。

然后移动证书到一个新的文件夹里面去。

1
2
3
4
5
mkdir /etc/nginx/ssl
acme.sh --installcert -d 你的域名 \
--key-file /etc/nginx/ssl/域名.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"

生成 dhparam.pem 文件

这一步不是必须,但最好加上,后面配置好后会通过ssllabs.com 来验证一下,如果这一步ssl_dhparam 未配置,将导致 ssllabs.com 的评分降到 B。A+是最好。

1
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

配置 Nginx

证书安装完毕之后,就可以开始配置Nginx了。由于只有一个网站,所以可以像我这样配置。还是先打开配置文件。

1
2
cd /etc/nginx
vi nginx.conf

然后配置文件内容如下要修改的包括:

最开头的注释去掉。然后同样修改网页存放位置,由于有SSL证书了,我们就强制将http重定向到https

刚刚修改的是http的设置,再来修改https的设置。

红色是必须要注意且修改的,橘色是选填,如果刚刚弄了 dhparam.pem 才需要添加。需要注意可能https配置每一行前面可能都有#号,这个代表这一行是注释,需要去掉,开头的HTTPS server前面的注释别去掉

然后就是重启Nginx。

1
systemctl restart nginx

如果这里报错Failed to start nginx.service:unit not found,请见下方坑。

设置自动更新SSL证书

1
acme.sh  --upgrade  --auto-upgrade

这一句话即可完成自动更新。


SSH端口非22的git问题

问题表现为使用gitbash操作的时候出现

1
ssh: connect to host ip地址 port 22: Connection timed out

只介绍一种一劳永逸的办法:

  • C:\Users\yourname\.ssh文件夹里面新建一个config文件,注意没有后缀。然后在文件里面填入
    1
    2
    Host "服务器ip"
    Port 端口号

在centos下启动nginx出现Failed to start nginx.service:unit not found

详情可以参考这里

以下为搬运一下。

错误的原因就是没有添加nginx服务,所以启动失败。所以先创建nginx服务文件。

1
vi /etc/init.d/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
#!/bin/sh
# nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15

# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server

# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}


stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}



restart() {

configtest || return $?

stop

start

}


reload() {

configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

force_reload() {

restart

}


configtest() {

$nginx -t -c $NGINX_CONF_FILE

}



rh_status() {

status $prog

}


rh_status_q() {

rh_status >/dev/null 2>&1

}

case "$1" in

start)

rh_status_q && exit 0
$1
;;

stop)


rh_status_q || exit 0
$1
;;

restart|configtest)
$1
;;

reload)
rh_status_q || exit 7
$1
;;


force-reload)
force_reload
;;
status)
rh_status
;;


condrestart|try-restart)

rh_status_q || exit 0
;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2

esac

再执行:

1
2
3
4
cd /etc/init.d
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
service nginx start


参考