Solo 搭建个人博客心得(最简版)

本贴最后更新于 1575 天前,其中的信息可能已经水流花落

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 查看是否启动成功,如果看到类似下图的开始使用界面,则证明成功:

start using

现在删除 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 作为默认的数据库。

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1435 引用 • 10056 回帖 • 489 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • harrying

    为什么我的帖子下边不能评论

    1 回复
  • 其他回帖
  • yf98

    现在帖子同步到社区才有评论。。。