Solo搭建个人博客心得(最简版)
Preface
好容易熬过了域名 ICP 备案,可以正式开始搭建博客了……
虽然在社区已经有了很多类似的,使用 Solo 搭建博客的心得,但是我可以说,我这篇心得应该是最清晰明了适合运维小白的,而且也适于运营维护。为什么呢?因为我也是运维小白,很多时候可以理解看到大神们的术语时的痛苦……
0. 前期准备
在正式搭建之前,你要做好如下准备:
- 一台拥有公网 IP 的 Linux 服务器(RH/Debian 或其衍生发行版均可)
- 一个经过 ICP 备案的域名(可以解析到你的 IP 上)
- 在域名提供商那里申请的 SSL 证书文件,注意选择 Nginx 版本的下载到本地备用
注:个人不喜欢在写文章时过多的插入图片,因此希望读者能够拥有一些 Linux 操作的基本能力
1. 方案选择
根据官方指南,最好是使用 Docker 对 Solo 进行部署,同时为了方便运营维护,选用 MySQL 作为数据库为好;同时,为了使服务器作用最大化,而不是由 Solo 独占,可以使用 Nginx 反向代理以处理对 Solo 的访问请求。
这样的话,显然,使用 Docker 部署 Solo 是我们搭建工作的重头戏,Nginx 则以“工具人”的身份出现了……实际上,Solo 框架也可以看做是一个工具人,对我们后续的运维来说,MySQL 中的数据才是最重要的。
所以在参考了众多文章之后,我最后给出的方案是,Solo 和 Nginx 使用 Docker 部署,而 MySQL 则部署在本地,这样方便对 MySQL 的数据库进行备份,也方便 Solo 和 Nginx 的更新。
2. 准备一下
首先,使用 SSH 登录云服务器,更新系统,并安装 Docker 和 MySQL(以 Ubuntu Server 20.04 LTS 为例):
1sudo apt update && sudo apt upgrade -y # 更新系统
2sudo apt install docker mysql-server # 安装docker和MySQL,如果已经安装过可以忽略
然后,使用 docker 启动 Nginx,确定 80 端口是否开放:
1sudo docker run nginx:latest -d --rm --name=nginx --network=host
上面这条命令比较长,基本含义是使用运行最新的 nginx 镜像。-d
是指使用分离模式,即运行在后台;--rm
是为了方便待会停止它的时候可以自动删除该实例;--name
指定了实例的名称;--network
指定了网络模式,配置为 host
的意思是不使用内建的 docker 网桥,而直接使用主机网络进行通信。
现在可以在浏览器地址栏中输入你的 IP 地址,如果可以访问到 nginx 欢迎页面,则证明 80 端口已经打开;否则就要按照你的云服务商的教程打开端口。在我们的配置过程中,需要打开的端口有 80(http 访问)、443(https 访问)、3306(数据库访问)以及 8080(Solo 监听端口,测试用)。你可以一次性将它们都打开。
nginx 访问成功后,使用 sudo docker stop nginx
停止并删除该实例。
现在准备启动 Solo,这一步可以参考官方教程:启动容器一节。这一步的启动命令较为冗长,要有耐心。个人建议命令可以稍微修改一下,加上 --rm
参数,方便测试完之后删除:
1sudo docker run --rm --detach --name solo --network=host \
2 --env RUNTIME_DB="MYSQL" \
3 --env JDBC_USERNAME="root" \
4 --env JDBC_PASSWORD="123456" \
5 --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
6 --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
7 b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=
当 Solo 的实例启动后,可以通过 your_ip_addr:8080
查看是否启动成功,如果看到类似下图的开始使用界面,则证明成功:
现在删除 Solo 的实例,在云服务器设置中关闭 8080 端口,现在已经不再需要它了。
3. 正式搭建
上一步中的所有内容均可以看作测试,现在我们要正式开始搭建博客了。
在你的家目录 ~
下新建一个文件夹,文件夹的结构如下:
1Blogs
2├── backups
3│ └── conf
4│ └── solo.conf
5├── nginx
6│ ├── conf.d
7│ │ └── solo.conf
8│ └── ssl
9│ ├── stephen_zhang.key
10│ └── stephen_zhang.pem
其中,backups
文件夹下是对配置文件的备份,后续还可以存放数据库的备份文件;nginx
文件夹下存在两个子文件夹,分别是 conf.d
,对应 /etc/nginx/conf.d
,而 ssl/
存放的是我们最开始下载好的 SSL 证书文件。nginx
文件夹将会被挂载到 docker 中的 nginx 实例中去。
BTW,证书一般分为两个文件,其中 .pem
文件和 .crt
文件等价。
现在来看 solo.conf
文件:
1upstream backend {
2 server localhost:8080; # Solo 监听端口(不要修改)
3}
4
5server {
6 listen 443 ssl;
7 server_name localhost;
8 access_log off;
9
10 ssl_certificate /ssl/stephen_zhang.pem; # 这里修改为你的证书文件名,路径不要修改
11 ssl_certificate_key /ssl/stephen_zhang.key; # 同上
12 ssl_session_timeout 5m;
13 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
14 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
15 ssl_prefer_server_ciphers on;
16
17 location / {
18 proxy_pass http://backend$request_uri;
19 proxy_set_header Host $http_host;
20 proxy_set_header X-Real-IP $remote_addr;
21 client_max_body_size 10m;
22 }
23}
24
25server {
26 listen 80 default; # default是必须的,否则通过IP访问时只会看到nginx欢迎页面
27 server_name stephen-zhang.cn; # 修改为你的域名
28 rewrite ^(.*) https://$server_name$1 permanent;
29}
按照以上示例,把修改后的 solo.conf
保存好,备用。
为了使 Solo 可以渲染更多的 Markdown 语法,例如 LaTeX 数学公式,脚注等等,我们需要启用 lute-http:
1sudo docker run --detach --name lute \
2 --network=host \
3 --rm b3log/lute-http:latest
然后把上一步中 Solo 的启动命令加以修改,使之可以访问 lute(默认端口为 8249,无需修改,也不必开放此端口)即可:
1sudo docker run --rm --detach --name solo --network=host \
2 --env RUNTIME_DB="MYSQL" \
3 --env JDBC_USERNAME="root" \
4 --env JDBC_PASSWORD="solo19981120" \
5 --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
6 --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
7 b3log/solo:latest --listen_port=8080 \
8 --server_scheme=https --server_host=localhost --server_port= \
9 --lute_http=http://localhost:8249
当然了,我们要为自己的博客配置 HTTPS,那么上述命令中的 --server_scheme
的值必须是 https
,否则通过 HTTPS 访问时会产生异常。
最后,启动 nginx 反代即可:
1sudo docker run --detach --rm --name nginx \
2 --volume ~/Blogs/nginx/ssl/:/ssl/ \
3 --volume ~/Blogs/nginx/conf.d/solo.conf:/etc/nginx/conf.d/solo.conf \
4 --network=host nginx:latest
这条命令使用 --volume
参数将我们自己的 ssl/
挂载到了 docker 中的 /ssl/
下,所以 solo.conf
中证书的路径只能是 /ssl/....
;同时它也用该参数将 solo.conf
挂载到了 docker 中的 /etc/nginx/conf.d/solo.conf
下,即 nginx 实例使用该配置文件进行反向代理。
现在,可以通过如下的方式访问你的博客了:
- 域名:
http://your_domain_name
或者https://your_domain_name
均可 - IP 地址:
http://your_ip_addr
注:证书是和域名绑定的,因此不要用 https://your_ip_addr
的方式去访问,否则浏览器会报证书错误的异常。
到此,博客的搭建就结束了,你可以把我们上面用到的命令保存为 bash 脚本,方便重启博客时使用。
4. 优化
优化主要针对两种情况:一种是云服务器带宽太小,另一种是云服务器内存太小。
当带宽小时,我们可以使用 CDN 加速器,对博客的一些公有资源进行加速,例如内置的皮肤资源(对第三方皮肤无效)。这时,只需要在启动 Solo 实例的命令后添加如下选项并重启即可:
1--static_server_scheme=https
2--static_server_host=cdn.jsdelivr.net
3--static_server_port=
4--static_path=/gh/88250/solo/src/main/resources
对于服务器内存太小,无法支撑 MySQL 的消耗的情况,可以设法对 MySQL 进行配置,或者选用 H2 Database 作为默认的数据库。
标题:Solo搭建个人博客心得(最简版)
作者:StephenZhang
地址:https://stephen-zhang.cn/articles/2020/08/30/1598764097502.html