经过好几天的忙里偷闲,总算是将Hexo部署到云服务器上了,为了防止以后忘记,遂在此记录,以防万一,顺便给大伙提供一点帮助

事前准备

一台有公网IP的云服务器(最好是直接安装带Docker的系统)、注册域名并备案(可以先没有,不影响部署,之后想上线再弄,但域名备案需要8~20个工作日,着急的建议先申请备案)、了解基本的linux命令(起码要会cd和vim)

推荐

雨云 - 新一代云服务提供商,我之前一直在用他的NAT网络的服务器,价格很便宜,虽然没有公网IP,但使用端口映射也可以实现大部分的需求了,并且还免费提供二级域名。

地址:雨云官网
邀请码:MzgwODIy (使用邀请码可获得首月5折优惠券,1核1G的服务器首月券后仅需9元)

image-20240625130958366

此外,雨云支持试用,1元试用1天,试用后可继续使用新人优惠购买服务器或续费使用的服务器

又拍云 - 加速在线业务 - CDN加速 - 云存储

地址:又拍云官网
注册完实名认证之后会送61元的代金券,代金券自动抵扣消费,比如你想用云存储当图床,就直接创建使用即可,费用会自动从代金券中扣除
另外只需在网页底部悬挂又拍云拍云 LOGO 及链接,就可以申请又拍云联盟,会送一年的代金券,每年都可以申请。

思路

  1. 本地安装git、hexo,修改配置、主题、写笔记什么的都在本地完成
  2. 服务器安装git、创建个git仓库、配置密钥、钩子函数
  3. 本地从github把hexo代码拉取下来,之后每次修改后调用的hexo deploy命令就会自动将上传到服务器的git仓库,服务器端的git仓库再用钩子函数将本地上传的静态文件部署到指定目录

工作原理以及部署步骤什么的这个大佬的博客写的很好我当时就是按照他来的基于Hexo的静态博客网站搭建并部署至云服务器 | Cream薄荷糖 (creammint.github.io),不过其中可能会因人而异出现一些问题,我在此记录了我出现的问题以及解决方法。

开始部署

在本地计算机安装Git

为了在本地进行hexo clean && hexo generate && hexo deploy,并用Git的钩子函数只将静态文件部署到服务器,减少服务器的占用。

当然,如果你租的服务器性能够好,那就直接在服务器上安装hexo,然后把自己本地写好的md文件上传到_posts文件夹,在服务器上运行这些命令即可,也省得换了电脑还得重新配置密钥。

这个网上一堆教程,我就不细说了,留个大佬的链接:windows安装git(全网最详细,保姆教程)_windows 安装git-CSDN博客

创建git用户

打开Git Bash,依次输入以下命令

1
2
git config --global user.email "xxx@xxx.com"     # xxx@xxx.com改为邮箱
git config --global user.name "xxx" # xxx为用户名

此处的邮箱和用户名用于标识是哪位用户提交的代码,起个自己喜欢的名称即可,邮箱最好是真实的邮箱

在本地计算机安装Node.js和npm

前往官网下载较新的LTS(即长期支持)版本并安装,Hexo官方要求Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本,Node.js安装过程中会一并将npm包管理工具安装至本地。安装完成后可以在Git Bash或cmd中输入 node -v 和 npm -v 查看版本。

image-20240624151811122

在本地计算机安装Hexo

官方文档:文档 | Hexo

  1. 创建个文件夹,用户安装Hexo,例如D:\MyBlog,进入该文件夹,右键打开Git Bash,输入以下命令安装Hexo

    1
    npm install -g hexo-cli hexo-server
  2. 本地初始化博客站点

    1
    2
    hexo init  # 会在当前文件夹从GitHub克隆项目并下载依赖
    npm install hexo-deployer-git --save

    hexo init后可以跟随参数,如hexo init blog这样就会多一层目录:D:\MyBlog\blog

    hexo-deployer-git为自动部署至远程git仓库的插件,用于把我们在本地生成的静态网站页面push到服务器上。

    显示如下即安装成功:

    image-20240624153633355

    初始化后目录结构如下:

    image-20240624153658762

  3. 这里有一些比较重要的文件或文件夹:

    • _config.yml 文件:站点的配置文件
    • source 文件夹:存放需要进行渲染的文件,该目录下的 _post 文件夹内存放我们写的博文
    • themes 文件夹:存放主题及其配置文件
  4. 测试:Git Bash输入命令

    1
    hexo s

    打开浏览器,输入地址http://localhost:4000,显示以下页面即本地部署成功。Git Bash按下Ctrl + C停止服务

    image-20240801163148768

连接服务器

使用Xshell或者其他软件连接服务器,我使用的是WindTerm,开源免费,在此放个链接WindTerm官网 (winterm.org)

登录服务器的用户名初始为root,密码为自己当时设置的,忘了的话在服务器管理中重置密码或者直接重装系统(服务器没怎么用过的话),重装的时候也会让你重新设置密码。

若还是连接不上则需要查看防火墙,有没有添加规则,放行22端口。

image-20240624155334322

查看是否安装了Git

1
git --version

若显示如下则无需再次安装GIt

1
git version 1.8.3.1

若未安装则进行安装

1
2
yum install -y git   # CentOS使用yum安装,Debian使用apt-get安装 请自行查找命令
git --vesion #显示git版本号,说明安装成功

添加git用户

  1. root用户默认的权限过大,出于安全考虑,我们为服务器添加一个名为git的用户,用于将博客自动部署至服务器上(不需要主动切换到git用户,我们所有的操作都用root用户即可)。

    1
    2
    useradd git     #添加名为git的用户
    passwd git #修改git用户的密码

    此处可能遇到密码过于简单,无法创建用户的问题:跳转至问题一

  2. 为git用户授予sudo权限,用WindTerm打开 /etc 目录下的 sudoers 文件,在 root ALL=(ALL) ALL 语句下添加 git ALL=(ALL) ALL ,如图所示。

    image-20240624155849670

    或者在/etc/sudoers.d目录下,新建usergit文件,添加git ALL=(ALL) NOPASSWD:ALL并保存,效果一样

    1
    2
    vim /etc/sudoers.d/usergit
    git ALL=(ALL) NOPASSWD:ALL

为git用户添加SSH密钥

若不添加SSH密钥,那么本地计算机对服务器的git仓库进行的所有操作都需要输入密码,我们可以通过为git用户添加SSH密钥的方式来实现免密登录。

  1. 本地计算机在任意位置打开Git Bash,输入以下命令生成密钥

    1
    ssh-keygen

    按三次Enter即可生成密钥

  2. 进入C:\Users\用户名里面有.ssh目录,里面的id_rsa.pub就是我们需要的文件

  3. 服务器中进入/home/git目录,创建.ssh目录,并新建名为authorized_keys的文件,将id_rsa.pub的内容复制进去并保存

    1
    2
    3
    cd /home/git
    mkdir .ssh
    vim authorized_keys
  4. 为公钥文件和文件夹设置读写权限

    1
    2
    chmod 600 /home/git/.ssh/authorized_keys
    chmod 700 /home/git/.ssh
  5. 将.ssh文件夹及其内的文件所有权移交给git用户

    1
    chown -R git:git /home/git/.ssh
  6. 在本地计算机测试是否可以用ssh免密登录服务器。打开Git Bash

    1
    ssh -v git@xxx.xxx.xxx.xxx     #git@后填写服务器的公网ip

    第一次免密登录会提示让你输入yes/no,输入yes即可,之后就不需要输入yes了,显示以下内容即免密登录成功

    1
    Last login: Tue Jun 18 15:21:51 2024 from 111.194.209.107

    若之前使用过ssh连接过此服务器,但是重装系统了,那么会报错:跳转至问题二

服务器创建Git仓库并配置自动部署

这里的Git仓库(repository)可以理解为一个存放着不同版本代码的代码库,包含了项目所有的源文件和版本控制信息。但我们在这里需要用到的是裸库,即仅包含版本控制信息的仓库。后者不保存文件,常用作服务器仓库,实现数据共享和同步。

自动部署的核心在于git-hooks(钩子),可以理解为一种脚本,在特定条件下触发时会调用钩子并执行钩子文件中的内容。

  1. 创建并进入自己想初始化git仓库的目录

    1
    2
    3
    mkdir -p /home/repo
    cd /home/repo
    git init --bare hexo-blog.git #创建一个名为blog的仓库,--bare参数为创建裸库
  2. 进入/home/repo/hexo-blog.git/hooks目录,找到post-receive文件(若无则创建),在里面输入git --work-tree=/home/blog/hexo --git-dir=/home/repo/hexo-blog.git checkout -f(work-tree为hexo的部署目录,git-dir为Git仓库的目录)

    1
    2
    3
    cd /home/repo/hexo-blog.git/hooks
    vim post-receive
    mkdir -p /home/blog/hexo
  3. 这里我们使用的是 post-receive钩子,当Git收到push请求的时候就会调用这个钩子。这个钩子中添加的语句执行的操作为:删除hexo部署目录中原有的文件,然后将Git仓库中的内容clone至hexo部署目录下。这样我们在本地更新博客并且执行部署命令后,网页文件会被push至服务器的Git仓库内,钩子文件则会将Git仓库内的网页文件复制到hexo部署目录下,从而实现自动部署功能。

  4. 为钩子文件及Git仓库目录配置权限。这里需要将我们创建的仓库及部署目录的所有权移交给git用户,因为linux下创建文件时默认只有拥有者(即创建者)才具有读写权限,而Git进行push操作时登录的用户为git用户。

    1
    2
    3
    chmod +x /home/repo/hexo-blog.git/hooks/post-receive     #为钩子文件授予可执行权限(+x)
    chown -R git:git /home/repo #将仓库目录的所有权移交给git用户
    chown -R git:git /home/blog/hexo #将hexo部署目录的所有权移交给git用户
  5. 修改本地Hexo的配置文件_config.yml

    1
    2
    3
    4
    deploy:
    type: git
    repo: git@yourIP:/home/repo/hexo-blog.git
    branch: master

安装Nginx

  1. 安装nginx所需的依赖,gcc-c++为编译nginx源码所需的编译器;pcre为正则表达式的支持库;zlib为压缩算法的支持库;Nginx支持http与https协议,如需实现https协议需要用到openssl库。

    1
    2
    3
    4
    yum install gcc-c++
    yum install -y pcre pcre-devel
    yum install -y zlib zlib-devel
    yum install -y openssl openssl-devel
  2. 进入Nginx官网,查看稳定版nginx的版本号,并在终端中输入指令下载nginx的源代码。这里以1.26.1版本为例。

    1
    2
    wget -c http://nginx.org/download/nginx-1.26.1.tar.gz     #用wget命令下载源代码的压缩包
    tar -zxvf nginx-1.26.1.tar.gz -C /usr/local #解压压缩包至/usr/local目录下

    若服务器下载过慢可以在本地计算机下载,然后上传至服务器

  3. 进入解压后的目录执行配置文件

    1
    2
    cd /usr/local/nginx-1.26.1
    ./configure --with-http_ssl_module #http_ssl_module为https模块
  4. 编译安装nginx

    1
    make && make install
  5. 默认安装目录为 /usr/local/nginx 。进入nginx的sbin目录,启动nginx。注意,启动成功后在终端中不会显示任何信息,而在已启动nginx的情况下再次试图启动会显示错误信息(可据此粗略判断nginx是否启动)。

    1
    2
    3
    cd /usr/local/nginx/sbin
    ./nginx -v #显示nginx版本号,说明安装成功
    ./nginx #启动nginx
  6. 测试,启动后在浏览器地址栏中输入 http://你的服务器ip:80 即可看到nginx的欢迎页面,如图所示。

    image-20240624164804764
  7. 将nginx添加至环境变量,否则只能在sbin中使用nginx命令,在/etc/profile文件的结尾添加以下代码

    1
    2
    export NGINX_HOME=/usr/local/nginx
    export PATH=${NGINX_HOME}/sbin:$PATH

    在任意位置输入nginx -v,出现以下结果则环境变量添加成功

    1
    nginx version: nginx/1.26.1
  8. nginx常用命令

    1
    2
    3
    nginx -s stop    # 停止nginx
    nginx -s reload # 重载nginx,修改配置文件后使用
    nginx -t # 检查配置文件语法是否有错误,常用于修改配置文件后的检查

配置Nginx反向代理

可以根据最开始那个教程直接修改nginx.conf,不过最好还是另建个vhost目录,再使用include导入到nginx.conf,这样方便管理

  1. 进入/usr/local/nginx/conf,创建vhost目录,进入vhost,创建hexo-blog.conf文件

    1
    2
    3
    4
    cd /usr/local/nginx/conf
    mkdir vhost
    cd vhost
    vim hexo-blog.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
    server {
    listen 80;
    # 服务器公网IP
    server_name 123.123.123.123;
    # 项目的部署地址
    root /home/blog/hexo;
    location /{
    }

    # 以下配置是绑定SSL证书时使用的,若域名没备案就先不填,使用上面的就行了
    # listen 443 ssl;
    # 请填写绑定证书的域名
    # server_name huochairener-blog.cn;

    # 部署ssl使用的参数
    # if ($server_port !~ 443){
    # rewrite ^(/.*)$ https://$host$1 permanent;
    # }

    # 请填写证书文件的相对路径或绝对路径
    # ssl_certificate /xx/xx/xxxx.crt;
    # 请填写私钥文件的相对路径或绝对路径
    # ssl_certificate_key /xx/xx/xxx.key;
    # ssl_session_timeout 10m;
    # 请按照以下协议配置
    # ssl_protocols TLSv1.2 TLSv1.3;
    # 请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    # ssl_prefer_server_ciphers on;

    }
  2. 检查语法,并重载nginx

    1
    2
    nginx -t  # 一般报错信息很明确,翻译一下就行。若不知道就查查,或者看看文件里有没有多余的空格
    nginx -s reload
  3. 使用https://yourdomain访问

    image-20240625113059366

至此,Hexo已成功部署至云服务器,后续的后台管理系统Qexo、评论系统Waline的部署请看我站内的其他文章。

我使用的是butterfly主题,可自行根据网上的教程配置,如【Hexo】Hexo搭建Butterfly主题并快速美化_hexo butterfly-CSDN博客

实现https访问需要域名备案并申请SSL证书,证书不要去买,就用免费的就行,每三个月续期一次(重新申请并部署到服务器),腾讯云、阿里云什么的搜索SSL证书,里面都会有免费申请的入口。申请后根据提示,用DNS进行解析通过SSL的申请,然后在上文中nginx配置里配置自己申请后下载下来的的SSL证书即可

如果嫌麻烦的话就去买,价格也需要斟酌,我挑了俩感觉价格还行:

记得看清楚商品详情是多久续签一次的,续签就是重新发一个证书,然后还是要自己部署到服务器,买1年的。90天的别买,本身就是免费的。

juyssl-3年136

永久免费SSL证书_永久免费https证书_永久免费ssl证书申请-JoySSL

西部数码-3年153

别买通用的,通用的有效期90天,90天的本身就是免费的

SSL证书-免费SSL证书申请-西部数码 (west.cn)

问题总结

问题一

根据此大佬给的方法修改系统文件即可

Linux用户密码简单引起的报错处理(BAD PASSWORD: … it is based on a dictionary word)_bad password: the password fails the dictionary ch-CSDN博客

问题二

之前连接过,所以本地会有记录,手动删除记录即可。

找到本地计算机的密钥文件夹,打开known_hosts,删除带有你服务器公网IP的记录并保存即可

问题三

每个需要用端口进行访问的步骤之前,先去防火墙看看自己有没有放行这个端口,不然无法访问