从何而来?
Hill Pale

这篇文章记录了我是如何一步步构造这篇文章并使它能够向外展示的
该文章不具备学习意义,仅作为个人纪念
在这里郑重感谢孙女士的资金支持、Gemini老师和deepseek老师的悉心指导

因为我记得你遇到的每一个坑和我们已经实现的每一个功能 —— Gemini

1 服务器的搭建

1.1 服务器的购买

按需向云厂商购买即可,本文使用的是2核、2GiB内存、40GiB硬盘、3Mbis带宽的ECS
该选择什么系统?可参考LinuxJourne的简单介绍

1.2 域名的购买

域名的购买并非必要的,我们可以直接输入服务器的公网ip来进行访问
但域名能提供一个更友好的访问入口,以及,它是一种品牌与标识,一种独享的数字资产

有关域名的疑问

从哪里购买域名?
在域名注册商的商城中查询域名是否还未被注册, 未注册的域名价格合适即可购买
或者向已注册域名的持有人协商交易进行域名的转让

为什么必须从注册商手中购买,不能自己注册吗?
对个人用户来说几乎不可能

域名体系的层级关系大致是:ICANN/政府—>注册局—>注册商—>用户
注册局的职责是管理运维顶级域,域名的注册由通过资格认证的注册商来负责,个人申请认证并不现实
且ICANN明确规定,注册局不能同时担任注册商,所以购买域名只能通过注册商(除少数域名外)

域名之间的价格差异为什么如此之大?
1. 顶级域的价值不同,认知度高,价值也高,例如:.com .net .org
2. 域名的品相不同:长度、含义、商业潜力…
3. 市场的供需关系:投资者、收藏家,与企业品牌相关的域名

而同一域名在不同注册商下价格不同,则是注册商们的不同商业策略所导致的差异了

tips:在中文互联网上,若需要域名能正常解析还需按相关政策进行备案

1.3 远程连接服务器

1.3.1 服务器端

前往云厂商官网,打开服务器实例的防火墙规则
在入方向添加允许22端口的连接,以开启ssh服务

且新服务器可能需要用重置密码功能来设置密码,以便pc连接
下载购买服务器时由云厂商生成的密钥x.pem,以便后续使用密钥连接时使用

1.3.2 pc端

本人使用windows11自带的powershell终端进行连接:ssh root@IP地址

输入密码时,终端界面不会有任何显示,这只是一种保险措施,并非出错

使用密钥登录进行连接:ssh -i "C:\路径\x.pem" root@IP地址

1.3.3 远程连接的安全策略

在云服务器的防火墙规则上,如果IPv4允许0.0.0.0/0,即任何位置的话
可能不够安全,可以对IPv4地址进行限制,仅限pc端的ip进行连接

但是pc使用的家庭网络的公网出口ip会经常变动,所以可能会需要频繁对防火墙规则进行修改
可以使用“异地组网”的技术来避免公网ip波动的问题
但本文采取了另一种策略:放弃密码登录,采用密钥登录

密钥的登录方式如前文所示,如果遇到“Permissions are too open”报错,修复方式如下:
1. 右键点击右键点击.pem文件 -> 属性 -> 安全 -> 高级。
2. 点击 禁用继承,并选择“从此对象中删除所有已继承的权限”。
3. 点击 添加 -> 选择主体 -> 输入你的 Windows 用户名(例如 Admin),检查名称。
4. 只给这个用户 “读取和执行” 及 “读取” 权限,保存。

密钥登录成功后,修改服务器文件禁止密码登录:
1. 编辑SSH配置文件:sudo vi /etc/ssh/sshd_config
2. 修改关键参数:PubkeyAuthentication yes , PasswordAuthentication no
3. 重启SSH服务:sudo systemctl restart ssh

tips:有些系统的SSH服务可能命名为sshd,可以使用这个命令检查:systemctl list-unit-files | grep ssh

当然,远程连接安全措施还有许多:1.修改ssh连接的默认端口;2.禁用root远程登录;3.多次错误锁定;…

2 Linux与Bash的学习

这是漫长且困难的道路,路上的点点滴滴请前往Linux笔记

3 博客方案的选择

方案类型 代表工具 优点 缺点
静态网页托管(SSG) Hexo,Hugo,Astro 免费,快速,安全 需要学习Git与Markdown,无后台
动态内容管理(CMS) WordPress,Typecho 后台界面,插件丰富 需要服务器,维护压力大

3.1 静态与动态

静态网页是已经写死固定的html文件,所有访问者看到的内容都一样

动态网页的内容是实时变化的,不同的访问者可能看到不同的的内容

3.2 后台

后台通常指管理界面

有后台的系统(动态):有登录的界面,可以在公网进行登录,发布文章
无后台的系统(静态):无登录界面,文章需要在PC上编写文件并自行打包上传

3.3 静态与动态的选择

虽然动态网页在“技术量”上比静态网页多,但在使用工具的前提下,动态网页的学习成本反而更低

动态网页之所以“简单”,是因为:

  • 高度抽象化的工具(如WoedPress)简化了复杂的“服务器配置、数据库连接、PHP渲染…”
  • 成熟的生态(如LNMP套件)使得Linux+Nginx+MySQL+PHP可以很好的组合在一起

而静态网页所具有的“极客感”则来自于:

  • 命令行操作,没有图形化界面的终端自带一种神秘感
  • 程序化的工作流:编写MarkDown->Git提交->自动化部署
  • 绝对的控制权,“一切皆文件”的设计赋予开发者足够的操作感

当然,我们可以尝试自己学习动态博客技术,而非仅仅只借用工具,这即是全栈

动态开发技术栈
  1. 后端语言: Python、Node.js、Go
  2. 数据库: MySQL
  3. API设计: RESTful、GraphQL
  4. 服务器运维: Linux、TCP\IP
  5. 网页设计: HTMl、CSS

本文目前采用的是静态网页,nginx + hexo

4 静态博客的搭建

4.1 Nginx

  1. 登录服务器,安装Nginx
1
2
3
4
5
6
7
8
# 更新软件包列表
sudo apt update

# 安装Nginx
sudo apt install nginx

# 检查Nginx是否在运行
systemctl status nginx
  1. 创建博客目录
1
2
3
4
5
6
7
8
9
# 创建名为my_blog的目录
sudo mkdir -p /var/www/my_blog

# 修改目录权限,确保Nginx有权读取
sudo chown -R $USER:$USER /var/www/my_blog
sudo chmod -R 755 /var/www/my_blog

# 测试
echo "<h1>测试</h1>" > /var/www/my_blog/test_index.html
  1. 配置Nginx
  • 创建配置文件
1
2
# 在nginx的配置目录下新建文件
sudo vim /etc/nginx/sites-available/my_blog
  • 写入配置信息
1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80; # 监听 80 端口(HTTP 标准端口)

server_name sunahs.com www.sunahs.com; # sunahs为本文所用域名

root /var/www/my_blog; # 博客文件存放的路径
index index.html; # 默认入口文件

location / {
try_files $uri $uri/ =404; # 如果找不到文件,返回 404
}
}
  • 激活配置
1
2
3
4
5
6
7
8
# 创建软连接到enabled目录
sudo ln -s /etc/nginx/sites-available/my_blog /etc/nginx/sites-enabled/

# 检查语法是否有误
sudo nginx -t

# 无误则重启 Nginx
sudo systemctl restart nginx
  1. 无法正常浏览的可能原因
  • 防火墙:需要在云厂商的安全组规则中添加80端口和443端口的入站流量
  • 域名解析:需要在域名管理后台添加A记录,将@www指向服务器ip
  1. Nginx的常用命令
1
2
3
4
5
6
7
8
# 检查语法错误,在每次修改配置后执行
sudo nginx -t

# 平滑重启,不中断正在访问的用户
sudo systemctl reload nginx

# 查看错误日志
tail -f /var/log/nginx/error.log

4.2 Hexo

4.2.1 环境配置
  1. Git:用于版本管理与云端备份
  2. Node.js:提供Hexo的运行环境
什么是Git

Git是一个分布式版本控制系统,它用于记录文件与目录的历史变化。
个人博客使用Git的好处:1. 版本控制 2. 安全备份与多端同步 3. 自动化部署 4. 学习合作项目的开发工作流

什么是Node.js

Node.js是一个软件,它提供了在操作系统里运行JavaScript的运行环境
所谓的“运行环境”包含了:解释器(Chrome的V8引擎、Firefox的SpiderMonkey引擎)、API、其他配套模块

而“运行时”通常指代码执行时的整个过程,包括内存分配、垃圾回收、事件循环等
但日常交流中,也将提供运行环境的软件称为运行时,Node.js就是JavaScript的运行时
运行时不等于解释器,解释器是运行时的一个核心组件

为什么浏览器可以运行js,而操作系统不行:浏览器内置了运行环境,而windows并没有事先安装
为什么c#运行不需要运行环境:因为在安装vs时,就已经配套完成了c#所需运行环境的安装
浏览器环境和Node.js环境是有所差异的,主要体现在提供的API不同

API全称Application Programming Interface(应用程序编程接口)
API提供一系列函数、对象、方法,让不同的软件之间相互通信、调用功能

下载安装Git,安装选项推荐:

  1. 组件:Git Bash、Git GUI、Asociate .ghit files with default text editor*
  2. 默认编辑器:Visual Studio Code
  3. PATH环境变量:Use Git from Windows Command Prompt
  4. HTTPS传输后端:Use OpenSSL librery
  5. 行结束符:Checkout Windows-style, commit Unix-style
  6. 终端模拟器:Use MinTTY
  7. Git Pull默认行为:fast-forward or merge
  8. 凭证管理器:Git Credential Manager Core

安装后验证:git --version,修改配置:git config

下载安装Node.js,安装后验证:node -vnpm -v(验证前重启终端)

4.2.2 安装Hexo
1
2
3
4
5
6
7
8
9
10
11
12
# 安装 Hexo 命令行工具
npm install -g hexo-cli

# 创建一个文件夹作为博客根目录(my_blog)
mkdir my_blog
cd my_blog

# 初始化 Hexo
hexo init

# 安装博客依赖包
npm install
4.2.3 基础文件
  • _config.yml:全站配置文件
  • source/:博客文章源文件存放地
  • themes/:主题插件存放地
  • public/:编译后文件存放地,将上传至服务器
4.2.4 基础操作命令
  • hexo n "标题"(new):新建文章
  • hexo c(clean):清除缓存
  • hexo g(generate):生成静态文件
  • hexo s(server):启动本地预览
  • hexo d(deploy):部署至服务器

4.3 Git Hooks自动部署

4.3.1 服务器端
  1. 安装Git
1
2
sudo apt update
sudo apt install git
  1. 创建Git仓库
1
2
3
mkdir -p /var/repo/blog.git
cd /var/repo/blog.git
git init --bare
  1. 配置Git Hook
1
2
# 创建并编辑钩子文件
vim /var/repo/blog.git/hooks/post-receive

写入以下内容

1
2
#!/bin/bash
git --work-tree=/var/www/my_blog --git-dir=/var/repo/blog.git checkout -f

保存退出并赋予执行权限

1
chmod +x /var/repo/blog.git/hooks/post-receive
4.3.2 本地电脑端
  1. 安装部署插件
1
2
3
# 移动至Hexo根目录
cd ~/my_blog
npm install hexo-deployer-git --save
  1. 修改Hexo配置文件
    打开根目录下的_config.yml,修改deploy部分
1
2
3
4
deploy:
type: git
repo: root@你的服务器IP:/var/repo/blog.git
branch: master
由 Hexo 驱动 & 主题 Keep
总字数 4.6k 访客数 访问量