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 为例):
sudo apt update && sudo apt upgrade -y # 更新系统
sudo apt install docker mysql-server # 安装docker和MySQL,如果已经安装过可以忽略
然后,使用 docker 启动 Nginx,确定 80 端口是否开放:
sudo 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
参数,方便测试完之后删除:
sudo docker run --rm --detach --name solo --network=host \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=
当 Solo 的实例启动后,可以通过 your_ip_addr:8080
查看是否启动成功,如果看到类似下图的开始使用界面,则证明成功:
现在删除 Solo 的实例,在云服务器设置中关闭 8080 端口,现在已经不再需要它了。
3. 正式搭建
上一步中的所有内容均可以看作测试,现在我们要正式开始搭建博客了。
在你的家目录 ~
下新建一个文件夹,文件夹的结构如下:
Blogs
├── backups
│ └── conf
│ └── solo.conf
├── nginx
│ ├── conf.d
│ │ └── solo.conf
│ └── ssl
│ ├── stephen_zhang.key
│ └── stephen_zhang.pem
其中,backups
文件夹下是对配置文件的备份,后续还可以存放数据库的备份文件;nginx
文件夹下存在两个子文件夹,分别是 conf.d
,对应 /etc/nginx/conf.d
,而 ssl/
存放的是我们最开始下载好的 SSL 证书文件。nginx
文件夹将会被挂载到 docker 中的 nginx 实例中去。
BTW,证书一般分为两个文件,其中 .pem
文件和 .crt
文件等价。
现在来看 solo.conf
文件:
upstream backend {
server localhost:8080; # Solo 监听端口(不要修改)
}
server {
listen 443 ssl;
server_name localhost;
access_log off;
ssl_certificate /ssl/stephen_zhang.pem; # 这里修改为你的证书文件名,路径不要修改
ssl_certificate_key /ssl/stephen_zhang.key; # 同上
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend$request_uri;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 10m;
}
}
server {
listen 80 default; # default是必须的,否则通过IP访问时只会看到nginx欢迎页面
server_name stephen-zhang.cn; # 修改为你的域名
rewrite ^(.*) https://$server_name$1 permanent;
}
按照以上示例,把修改后的 solo.conf
保存好,备用。
为了使 Solo 可以渲染更多的 Markdown 语法,例如 LaTeX 数学公式,脚注等等,我们需要启用 lute-http:
sudo docker run --detach --name lute \
--network=host \
--rm b3log/lute-http:latest
然后把上一步中 Solo 的启动命令加以修改,使之可以访问 lute(默认端口为 8249,无需修改,也不必开放此端口)即可:
sudo docker run --rm --detach --name solo --network=host \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="solo19981120" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \
b3log/solo:latest --listen_port=8080 \
--server_scheme=https --server_host=localhost --server_port= \
--lute_http=http://localhost:8249
当然了,我们要为自己的博客配置 HTTPS,那么上述命令中的 --server_scheme
的值必须是 https
,否则通过 HTTPS 访问时会产生异常。
最后,启动 nginx 反代即可:
sudo docker run --detach --rm --name nginx \
--volume ~/Blogs/nginx/ssl/:/ssl/ \
--volume ~/Blogs/nginx/conf.d/solo.conf:/etc/nginx/conf.d/solo.conf \
--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 实例的命令后添加如下选项并重启即可:
--static_server_scheme=https
--static_server_host=cdn.jsdelivr.net
--static_server_port=
--static_path=/gh/88250/solo/src/main/resources
对于服务器内存太小,无法支撑 MySQL 的消耗的情况,可以设法对 MySQL 进行配置,或者选用 H2 Database 作为默认的数据库。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于