基于用什么,搞什么的目的,我搭建了这套十分简单的docker-compose+nginx的博客架构,这套架构足以应付我目前的需求:
个人使用或极少量的外部流量进入
使用域名作为网站地址,看起来高大上一些
维护简单方便,不需要复杂搞一些网络打通工作,也避免github托管造成的访问慢、偶尔需要科学上网等问题
因此我选择了使用阿里云ECS+docker-compose部署+阿里云dns解析+nginx正向代理
基于docker-compose的halo博客后台搭建
服务器选择
首先我在阿里云(我不是阿里云的托!我的老东家是华为云!)选择了一套99计划的个人建站服务器,价格还算ok,主要是云服务托管比较方便,还带一个公网ip,也不需要使用向日葵那些东西做内网穿透
还有一些人推荐github托管,客观比较一下这几种方案的优缺点:
阿里云、华为云以及各类小的云平台相比之下,国内访问网络是得以保证的,不需要科学,任何场景都可以直接登录。这些云服务提供商比较下来,华为云的活动少一些,价格略贵,阿里云的活动会多一些,这两家功能其实差不多,是对标的,但是阿里云好的一点在于移动端是还比较好用的,华为云的移动端起码到目前为止是不太行的。至于各类小云平台,价格确实便宜,但是我比较担心这些小服务商能不能撑得住。所以排除。
github托管完全免费,更适合动手能力强爱折腾的,一个问题就是网络不太好,我个人电信的网一般是上不去,要科学上网,麻烦,所以放弃了这个方案
博客后台选型
服务器搞好之后开始选型博客后台,看了一段时间,最终选择了halo、wordpress,二者衡量:
halo升级2.x之后更新的功能都比较强大了,也是自带社区的,但是比起wordpress的可扩展性和社区规模差的还是不少,但是halo胜在部署简单,升级简单,我个人的需求是博客后台搭建和升级上面不花费太大精力(怕消磨自己写博客的耐心),最终选择了halo
wordpress是个人建站比较首选的,也是最经久不衰的个人建站工具,如果完全不care折腾,我还是推荐用wordpress的
halo的部署流程参考了官方文档:使用 Docker Compose 部署
在部署的时候,我对docker-compose.yaml做了一些简单的修改,就是把数据库的端口暴露了一下,方便我自己登上去了解halo后台的逻辑,我的docker-compose.yaml内容如下:
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.20.10
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/root/.halo2
ports:
- "pppp:pppp"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=*******
- --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=*******
- MYSQL_DATABASE=halo
ports:
- "pppp:pppp"
其中,把port做了下屏蔽,有需求可以自行修改
如果对副本数有需求,可以通过补充replicas标签实现:
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.20.10
restart: on-failure:3
deploy:
replicas: 2
……
这样一个博客后台就成功搭建起来了,使用阿里云的公网ip:8090端口就可以登录博客前台,而ip:8090/console可以登录博客后台
域名解析和nginx正代
dns和备案
如果直接使用ip:8090登录,那这个博客看起来也太low了,那么我需要一个域名做dns解析,这里基于就近原则,还是选择了阿里
几块钱到几十块钱不等买个域名,然后就可以做备案了,否则直接解析的域名会被拦掉
阿里云的备案首页在:https://beian.aliyun.com/
我从提交信息到完成备案大概等了20天多点30天不到,等不了的话期间也是可以通过ip:port访问的
nginx正代
备案完成后,就可以使用域名:端口的格式进行登录了,但是这样看起来还是比较low的,如果想把端口也干掉,改为纯域名登录,大概有两种方案:
把后台端口暴露成80,这样不写端口就是默认的了,不推荐
使用nginx做个正向代理
高级一点,还是选择第二种方案,依旧使用docker-compose部署,nginx的docker-compose.yaml如下:
services:
nginx:
image: nginx:latest
container_name: nginx # 容器名称
restart: always # 自动重启
environment:
- TZ=Asia/Shanghai # 设置时区
ports:
- "80:80" # 映射端口
deploy:
resources:
limits:
cpus: "0.5" # 限制 CPU 核心数
memory: "512M" # 限制内存大小
volumes:
- /opt/nginx/nginx.conf:/etc/nginx/nginx.conf # 配置持久化
这里在volumes标签中挂载了nginx.conf文件,因此也必须把nginx.conf创建在/opt/nginx/路径下面,内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 200M;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name xx.xx.xx.xx *.chymfatfish.cn www.chymfatfish.cn;
location / {
proxy_pass http://xx.xx.xx.xx:pppp;
}
}
}
这里比较关键的就是server标签:
listen标签表示nginx监听80端口
server_name表示外部访问这些地址,都可以被路由,可以通过空格指定多个地址,这里指定的就是我的ip和在阿里云购买的域名
location表示正向代理的地址,即访问上面的地址和80端口,将会被代理到我指定的ip:port,这里的ip使用的是阿里云的公网ip,如果使用127.0.0.1,目前发现代理过不去,怀疑是因为docker网桥没有搭建好,感兴趣可以自行研究下
到这里一个简单的博客框架就搭建好了
菜单图标引入
涉及到一点前端知识,但不多
halo是支持阿里的iconfont图标库的
把需要的图标添加进自己的项目,然后在我的项目首页找到对应图标,使用Symbol引入方式,选择复制代码
例如该图标的格式为icon-jingcaishunjian1
,需要拼接成iconfont icon-jingcaishunjian1
的形式添加到图标链接里面
评论区