使用hexo在服务器上搭建博客

安装本地环境

本地启动hexo

  1. 下载生成个人博客所需要的软件/环境:git,node.js
  2. Hexo 的安装与配置
    • 创建一个空文件夹(如命名 blog),之后的所有操作都在这个文件夹里进行
    • 安装 hexo:cnpm install -g hexo-cli
    • 查看是否安装成功:hexo v
    • 初始化 blog 目录:hexo init
    • 生成项目:hexo generate或者hexo g。这一步是把 md 文件生成 html 文件
    • 启动本地服务:hexo server或者hexo s。访问:http://localhost:4000/

安装遇到的问题:

我把我安装的文件,直接拖到/blog/source/_posts 目录下,接着我运行hexo shexo g都会报如下错误:

YAMLException: unidentified alias

因为heox g生成博文,是会检查你的文件有没有按照 hexo 的格式。其格式要求为:

---
title: Hello World
date: 2013/7/13 20:46:25
---

只要添加上面格式,就不会报错了

设置git并且生成SSH

设置 git 用户名和邮箱

# 设置
$ git config --global user.name "username"
$ git config --global user.email "email"
# 查看
$ git config user.name
$ git config user.email
  1. 加–global 是为所有 git 项目设置,不加则是在当前目录的 git 项目设置
  2. Git 首次安装必须设置一下用户签名,否则无法提交代码。 **
    这里设置用户签名和登录 GitHub(或其他代码托管中心)的账号
    没有任何关系,因为不部署在GitHub上面**。
    签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁进行的!

生成SSH

配置SSH密钥,实现免密登录(在后面首次提交时需要验证一次服务器密码

ssh-keygen -t rsa -C "上面配置的git邮箱地址"

连续敲回车确定,然后看到提示秘钥以保存在.ssh路径下(如果没有出现提示就多敲几次回车)。

在提示的路径下找到id_rsa文件,复制文件内容,下面配置Git时会用到、

SSH秘钥存放在如下目录:

  • Windows:C:\Users\你的用户名\.ssh
  • MACOS:/Users/你的用户名/.ssh

生成如下两个文件:

  • id_rsa.pub
  • id_rsa

安装服务器环境

安装相关软件

 yum install curl-devel expat-devel gettext - devel openssl-devel zlib-devel perl-devel

Hexo 支持将生成的静态博客部署到 Git 仓库,如 GitHub Pages、GitLab Pages 等。在这个过程中,Hexo 可能会依赖于 Git 客户端,而安装这些开发库往往是为了编译安装 Git 客户端,因为:

  • curl-devel:Git 在与远程仓库进行数据传输时,可能会使用到 curl 库来处理 HTTP/HTTPS 协议的请求。安装 curl-devel 可以确保 Git 能够正确地与远程仓库进行通信,支持从远程仓库拉取和推送代码。
  • expat-develexpat 是一个用于解析 XML 数据的库。在 Git 处理一些与 XML 相关的配置文件或者数据时,可能会用到 expat 库。例如,在处理一些复杂的远程仓库配置时,可能会涉及到 XML 格式的数据解析。
  • gettext-develgettext 是用于实现软件国际化和本地化的工具集。Git 作为一个广泛使用的版本控制系统,需要支持多语言,因此会依赖 gettext 库。安装 gettext-devel 可以确保 Git 在编译时能够正确支持多语言环境。
  • openssl-developenssl 是一个开源的加密库,Git 在进行安全的数据传输时,如通过 SSH 协议连接到远程仓库,需要使用 openssl 进行加密和解密操作。安装 openssl-devel 可以确保 Git 能够正确处理加密通信,保护数据传输的安全性。
  • zlib-develzlib 是一个通用的压缩库,Git 在存储和传输数据时,会对文件进行压缩以节省存储空间和网络带宽。安装 zlib-devel 可以确保 Git 能够正确地进行数据压缩和解压缩操作。
  • perl-devel:Git 有一些脚本和工具是用 Perl 语言编写的,安装 perl-devel 可以确保这些 Perl 脚本能够正常运行,并且在编译 Git 时能够正确处理相关的依赖。

安装git

yum install -y git

**-y**:是一个选项参数,表示在执行安装操作时,自动回答所有提示问题为 “是(yes)”。使用该选项后,当 yum 在安装过程中遇到需要用户确认的提示(例如询问是否继续安装、是否接受软件包的许可证等)时,会自动选择 “是”,无需用户手动干预,从而实现自动化安装。

添加用户和设置密码

[root@14uuZ ~]# useradd xsl 或者 adduser xsl
[root@14uuZ ~]# passwd xsl
更改用户 xsl 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

adduseruseradd 都用于在 Linux 或类 Unix 系统中创建新用户。

  • useradd 命令位于 /usr/sbin 目录下,通常需要超级用户(root 用户)权限才能执行。它会在系统中创建一个新的用户条目,包括用户的主目录、用户组、用户配置文件等。
  • adduser:在 Debian、Ubuntu 等系统里是 Perl 脚本,提供友好交互界面,**底层调用 useradd**;在 CentOS 等系统中是 useradd 的软链接。

passwd 是一个在 Linux、Unix 以及类 Unix 系统中广泛使用的命令,主要用于更改用户的密码。

给用户添加权限

  1. 配置权限需要修改sudoers文件。/etc/sudoers 文件是 sudo 命令的配置文件,用于定义哪些用户或用户组可以使用 sudo 命令以超级用户(root)权限执行某些命令。

    [root@14uuZ ~]# chmod 740 /etc/sudoers
    
    • chmod:这是 Linux 和类 Unix 系统中用于修改文件或目录权限的命令。
    • 740:这是权限设置的参数,采用数字表示法。在这种表示法中,每个数字对应一组权限,分别是文件所有者所属用户组其他用户的权限。每个数字由三个二进制位组成,从左到右分别代表读(r,对应值为 4)、写(w,对应值为 2)、执行(x,对应值为 1)权限。
      • 数字 7 表示 4(读)+ 2(写)+ 1(执行),即文件所有者拥有读、写和执行权限。
      • 数字 4 表示 4(读),即所属用户组拥有读权限。
      • 数字 0 表示没有任何权限,即其他用户没有读、写和执行权限。
  2. 增加xsl用户的权限

    [root@14uuZ ~]# vim /etc/sudoers
    

    使用set nu可以显示行号

    找到100行附近,添加xsl的配置

  3. 把sudoers文件改成只能模式

    [root@14uuZ ~]# chmod 0440 /etc/sudoers
    

    通常 /etc/sudoers 的推荐权限是 0440,即文件所有者和所属用户组有读权限,其他用户无权限。可以使用以下命令设置:

配置SSH秘钥

切换为git用户,配置SSH(把本地配置的秘钥复制到服务器)

### 切换用户
[root@14uuZ ~]# su xsl

### 创建 .ssh 文件夹
[xsl@14uuZ root]$ mkdir ~/.ssh

### 将本地生成的id_rsa.pub文件公钥复制进去
[xsl@14uuZ root]$ vim ~/.ssh/authorized_keys

### 对 /home/xsl/.ssh/authorized_keys 赋予读写权限
[xsl@14uuZ root]$ chmod 600 /home/xsl/.ssh/authorized_keys

### 对 /home/xsl/.ssh 赋予读写执行权限
[xsl@14uuZ root]$ chmod 700 /home/xsl/.ssh

服务器端的 SSH 配置可能不允许使用你提供的密钥进行身份验证,所以需要去检查 /etc/ssh/sshd_config 文件,确认以下配置项是否正确:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

如图,下面的PubkeyAuthentication yes就没有打开

所以,我在验证SSH秘钥的时候报如下错误:

Connection closed by xx.xxx.xxx.xxx port 22

验证SSH是否生效

ssh -v xsl@你的服务器ip

执行过程中出现选择,一律选择yes

运行的时候会要求输入密码

debug1: Next authentication method: password
xsl@xx.xxx.xxx.xxx's password:

这个密码是xsl的密码,因为我们访问的也是xsl@你的服务器ip

当出现Welcome的时候,说明登录成功了

Welcome to Alibaba Cloud Elastic Compute Service !

创建git仓库

为hexo博客创建一个目录,赋予所有权限并设置所有者为git

[root@14uuZ ~]# mkdir /home/hexo
[root@14uuZ ~]# chown xsl:xsl -R /home/hexo
[root@14uuZ ~]# chmod -R 755 /home/hexo
  • chown 是 “change owner” 的缩写,是 Linux 和类 Unix 系统中用于更改文件或目录所有者和所属用户组的命令。
  • **xsl:xsl**:这里冒号分隔的两部分分别代表用户和用户组。在这个命令里,xsl 既作为新的文件所有者,也作为新的所属用户组。也就是说,执行该命令后,目标文件或目录的所有者会变成 xsl 用户,所属用户组会变成 xsl 用户组
  • **-R**:它是 --recursive 的简写形式,是一个选项参数。当使用这个选项时,chown 命令会递归地作用于指定目录及其内部包含的所有子目录和文件。
  • **chmod**:用于修改文件或者目录的读写权限

创建git仓库

[root@14uuZ /]# mkdir /home/repo
[root@14uuZ /]# cd /home/repo
[root@14uuZ repo]# git init --bare hexo.git
初始化空的 Git 版本库于 /home/repo/hexo.git/

创建Git钩子

[root@14uuZ repo]# vim /home/repo/hexo.git/hooks/post-receive

点击键盘“i”建进入编辑模式,然后通过方向键编辑,将以下代码复制进去

git --work-tree=/home/hexo --git-dir=/home/repo/hexo.git checkout -f

点击Esc后输入:wq保存退出

修改repo的权限

[root@14uuZ repo]# chown -R xsl:xsl /home/repo/hexo.git/hooks/post-receive
[root@14uuZ repo]# chmod +x /home/repo/hexo.git/hooks/post-receive
[root@14uuZ repo]# chown -R xsl:xsl /home/repo
[root@14uuZ repo]# chmod -R 755 /home/repo
  • +x:是 chmod 命令的一个选项,其中 + 表示添加权限,x 代表执行权限。所以 +x 的作用就是为指定的文件或目录添加执行权限。

将本地文件部署到服务器上

  1. 在Windows端博客目录下安装部署插件(本地):

    npm install hexo-deployer-git --save
    ## 或者
    cnpm install hexo-deployer-git --save
    
  2. 然后,将本地仓库与远程仓库关联:

    $ git remote add origin xsl@47.119.183.234:/home/repo/hexo.git
    
  3. 修改Hexo配置文件_config.yml的推送地址(本地):

    deploy:
      type: git
      repo: git@你的ip地址:/home/repo/hexo.git
      branch: master
    
  4. 执行下列命令,将静态资源推送到服务器(本地):

    # hexo clean 清理
    D:\00-blog>hexo clean
    INFO  Validating config
    INFO  Deleted database.
    INFO  Deleted public folder.
    
    
    # hexo g 生成静态资源
    D:\00-blog>hexo g
    INFO  Validating config
    INFO  Start processing
    INFO  Files loaded in 3.63 s
    INFO  Generated: archives/2019/index.html
    INFO  Generated: archives/index.html
    
    
    # hexo d 推送到远程
    D:\00-blog>hexo d
    INFO  Validating config
    INFO  Deploying: git
    INFO  Clearing .deploy_git folder...
    INFO  Copying files from public folder...
    INFO  Copying files from extend dirs...
    
    # 推送的过程会要求我们输入 xsl 的密码
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added 'www.linnote.space' (ED25519) to the list of known hosts.
    xsl@www.linnote.space's password:
    

安装Nginx

  1. 安装
yum install -y nginx
  1. 启动

     systemctl start nginx.service
    
  2. 修改配置文件

    vim /etc/nginx/nginx.conf
    

    修改内容如下

    server {
    listen       80;
    listen       [::]:80;
    server_name  修改一:改成对应服务器的IP;
    root         修改二:改成服务器的hexo的仓库:/home/hexo;
    
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    
    error_page 404 /404.html;
    location = /404.html {
    }
    
  3. 重启Nginx

    systemctl restart nginx.service
    
  4. 访问:ip或者域名。目前只能通过http协议去访问。无法使用https的协议访问。但是,目前大多数浏览器,当我们输入网址的时候,都会自动转成https的协议。而如果使用https协议,需要申请SSL证书。一般通过宝塔面板就可以免费申请SSL证书。如果不用宝塔面板,使用Certbot 也可以申请,但申请完之后,需要去Nginx 做一些配置,非常麻烦。

Nginx Proxy Manager

安装

[root@14uuZ ~]# mkdir /home/npm
[root@14uuZ ~]# cd /home/npm/
[root@14uuZ npm]# vim docker-compose.yml
[root@14uuZ npm]# docker compose up -d

docker-compose.yml文件

# version: '3' # 从 Docker Compose v2 开始,version 字段已不再必要
services:
  npm: # 是服务(容器)的名称,可以根据需要自定义
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'              # 不建议修改端口
      - '81:81'              # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
      - '443:443'            # 不建议修改端口
    volumes:
      - ./data:/data         # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
      - ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建
      - /home/hexo:/home/hexo  # 将宿主机的 /home/hexo 挂载到容器内的 /home/hexo

一定要挂载/home/hexo:/home/hexo,否则Nginx Proxy Manager的容器会报错

### 进入到容器
[root@14uuZ npm]# docker exec -it npm-npm-1
"docker exec" requires at least 2 arguments.
See 'docker exec --help'.

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Execute a command in a running container

### 进入到容器后,查看nginx的错误日志
[root@14uuZ npm]# cat /var/log/nginx/error.log


### 发现报如下错误
2025/02/22 16:12:28 [error] 13457#13457: *29 open() "/home/hexo/wordpress/wp-admin/setup-config.php" failed (2: No such file or directory), client: 172.70.242.8, server: linnote.space, request: "GET /wordpress/wp-admin/setup-config.php HTTP/1.1", host: "linnote.space"
2025/02/22 16:12:28 [error] 13457#13457: *29 open() "/home/hexo/404.html" failed (2: No such file or directory), client: 172.70.242.8, server: linnote.space, request: "GET /wordpress/wp-admin/setup-config.php HTTP/1.1", host: "linnote.space"

### 从 Nginx 错误日志可知,主要问题是 Nginx 无法在 /home/hexo 目录下找到请求的文件
### 这注意是因为我没有把 宿主机的 /home/hexo 挂载到容器内的 /home/hexo

登录

访问http://ip:81 ,默认登陆名和密码:

Email:    admin@example.com
Password: changeme

第一次登录的时候需要修改登录用户密码

配置

点击 “Add Proxy Host”(添加反向代理主机)按钮。配置信息如下

Forward Port(转发端口) 是8080。也可以是9999,只要这个端口号未被占用就可以。此端口仅为占位,实际不会用于转发到其他服务。因为我们主要是访问静态资源

接着申请SSL证书,如果不申请,https就无法访问。

点击 “Advanced”(高级)选项卡,在 “Custom Nginx Configuration”(自定义 Nginx 配置)文本框中添加以下内容:

location / {
    root /home/hexo;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
}

这段配置的具体含义如下:

  • location /:匹配所有的请求路径。
  • root /home/hexo:把请求的根目录设定为 /home/hexo
  • index index.html index.htm:将默认的索引文件设置为 index.html 或者 index.htm
  • try_files $uri $uri/ /index.html:按顺序尝试访问请求的文件,如果文件不存在,就尝试访问对应的目录,若都不存在则返回 /index.html

访问顺序

当客户端访问 linnote.space 时,Nginx 会按照如下步骤处理请求:

  1. 匹配 location 块:Nginx 会查找与请求路径匹配的 location 块。由于 location / 是一个通用匹配,会匹配所有请求路径,所以 Nginx 会使用这个 location 块来处理请求。
  2. 查找资源:依据 roottry_files 指令,Nginx 会在 /home/hexo 目录下查找请求的资源。例如,若请求的是 /page.html,Nginx 会尝试访问 /home/hexo/page.html 文件。
  3. 8080 端口的处理:在当前配置下,Forward Port 设置的 8080 端口不会被优先使用。因为 location / 块已经明确指定了如何处理请求,Nginx 会直接从 /home/hexo 目录获取资源,而不会将请求转发到 8080 端口。

总结:由于配置了location,会先访问root目录(根目录) /home/hexo,而不会去访问8080端口

成功访问


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏