如何部署Hexo项目到云服务器
Hexo是一个很好用的博客框架,使用博客框架写博客能极大减少我们的开发时间,从而能更加专注于内容的创作。这个博客框架的生态还是不错的,有很多高颜值的主题和功能插件,我们只需要进行少量操作就可以给博客的内容锦上添花。不过当我们写的博客项目有部署上线的需求,该如何将项目部署上线呢。本文的主要内容就是介绍我是怎么将博客部署到云服务器上的。
流程介绍
部署的主要流程也不算难,就是通过本地执行hexo deploy命令,将本地更改推送到远程 git 仓库,远程 git 仓库调用钩子函数将静态文件挂载到nginx的静态文件夹中,从而实现将项目部署到服务器。本案例中云服务器使用的是centOS系统,本地环境为MacOS操作系统。
服务器配置
创建用户
为了方便管理,我们在服务器上创建一个用户:
adduser git
passwd gityum 配置
更新 yum 源:
yum update安装 yum-config-manager:
yum install -y yum-utils device-mapper-persistent-data lvm2docker 安装
配置阿里 docker 源:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo可以使用下面命令查看所有版本的 docker:
yum list docker-ce --showduplicates | sort -r安装最新版 docker:
yum install docker-ce开启 docker 并设置成开机自启动:
systemctl start docker
systemctl enable docker这个时候 docker 就已经安装完成了,可以使用docker version命令查看当前 docker 的版本:
[root@iZwz91obh1cwf41mlyes8dZ ~]# docker version
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:56:24 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:54:48 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0创建并启动 nginx 容器
首先创建好待挂载的目录:
mkdir -p /home/git/nginx/ {conf,html,logs}给存放静态页面文件夹分配用户权限
chown -R $USER:$USER /home/git/www
chmod -R 755 /home/git/www之后在刚才创建的conf文件夹下用vim创建nginx.conf文件并进行nginx的配置:
// nginx.conf文件内容,
user nginx; #设置nginx服务的系统使用用户
worker_processes 1; #工作进程数
error_log /var/log/nginx/error.log warn; #nginx的错误日志
pid /var/run/nginx.pid; #nginx启动时候的pid
events {
worker_connections 1024; #每个进程允许的最大连接数
}
http { #http请求配置,一个http可以包含多个server
#定义 Content-Type
include /etc/nginx/mime.types;
default_type application/octet-stream;
#日志格式 此处main与access_log中的main对应
#$remote_addr:客户端地址
#$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录
#$timelocal:nginx的时间
#$request:请求method + 路由 + http协议版本
#status:http reponse 状态码
#body_bytes_sent:response body的大小
#$http_referer:referer头信息参数,表示上级页面
#$http_user_agent:user-agent头信息参数,客户端信息
#$http_x_forwarded_for:x-forwarded-for头信息参数
log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#访问日志,后面的main表示使用log_format中的main格式记录到access.log中
access_log /var/log/nginx/access.log main;
#nginx的一大优势,高效率文件传输
sendfile on;
#tcp_nopush on;
#客户端与服务端的超时时间,单位秒
keepalive_timeout 65;
#gzip on;
server { #http服务,一个server可以配置多个location
listen 80; #服务监听端口
server_name localhost; #主机名、域名
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; #页面存放目录
index index.html index.htm; #默认页面
}
#error_page 404 /404.html;
# 将500 502 503 504的错误页面重定向到 /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html { #匹配error_page指定的页面路径
root /usr/share/nginx/html; #页面存放的目录
}
}
include /etc/nginx/conf.d/*.conf;
}保存并退出文件后,我们需要使用docker拉取nginx镜像:
docker pull nginx之后进行容器的创建以及目录的挂载:
docker run --name docker_nginx -d -p 8080:80 -v /home/git/nginx/log:/var/log/nginx -v /home/git/nginx/conf:/etc/nginx -v /home/git/nginx/conf.d:/etc/nginx/conf.d -v /home/git/www:/usr/share/nginx/html nginx上面的操作将容器的 8080 端口映射到了服务器的 80 端口,以及对容器的日志、配置文件以及静态文件目录做了挂载,挂载的目的是为了使我们能够通过操作本地目录来进行容器中配置文件的修改以及静态页面的部署。执行完这一步后可以访问服务器公网ip看看页面显示情况。(这一步的前提是云服务器安全组对该端口的入方向配置放行,需要自行进入云服务器管理控制台配置,不同厂商可能操作有所不同)
创建远端 git 仓库
安装 git:
yum install git创建仓库目录:
mkdir /home/git/repo权限设置:
chown -R $USER:$USER /var/repo/
chmod -R 755 /var/repo/初始化 git 仓库:
cd /home/git/repo
git init --bare my-blog.git之后我们会使用 git 钩子进行部署,所以需要添加post-receive。在仓库的hooks目录下创建post-receive文件,使用vim打开:
vim /home/git/reop/my-blog.git/hooks/post-receive文件输入以下内容:
#!/bin/bash
git --work-tree=/home/git/www --git-dir=/home/git/repo/my-blog.git checkout -f之后给文件可执行权限:
chmod +x /home/git/repo/my-blog.git/hooks/post-receive至此,服务器的配置基本就完成了。
本地配置
本机已经安装好了homebrew,关于homebrew的安装不作说明,m1 的机器和英特尔的有区别,百度可以搜到。
MacOS内置ssh,我们需要使用homebrew来安装ssh-copy-id,将本地的公钥 copy 到服务器。
配置 ssh 自动登录:
ssh-keygen -t rsa -C 'xxxxxx@qq.com'
brew install ssh-copy-id
ssh-copy-id git@{服务器公网ip}这样配置完之后 mac 可以通过命令行直接访问云服务器,不用输密码。
ssh git@{服务器公网ip}之后本地 Hexo 项目中主_config.yml中的deploy进行配置:
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: git
repo: git@{服务器公网ip}:/home/git/repo/my-blog.git至此,只需要执行hexo deploy就可以一键部署项目到服务器了。
可能出现的问题
第一次按步骤部署时可能出现创建文件夹无权限的问题,会导致调用 git 钩子出现问题,从而无法部署到服务器。可以通过给对应的文件夹开放权限解决。
或者不嫌输密码麻烦,可以考虑直接用root账户,如果使用root,前面的加权限、ssh 免密码配置都可以不用做了:
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: git
repo: root@{服务器公网ip}:/home/git/repo/my-blog.git