9
0

搭建博客_https证书_反向代理

2026-05-21
2026-06-07

由于我购买的的云服务器性能较低,在开始前,先配置一个2GB的Swap。

# 1. 创建一个 2GB 的 Swap 文件
sudo fallocate -l 2G /swapfile

# 2. 设置正确的权限(出于安全考虑)
sudo chmod 600 /swapfile

# 3. 将文件格式化为 Swap 格式
sudo mkswap /swapfile

# 4. 启用 Swap
sudo swapon /swapfile

# 5. 设置开机自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 6. 关键一步:调整 swappiness (告诉系统更积极地使用 Swap)
# 默认通常是 60,我们可以临时设置为 60 确保生效,或者调高一点
sudo sysctl vm.swappiness=60
echo 'vm.swappiness=60' | sudo tee -a /etc/sysctl.conf

安装docker

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# step 2: 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Step 3: 写入软件源信息
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 
# Step 4: 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Step 5: 验证Docker是否安装成功
sudo docker -v

安装Halo镜像

docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 -e JVM_OPTS="-Xmx256m -Xms256m" registry.fit2cloud.com/halo/halo:2.24.2

docker ps

请打开你电脑上的浏览器,在新标签页输入以下网址(推荐用第一个你的专属域名)(该域名需要先自己创建):

  • http://blog.xiaowenli.com:8090

敲下回车,你应该就能看到一个漂亮、干净的 Halo 初始化安装向导页面了! 按照页面上的提示,设置一下你的管理员账号、密码、邮箱和站点名称

域名管理

在域名管理处可以创建多个子域名,并解析到公网ip,之后通过Nginx反向代理

Nginx

1. 安装 Nginx

# step 1: 安装前置工具
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

# step 2: 导入官方的nginx签名密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

# Step 3: 为稳定的nginx包搭建apt仓库
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
 
# Step 4: 设置仓库
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

# Step 5: 安装nginx
sudo apt update
sudo apt install nginx

2. 创建 Nginx 专属配置文件

使用 nano 编辑器新建一个名为 halo.conf 的配置文件:

sudo nano /etc/nginx/conf.d/halo.conf

把下面这段配置代码完整地复制并粘贴进终端。这段配置会告诉 Nginx:只要有人访问你的域名,就把流量默默地送到 8090 房间。

server {
    listen 80;
    server_name blog.xiaowenli.com xiaowenli.com www.xiaowenli.com;

    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

(操作提示:粘贴完成后,按 Ctrl + O 保存,按 Enter 确认文件名,最后按 Ctrl + X 退出编辑器。)

3. 测试并重启 Nginx

接下来,我们需要把刚才写好的配置激活,并让 Nginx 重新加载:

# 测试配置文件语法是否正确
sudo nginx -t

# 如果上面输出 ok 和 successful,就执行下面这句让配置生效
sudo systemctl reload nginx

若上面出错,说明不需要 reload,而是需要直接 start(启动)他,顺便让他以后每次服务器重启都自动打卡上班(开机自启)。


# 1. 正式启动 Nginx 服务
sudo systemctl start nginx

# 2. 设置 Nginx 开机自启(防止以后服务器重启了网站打不开)
sudo systemctl enable nginx

上面 sudo nginx -t 告诉你 oksuccessful,你的域名就已经成功“裸奔”了

打开浏览器,直接在地址栏输入 http://blog.xiaowenli.com(不要加 8090)。你应该能瞬间看到你的博客主页了

HTTPS

在 SSL 证书的世界里,主要分两种情况:

  1. 单域名证书(你目前最容易白嫖到的):

    • 这种证书非常“死板”,一张证书只能保护一个精确的域名

    • 比如你给 blog.xiaowenli.com 申请了一张,它就只能用在博客上。如果你以后把算法项目挂在 ai.xiaowenli.com 上,用这张证书浏览器就会报警提示“证书不匹配”。

    • 优点:阿里云每年会免费赠送 20 张这种个人测试证书(有效期 3 个月)。对于个人开发者来说,完全可以给博客申请一张,给 AI 网站申请另一张,分开管理。

  2. 泛域名证书(通配符证书):

    • 这种证书极其强大,你只要申请一张 *.xiaowenli.com 的证书,它就能无限保护你所有的子域名(blog, ai, www, test 等等全包了)。

    • 缺点:非常昂贵(商业版通常几千块一年)。虽然可以通过 Let's Encrypt 等工具免费生成,但配置起来需要极其繁琐的 DNS 验证。

以下演示的是第二种方式:

1. 拿到阿里云的“备用钥匙”(AccessKey)

这把钥匙是脚本和阿里云沟通的桥梁。

  1. 登录你的阿里云控制台。

  2. 鼠标悬停在右上角你的用户头像上,点击 “AccessKey 管理”

  3. 强烈建议选择 “开始使用子用户 AccessKey”(更安全),创建一个只拥有 AliyunDNSFullAccess(管理云解析DNS)权限的子用户。

  4. 创建完成后,你会得到两个非常重要的字符串:AccessKey IDAccessKey Secret。请把它们复制到你电脑的记事本里备用。(注意保密,千万别发给我!

  • 点击那个蓝色的 “新增授权”

  • 在弹出的侧边栏里,左侧的搜索框输入 DNS

  • 在下方出现的搜索结果里,找到并点击 AliyunDNSFullAccess (管理云解析(DNS)的权限),让它跑到右侧的已选列表里。

  • 点击底部的 “确定”,完成授权。

2. 在服务器上安装 acme.sh 机器人

回到你的服务器 SSH 终端,直接执行下面这行命令安装(记得把邮箱换成你自己的真实邮箱):

curl https://get.acme.sh | sh -s email=你的邮箱@example.com

刷新系统环境

source ~/.bashrc
# 1. 填入你的 ID(保留双引号,把中文替换掉)
export Ali_Key="你的AccessKey_ID"

# 2. 填入你的 Secret(保留双引号,把中文替换掉)
export Ali_Secret="你的AccessKey_Secret"

# 3. 召唤机器人自动申请泛域名证书
~/.acme.sh/acme.sh --issue --dns dns_ali -d xiaowenli.com -d '*.xiaowenli.com'

3. 将Https装进 Nginx

  • 拷贝并安装证书

直接复制这整段长命令(这是一个整体,一次性复制),粘贴到终端并回车:

sudo mkdir -p /etc/nginx/cert
~/.acme.sh/acme.sh --install-cert -d xiaowenli.com --ecc \
--key-file       /etc/nginx/cert/xiaowenli.com.key  \
--fullchain-file /etc/nginx/cert/fullchain.cer \
--reloadcmd     "sudo systemctl reload nginx"
  • 修改Nginx配置文件

打开配置文件

sudo nano /etc/nginx/conf.d/halo.conf

替换内容

# ========================================================
# 第一道防线:默认兜底(拒绝所有未明确配置的域名访问,如 ai.xiaowenli.com)
# ========================================================
server {
    listen 80 default_server;
    server_name _;
    return 403; # 普通连接直接拒绝
}

server {
    listen 443 ssl default_server;
    server_name _;
    
    # 复用你的泛域名证书,防止浏览器弹证书错误,而是直接优雅地拒绝
    ssl_certificate /etc/nginx/cert/fullchain.cer;
    ssl_certificate_key /etc/nginx/cert/xiaowenli.com.key;
    
    return 403; # 加密连接也直接拒绝
}


# ========================================================
# 第二道防线:专属特权通道(只允许 blog.xiaowenli.com 访问博客)
# ========================================================
server {
    listen 80;
    server_name blog.xiaowenli.com;
    # 强制跳转到 HTTPS 加密通道
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name blog.xiaowenli.com; # 移除其他域名,这里只留这一个独苗

    ssl_certificate /etc/nginx/cert/fullchain.cer;
    ssl_certificate_key /etc/nginx/cert/xiaowenli.com.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

(操作提示:粘贴完成后,按 Ctrl + O 保存,按 Enter 确认,最后按 Ctrl + X 退出。)

  • 测试并重启生效

sudo nginx -t
sudo systemctl reload nginx

若遇到Nginx 最经典的“幽灵配置”事件

先排除浏览器的缓存干扰。

🕵️‍♂️ 捉虫行动

直接在你的终端里,依次复制并执行这两行排查命令:

1. 全局搜索“内鬼”

执行下面这行命令,它会让 Nginx 交出所有写了 server_name 的清单:

sudo grep -r "server_name" /etc/nginx/

仔细看输出结果:正常情况下,关于博客的 server_name 应该只剩下一行包含 blog.xiaowenli.com。如果你在输出结果里,依然看到了单独的 xiaowenli.com 或者 www.xiaowenli.com,那就说明旧代码没删干净。

2. 检查是否有“影分身”文件

有时候 nano 编辑器意外退出,或者咱们不小心手滑,可能会产生多余的配置文件。执行这行:

ls -l /etc/nginx/conf.d/

正常情况下,这个文件夹里应该只有 halo.conf 这一个文件。如果你看到了类似 halo.conf.savedefault.conf 或者其他你之前测试建的文件,那 Nginx 肯定把它们也加载进去了。

有重复文件,看以下操作:

1. 彻底销毁旧文件和无用默认文件

直接复制这两行执行,把里面的脏东西全部清空:

sudo rm /etc/nginx/conf.d/halo.conf
sudo rm /etc/nginx/conf.d/default.conf

2. 创建一个干干净净的新文件

sudo nano /etc/nginx/conf.d/halo.conf

3. 粘贴这份绝对纯净的终极代码

(这里面只有我们精心设计的“默认拒绝”和“博客独占”两道防线,放心粘贴):

server {
    listen 80 default_server;
    server_name _;
    return 403;
}

server {
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /etc/nginx/cert/fullchain.cer;
    ssl_certificate_key /etc/nginx/cert/xiaowenli.com.key;
    return 403;
}

server {
    listen 80;
    server_name blog.xiaowenli.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name blog.xiaowenli.com;
    ssl_certificate /etc/nginx/cert/fullchain.cer;
    ssl_certificate_key /etc/nginx/cert/xiaowenli.com.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

(按 Ctrl + O 保存,回车,Ctrl + X 退出)

4. 测试并生效

sudo nginx -t
sudo systemctl reload nginx

评论