SHO酱的Blog

SHO酱的Blog

20191209:综合成果汇总报告

2019-12-09

使用的工具

前言

之前 Blog 的程序一直在使用 Tale,在使用 Tale 的过程中遇到了不少 Bug,会导致文章无法正常发布;但最近不短的一段时间里 Tale 都不更新了,而且原作者的 Tale 站点也已经 502 了,让人怀疑 Tale 是不是已经死了?

于是找到了 Solo,经过简单试用,Solo 与 Tale 功能类似,有些方面甚至是更加强大,主要是在发布文章时没有再遇到无法发布的问题了。

开始着手部署到个人的阿里云服务上去。

在部署的过程中,因为 ECS 购买的是最低配置的服务,而 Solo 需要使用到 MySQL 和 Docker,这导致 Docker 无法在配置如此之低的主机上运行,只能再想曲线救国的办法 ... ...

曲线救国(概述)

下面把路线大概描述一下:

  1. 通过浏览器访问域名
  2. 域名解析到云主机上面
  3. 云主机通过 Nginx 通过域名条件反向代理跳转到内网穿透服务端
  4. 内网穿透服务通过端口判断跳转到客户端

实施(分步骤描写)

1. 本地主机创建并运行 Docker 的 MySQL 容器

这一步直接给出命令,具体可以查看之前的文章《基于 Docker 的 MySQL 5.6 主从配置》和《通过 Docker 单表数据恢复 MySQL 数据》。

这里给数据库容器取名《solo_db》,端口映射到3303,分别将 conf、logs、data 映射到文件夹。

docker run -p 3303:3306 \
	--name solo_db \
	-v $PWD/conf:/etc/mysql/conf.d \
	-v $PWD/logs:/logs \
	-v $PWD/data:/var/lib/mysql \
	-e MYSQL_ROOT_PASSWORD=******** \
	-d mysql:5.6

容器启动后,需要通过命令或数据库工具创建数据库,(库名 solo,字符集使用 utf8mb4,排序规则 utf8mb4_general_ci)。

2. 本地主机创建并运行 Docker 的 Solo 容器

获取最新镜像

docker pull b3log/solo

启动容器

docker run --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:3303/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=

3. 云主机安装、运行、配置穿透服务器

lanproxy 服务程序是 Java 程序, 所以需要安装 Java 环境。

安装

安装 Java 环境后,登录 lanproxy 的 GitHub 页面,下载内网穿透服务端程序,解压即完成安装。

启动服务之前,先看一下配置文件 vi proxy-server-0.1/conf/config.properties

server.bind=0.0.0.0 
// 与代理客户端通信端口
server.port=9000

// ssl相关配置
server.ssl.enable=true
server.ssl.bind=0.0.0.0
server.ssl.port=4993
server.ssl.jksPath=test.jks
server.ssl.keyStorePassword=123456
server.ssl.keyManagerPassword=123456
server.ssl.needsClientAuth=false

// WEB在线配置管理相关信息
config.server.bind=0.0.0.0
config.server.port=8090
config.admin.username=admin
config.admin.password=admin

运行

运行 proxy-server-0.1/bin/startup.sh 即完成服务启动,启动后使用浏览器访问 http://xxx.xxx.xxx.xxx:8090/ 就可以打开WEB在线配置管理页面。

配置服务

进入管理页面,点击【添加客户端】,输入客户端名称,并输入/生成客户端密钥,完成添加客户端。

添加客户端

点开配置管理中的客户端名称,【添加配置】。

添加配置

4. 本地主机安装、配置、运行穿透客户端

安装

同上,登录 lanproxy 的 GitHub 页面,下载内网穿透客户端程序,解压即完成安装。

配置

# 在服务端【添加客户端】时填写或生成的 Key
client.key= xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ssl.enable=false
ssl.jksPath=test.jks
ssl.keyStorePassword=123456

# 服务端 IP
server.host=xxx.xxx.xxx.xxx
# default ssl port is 4993
server.port=9000

运行

启动客户端服务:proxy-java-client-0.1/bin/startup.sh

停止客户端服务:proxy-java-client-0.1/bin/stop.sh

5. 云主机 Nginx 到穿透服务器

修改 Nginx 配置文件,添加服务vi /usr/local/nginx/conf/nginx.conf

    ...
    
    server {
        listen 80;
        server_name www.aclyyx.com;
        location / {
            proxy_pass http://127.0.0.1:9001;
        }
    }
    
    ...

重新加载配置 /usr/local/nginx/sbin/nginx -s reload

6. 域名解析到云主机

这个就不用多说了,就是修改域名跳转到云服务上面。

更多

HTTPS 证书申请

SSL 证书可以到阿里云或腾讯云申请免费(个人)SSL证书

腾讯云SSL证书-申请位置
阿里云云盾证书服务-申请位置
具体可以看【这里】

Nginx 配置 HTTPS 访问

拿到 SSL 证书文件,上传到 Nginx 服务所在的服务器上,之后修改 Nginx 配置文件 vi /usr/local/nginx/conf/nginx.conf ,添加 SSL 相关配置信息,如下。

    ... 
    server {
        listen       443;
        server_name  www.aclyyx.com;
        ssl on;

        ssl_certificate      /root/server/ssl/1_xxxxxx_bundle.crt;
        ssl_certificate_key  /root/server/ssl/2_xxxxxx.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            proxy_pass http://127.0.0.1:9001;
        }
    }
    ... 

配置后,重新加载 Nginx 配置 /usr/local/nginx/sbin/nginx -s reload

在加载配置时可能会报错,错误信息【缺少ngx_http_ssl_module】,需要使用 Nginx 源码配置模块,重新 make 一下并替换 nginx 文件。

# 停止 Nginx 服务
/usr/local/nginx/sbin/nginx -s stop
./configure --with-http_ssl_module

上面的命令为 Nginx 添加 SSL 模块,执行时也可能还会报错,错误信息【./configure: error: SSL modules require the OpenSSL library.】,如果有此错误执行 yum -y install openssl openssl-devel

排除万难后,开始 configuremake Nginx。

$ ./configure
$ ./configure --with-http_ssl_module
$ make

备份 Nginx

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

将新的 Nginx 覆盖旧安装目录

cp objs/nginx /usr/local/nginx/sbin/nginx

# 启动 Nginx 服务
/usr/local/nginx/sbin/nginx -s start

完成

👍 👍 👍 👍 👍

参考

B3log 开源
从零开始安装 solo 博客
Solo 用户指南
腾讯云:域名验证指引
CentOS下配置Nginx的https时报错:缺少ngx_http_ssl_module
Nginx配置SSL报错 nginx: [emerg] unknown directive "ssl"