Hexo静态博客部署到VPS

📄前言

简单介绍我是如何将Hexo部署到服务器上

🛠环境准备

本地环境 VPS环境
Git Git
Node.js Nginx
Hexo CentenOS

这里以我自己的Mac环境举例,其他操作系统很多操作类似或者可以自行Google

本地环境准备

Git

首先要安装Homebrew包管理器,打开Terminal,执行以下的代码

1
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

命令执行完后,运行brew -v,若显示Homebrew的版本信息即安装成功。接下来就可以执行brew install git来安装Git,然后继续执行git --version,如果显示Git版本信息即安装成功

Node.js

Node.js官网下载对应系统的安装程序,安装成功后,可以在Terminal中输入node -v检查是否安装成功

Hexo

以上必要的环境安装完成后执行npm install -g hexo-cli,在Terminal中cd到你想要创建blog的文件夹,执行hexo init <folder>进行hexo的初始化(<folder>为你想要新建hexo项目的文件夹名)

VPS环境准备

使用Terminal通过ssh链接到你的服务器,输入用户名和密码即可

1
$ ssh root@[ip] -p ssh [port]       //[ip]VPS的ip地址;[port]VPS的端口号

一般情况下,服务器并没有安装Git,所以需要我们自己安装,这里以CentenOS举例,他的包管理工具是yum,所以安装Git命令为yum install git,检查是否安装成功与本地相同

创建git服务器

首先,我们需要在系统中创建服务器所需的用户组和用户,来运行git服务

1
2
3
$ groupadd daniel       //创建用户组
$ useradd danielwei //创建用户
$ passwd 123456 //设置户密码

创建完毕后,我们需要给danielwei用户添加账户权限

1
2
3
$ cd /etc               //进入根目录下的etc文件夹
$ chmod 740 sudoers //赋予sudoers文件740的权限
$ vim sudoers

找到以下内容:

1
2
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

在下面添加一行:

1
danielwei    ALL=(ALL)       ALL

按ESC键,输入:wq保存退出,并将sudoers文件改回原先权限

1
$ chmod 400 sudoers

输入logout,断开ssh连接

在本地的Terminal上执行

1
$ ssh-copy-id [user]@[remote] -p [port]

[user]为用户名,[remote]为VPS的ip地址,[port]端口号
接下来重新登陆VPS

1
2
3
$ cd ~/.ssh
$ chmod 600 authorzied_keys
$ chmod 700 ~/.ssh

再次退出登陆,在Terminal中输入ssh danielwei@[ip] -p ssh [port] ,便可以免密码登陆

1
2
3
4
5
$ cd /home/danielwei
$ mkdir blog.git
$ cd blog.git
$ git init --bare
$ ll /home/danielwei/blog.git

如果显示blog.git权限为root,那么则需要通过以下命令进行修改

1
$ sudo chown daniel:daniel -R /home/daniel/blog.git

自动部署内容

Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git 内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为

1
2
$ cd /blog.git/hooks
$ vi post-receive

输入以下内容,路径修改成自己的即可。

1
$ git --work-tree=/var/www/blog --git-dir=/home/danielwei/blog.git checkout -f

退出后保存,执行chmod +x post-receive

安装 Nginx

安装gcc

先检查一下系统环境是否有已经安装gccgcc -v,如果提示未找到命令,可以通过以下命令安装:

1
yum -y install gcc

安装pcre、pcre-devel

pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库

1
$ yum install -y pcre pcre-devel

安装zlib

zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip,所以需要安装

1
$ yum install -y zlib zlib-devel

安装openssl

1
$ yum install -y openssl openssl-devel

下载Nginx安装包

1
$ wget http://nginx.org/download/nginx-1.9.9.tar.gz

将文件移动到 /tmp 目录下

1
2
3
$ mv nginx-1.9.9.tar.gz /tmp
$ cd /tmp
$ tar -zxvf nginx-1.9.9.tar.gz

进入nginx-1.9.9

1
2
3
4
$ cd nginx-1.9.9
$ ./configure
$ make
$ make install

配置Nginx

1
$ cd /usr/local/nginx/conf

编辑以下文件

1
$ vi nginx.conf

根据自己网站的域名以及服务器地址,填写以下内容

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
user danielwei danielwei;
worker_processes 1; #设置值和CPU核心数一致

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name exmaple.com www.example.com yourip;
root /var/www/blog;
#charset koi8-r;

# if ($http_x_forwarded_proto = "http") {
# return 301 https://$65.49.192.152$request_uri;
# return 301 https://$server_name$request_uri;
# }

return 301 https://$server_name$request_uri;

#access_log logs/host.access.log main;

location / {
root /var/www/blog;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}

}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server

server {
listen 443 ssl;
server_name exmaple.com www.example.com yourip;

ssl_certificate /etc/letsencrypt/live/itsdanielwei.com-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/itsdanielwei.com-0001/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /var/www/blog;
index index.html index.htm;
}
}

#server {
# listen 80;
# server_name exmaple.com www.example.com yourip;
# rewrite ^/(.*)$ http://itsdanielwei.com$1 permanent;
# return 301 https://$server_name$request_uri;

# location / {
# root /var/www/blog;
# index index.html index.htm;
# }
#}
}

一些Nginx的命令

1
2
3
4
5
6
$ /usr/local/nginx/sbin/nginx             #启动 
$ /usr/local/nginx/sbin/nginx -s stop #快速关闭(不建议使用)
$ /usr/local/nginx/sbin/nginx -s quit #等待完成用户请求后关闭(建议使用)
$ /usr/local/nginx/sbin/nginx -t #检查配置文件内容
$ /usr/local/nginx/sbin/nginx -s reload #重启 nginx
$ /usr/local/nginx/sbin/nginx -c filename #以制定配置文件启动

强制停止Nginx

1
2
$ ps -ef | grep nginx   #查看 nginx 所有进程
$ pkill -9 nginx #关闭所有 nginx 进程

设置开机启动

1
$ vi /usr/lib/systemd/system/nginx.service

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

如果现在 nginx 处于运行状态,首先要先关闭 nginx

1
2
$ systemctl enable nginx.service  #设置开机自启
$ systemctl status nginx.service #查看 nginx 状态

如果查看 nginx 运行状态显示结果如下:

(Loaded: loaded (/usr/lib/systemd/svstem/nginx.service; enabled; vendor preset: disabled)

Active: inactive (dead)

那么需要先杀死所有nginx 进程:

1
2
3
$ pkill -9 nginx                  #关闭所有 nginx 进程
$ systemctl start nginx #启动 nginx
$ systemctl status nginx.service #查看 nginx 状态

启动后会看到以下关键词Active: active (running)

重启服务器reboot,重启后直接查看nginx状态,就以上关键词,就是配置成功了

本地上传到服务器

进入到本机的 Hexo 博客根目录下,打开 _config.yml 文件,在

1
2
3
4
5
deploy:
type: git
repository:
self: git@www.example.com:/home/git/blog.git
branch: master

保存后在此目录下打开终端,输入命令:

1
$ hexo g -d

此时你就可以在你的网站上看到所上传的blog内容了

网站组件配置

⚙️组件 🔗链接
服务器 BandwagonHOST
域名 NameSilo
DNS DNSPod
SSL证书 Let’s Encrypt
框架 Hexo
主题 NexT

小结

水了一篇文章,水的很好,希望下次不要再水了