搭建博客_https证书_反向代理
由于我购买的的云服务器性能较低,在开始前,先配置一个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 nginx2. 创建 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 告诉你 ok 和 successful,你的域名就已经成功“裸奔”了
打开浏览器,直接在地址栏输入 http://blog.xiaowenli.com(不要加 8090)。你应该能瞬间看到你的博客主页了
HTTPS
在 SSL 证书的世界里,主要分两种情况:
单域名证书(你目前最容易白嫖到的):
这种证书非常“死板”,一张证书只能保护一个精确的域名。
比如你给
blog.xiaowenli.com申请了一张,它就只能用在博客上。如果你以后把算法项目挂在ai.xiaowenli.com上,用这张证书浏览器就会报警提示“证书不匹配”。优点:阿里云每年会免费赠送 20 张这种个人测试证书(有效期 3 个月)。对于个人开发者来说,完全可以给博客申请一张,给 AI 网站申请另一张,分开管理。
泛域名证书(通配符证书):
这种证书极其强大,你只要申请一张
*.xiaowenli.com的证书,它就能无限保护你所有的子域名(blog,ai,www,test等等全包了)。缺点:非常昂贵(商业版通常几千块一年)。虽然可以通过 Let's Encrypt 等工具免费生成,但配置起来需要极其繁琐的 DNS 验证。
以下演示的是第二种方式:
1. 拿到阿里云的“备用钥匙”(AccessKey)
这把钥匙是脚本和阿里云沟通的桥梁。
登录你的阿里云控制台。
鼠标悬停在右上角你的用户头像上,点击 “AccessKey 管理”。
强烈建议选择 “开始使用子用户 AccessKey”(更安全),创建一个只拥有
AliyunDNSFullAccess(管理云解析DNS)权限的子用户。创建完成后,你会得到两个非常重要的字符串:
AccessKey ID和AccessKey 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.save、default.conf 或者其他你之前测试建的文件,那 Nginx 肯定把它们也加载进去了。
有重复文件,看以下操作:
1. 彻底销毁旧文件和无用默认文件
直接复制这两行执行,把里面的脏东西全部清空:
sudo rm /etc/nginx/conf.d/halo.conf
sudo rm /etc/nginx/conf.d/default.conf2. 创建一个干干净净的新文件
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