📝 从零搭建个人博客:从云服务器到上线运行的完整指南
本文档基于
CentOS 7 + 阿里云 ECS + Docker + Nginx + Halo
构建,全程可复现,适合 0 基础小白跟着操作。
一、云平台操作(阿里云 ECS)
1. 购买与配置云服务器
登录阿里云控制台 → 进入 云服务器 ECS → 点击「创建实例」
选择配置:
计费方式:按量付费(测试用)/ 包年包月(长期用)
地域:推荐选择香港服务器,网站无需备案
实例规格:2 核 2G(入门足够)
镜像:CentOS 7.x 64 位
系统盘:高效云盘 40GB+
- 网络与安全组:
公网 IP:勾选「分配公网 IPv4 地址」
带宽计费:按使用流量
安全组:新建安全组,放行 22、80、443 端口(后续按需添加)
- 登录凭证:
- 选择「自定义密码」,设置 root 密码(务必记住)
- 确认订单并创建实例,等待实例状态变为「运行中」
二、本地 SSH 工具连接服务器
1. 选择 SSH 工具
个人使用:WindTerm
2. 建立连接
以 WindTerm 为例:
- 打开 WindTerm → 点击「+ 新建会话」
- 协议选择
SSH,主机填写你的公网 IP,端口22
- 用户名
root,点击继续后输入密码即可登录
- 点击连接,成功后会看到欢迎链接阿里巴巴云服务器提示符
![]()
三、 安装 Docker
1. 系统更新与基础工具安装
# 更新系统包 yum update -y # 安装常用工具 yum install -y vim wget curl git2.更换 Yum 源为阿里云源(提升 yum 下载速度和稳定性)
确保后续
yum install(包括 Docker 及其依赖)更快、更稳定,建议先将 CentOS 默认的官方 yum 源替换为 阿里云的 CentOS 7 源。备份原有 CentOS-Base.repo(可选但建议)
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup下载阿里云的 CentOS 7 源配置文件
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo该源由阿里云官方提供,国内访问速度快、稳定可靠。
清理并重建 Yum 缓存
sudo yum clean all sudo yum makecache让 yum 使用新的阿里云源,后续安装软件会快很多。
3.卸载docker
如果之前安装过旧版 Docker(如
docker、docker-engine),建议先卸载,避免冲突。sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine4.安装 Docker CE(社区版)的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2这些是 Docker 安装所需的依赖工具,用于管理 yum 源及存储驱动。
5.添加阿里云的 Docker CE Yum 源(推荐)
docker 官方为 CentOS 提供了 Docker CE 的 yum 源,阿里云提供了该源的国内镜像,更加稳定快速。
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo6.查看可安装的 Docker CE 版本(推荐操作)
Docker 官方可能推送较新但不兼容 CentOS 7 的版本(如 26.x),我们推荐安装 20.10.x 或 24.x 等稳定且兼容的版本。
# 运行以下命令,查看所有可用版本(按版本排序,最新的在上面) yum list docker-ce --showduplicates | sort -r7.安装指定版本的 Docker CE(推荐 20.10.9 或 24.0.7)
不要直接运行
yum install docker-ce,否则可能默认安装最新的 26.x,与 CentOS 7 不兼容,明确指定版本号,推荐安装以下稳定版本之一:
选项 1:安装 Docker 24.0.7(推荐,较新且稳定)
sudo yum install -y docker-ce-24.0.7-1.el7 docker-ce-cli-24.0.7-1.el7 containerd.io选项 2:安装 Docker 20.10.9(经典稳定版,兼容性好)
sudo yum install -y docker-ce-20.10.9-3.el7 docker-ce-cli-20.10.9-3.el7 containerd.io以上命令中,同时安装了
docker-ce、docker-ce-cli和containerd.io,这是 Docker 正常运行所必需的组件。8.启动 Docker 并设置开机自启
# 启动 Docker 服务 : 这个只是当前启动,若linux系统关闭了,还需要重 sudo systemctl start docker # 设置开机自动启动 sudo systemctl enable docker # 查看 Docker 运行状态 sudo systemctl status docker如果显示
active (running),说明 Docker 已成功启动。9.验证 Docker 是否安装成功
# 查看 Docker 版本 docker --version # 运行一个测试容器 sudo docker run hello-world如果看到如下输出,说明 Docker 安装成功:
Hello from Docker!10.配置镜像加速地址
默认情况下,Docker 会从 Docker Hub(https://registry-1.docker.io) 拉取镜像,但国内访问速度慢,还容易超时。强烈建议配置国内镜像加速器!
什么是 Docker 镜像加速器?
Docker 镜像加速器是由 国内云服务商(如阿里云、网易、中科大等) 提供的 国内缓存服务,可以大幅提升 拉取 Docker Hub 镜像的速度与稳定性。
可以使用以下 公共镜像加速地址(免费,无需登录):
镜像源 加速地址 网易云 https://hub-mirror.c.163.com 中科大 https://docker.mirrors.ustc.edu.cn DaoCloud https://f1361db2.m.daocloud.io 腾讯云(需要登录) https://mirror.ccs.tencentyun.com 阿里云(需要登录获取个人地址) https://<你的ID>.mirror.aliyuncs.com 华为云(需要登录获取个人地址) https:/ .mirror.swr.myhuaweicloud.com 获取阿里云个人加速地址:
- 登录 阿里云容器镜像服务控制台
- 找到 “镜像加速器”
- 阿里云会提供类似如下的地址:
温馨提示:这里我用的是阿里云的镜像加速地址(根据自己使用的云平台去选择)
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xkw8xit4.mirror.aliyuncs.com"] } EOF # 重启 Docker 服务,使配置生效 sudo systemctl daemon-reload sudo systemctl restart docker如果你没有阿里云账号,推荐直接使用 网易云 或 中科大 的公共地址。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
四、部署 Halo 博客应用
1. 创建项目目录结构
# 创建博客根目录 mkdir -p /root/my_blog cd /root/my_blog2. 编写 Docker Compose 配置
vim docker-compose.yml镜像说明:
version: "3" services: halo: image: registry.fit2cloud.com/halo/halo-pro:2.22 #这里的image需要根据上方镜像说明选择免费社区版or付费版 restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./halo2:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: # JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数 - JVM_OPTS=-Xmx256m -Xms256m command: - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.username=root # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 - --spring.r2dbc.password=o#DwN&JSa56 - --spring.sql.init.platform=mysql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ halodb: image: mysql:8.1.0 restart: on-failure:3 networks: halo_network: command: - --default-authentication-plugin=caching_sha2_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true volumes: - ./mysql:/var/lib/mysql - ./mysqlBackup:/data/mysqlBackup healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] interval: 3s retries: 5 start_period: 30s environment: # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 - MYSQL_ROOT_PASSWORD=o#DwN&JSa56 - MYSQL_DATABASE=halo networks: halo_network:
3. 启动 Halo 容器
docker-compose up -d4. 验证 Halo 启动
# 查看容器状态 docker ps | grep halo # 查看日志(可选)查看最新50条日志 docker logs --tail 50 logs my_blog-halo-1访问
http://你的公网IP:8090,如果能看到 Halo 初始化页面,说明部署成功。
到这一步你的个人blog就可以公网访问了!
五、配置 Nginx 反向代理与 HTTPS(web网站安全和可靠性)
1. 创建 Nginx 配置目录
mkdir -p /root/my_blog/nginx/conf.d cd /root/my_blog/nginx/conf.d2. 编写 Nginx 站点配置
vim huizicoding.conf server { listen 80; server_name 你的域名 www.你的域名; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name huizicoding.top www.huizicoding.top; # 添加这两行来增大上传限制 client_max_body_size 20M; client_body_buffer_size 128k; ssl_certificate /etc/nginx/conf.d/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/conf.d/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://公网ip地址: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; } }3. 启动 Nginx 容器
docker run -d \ --name nginx \ --network halo_network \ -p 80:80 \ -p 443:443 \ --restart=always \ -v /root/my_blog/nginx/conf.d:/etc/nginx/conf.d \ -v /root/my_blog/nginx/html:/usr/share/nginx/html \ -v /root/my_blog/nginx/logs:/var/log/nginx \ nginx:latest
4. 申请 SSL 证书(Let’s Encrypt)
# 安装 Certbot yum install -y certbot # 停止 Nginx 以释放 80 端口 docker stop nginx #创建证书存放目录 mkdir -p /home/nginx/conf.d/ssl # 申请证书(替换为你的域名和邮箱) certbot certonly --standalone -d 你的域名 -d www.你的域名 --email 你的邮箱地址 --agree-tos --non-interactive #复制证书到刚才创建的文件 cp /etc/letsencrypt/live/huizicoding.top/fullchain.pem /home/nginx/conf.d/ssl/ cp /etc/letsencrypt/live/huizicoding.top/privkey.pem /home/nginx/conf.d/ssl/ # 启动 Nginx docker start nginx
六、配置证书自动续期
1. 初始化定时任务
crontab -e首次执行会提示
no crontab for root - using an empty one,直接保存退出即可。2. 添加自动续期任务
echo "0 2 \* \* \* certbot renew --quiet && cp -f /etc/letsencrypt/live/huizicoding.top/fullchain.pem /root/my\_blog/nginx/conf.d/ssl/ && cp -f /etc/letsencrypt/live/huizicoding.top/privkey.pem /root/my\_blog/nginx/conf.d/ssl/ && docker restart nginx" >> /var/spool/cron/crontabs/root3. 验证定时任务
crontab -l如果能看到续期命令,说明配置成功。
七、收尾与验证
访问博客:打开浏览器,访问
https://www.huizicoding.top,确认地址栏显示绿色小锁。域名绑定:登录 Halo 后台 → 系统 → 博客设置 → 外部访问地址,修改为
https://www.你的域名。测试图片上传:在后台尝试上传图片,确认不会出现 413 错误。
八、常见问题排查
问题 排查命令 解决思路 无法访问网站 ping 外网IP、telnet 外网IP 80检查安全组、防火墙端口是否放行 应用启动失败 docker logs my_blog-halo-1查看日志定位错误原因 413 Request Entity Too Large 无 增大 client_max_body_size证书过期 certbot certificates手动执行续期命令或检查定时任务
Halo个人blog从零开始
Linux基础
2025-07-02
已抵达博客尽头






