• 基于 Solo 通过阿里云服务器+Docker+Nginx+MySQL搭建个人博客


    文章首发:https://blog.itzhouq.cn/solo
    个人博客

    1、部署环境列表

    系统 阿里云 Centos7(香港服务器)
    JDK 1.8
    solo 方式 Docker
    数据库 Docker-mysql 5.7
    反向代理 Docker-nginx-release
    协议 https

    后面Docker命令用的比较多,可以参考Docker教程

    2、安装 JDK

    创建 package 目录存放 JDK 的 rpm 包,将下载好的压缩包(自己去官网下载)传输到这个目录。

    [root@itzhouq local]# mkdir /usr/local/package
    [root@itzhouq local]# cd package/
    [root@itzhouq package]# ll
    total 185520
    -rw-r--r-- 1 root root  11027411 Apr 14 10:44 apache-tomcat-9.0.33.tar.gz
    -rw-r--r-- 1 root root 178939634 Apr 14 10:45 jdk-8u241-linux-x64.rpm
    
    

    安装

    [root@itzhouq package]# rpm -ivh jdk-8u241-linux-x64.rpm 
    warning: jdk-8u241-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:jdk1.8-2000:1.8.0_241-fcs        ################################# [100%]
    Unpacking JAR files...
    	tools.jar...
    	plugin.jar...
    	javaws.jar...
    	deploy.jar...
    	rt.jar...
    	jsse.jar...
    	charsets.jar...
    	localedata.jar...
    

    配置环境变量

    [root@itzhouq package]# vim /etc/profile
    

    将以下追加到文件中

    export JAVA_HOME=/usr/java/jdk1.8.0_241-adm64
    export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
    export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
    

    使配置生效

    [root@itzhouq package]# source /etc/profile
    

    检验

    [root@itzhouq package]# java -version
    java version "1.8.0_241"
    Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
    Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
    

    3、安装 docker

    #安装 Docker
    yum -y install docker
    
    #启动 Docker 后台服务
    service docker start
    
    #测试运行 hello-world
    docker run hello-world
    

    异常处理,运行 hello-world 时报错。

    container_linux.go:247: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused "Cannot set property TasksAccounting, or unknown property.""
    /usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused "Cannot set property TasksAccounting, or unknown property."".
    

    解决方式是:

    yum update  # 主要原因还是centos系统版本兼容性问题,如果将系统做更新升级,即可解决。
    [root@itzhouq /]# systemctl restart docker.service		# 重启docker
    [root@itzhouq /]# docker run hello-world				# 再次运行hello-world,成功
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    

    4、安装 MySQL

    docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    # 安装mysql:5.7,直接docker run 他会自动去官方镜想下载
    # MYSQL_ROOT_PASSWORD=你的数据库密码
    
    [root@itzhouq /]# docker ps			# 查看运行中的容器
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
    04e879c94150        mysql:5.7           "docker-entrypoint..."   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    
    

    初始化 mysql

    [root@itzhouq /]# docker exec -it mysql bash		# 进入容器内部
    root@04e879c94150:/# mysql -uroot -p123456			# 连接mysql,创建数据库
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 2
    Server version: 5.7.29 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> exit;
    Bye
    root@04e879c94150:/# exit
    exit
    [root@itzhouq /]# 
    
    

    测试连接:docker容器安装的mysql 默认允许远程连接,使用 Navicat 测试连接成功。

    注意:mysql 使用的端口 3306 需要在阿里云安全组策略和宝塔面板中开放。

    5、安装 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:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" 
    --rm b3log/solo --listen_port=7001 --server_scheme=http --server_host=blog.itzhouq.cn
    
    • --env JDBC_PASSWORD="123456" 将 123456 换成你的密码

    • --listen_port=7001 监听的端口

    • --server_scheme=http 请求方式,暂时使用 http,后面我们会换成 https

    • --server_host=blog.itzhouq.cn 你的域名,如果你没有域名可以写 ip 地址

    • --rm 因为这个容器后面要删掉,带上 rm 会省很多事。

    • 注意:使用的端口 7001需要在阿里云安全组策略中开放。

    [root@itzhouq /]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
    ef06d9e14dce        b3log/solo          "java -cp lib/*:. ..."   About a minute ago   Up About a minute                                       solo
    04e879c94150        mysql:5.7           "docker-entrypoint..."   16 minutes ago       Up 16 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
    
    

    容器列表中存在 solo ,没有报错说明安装成功。访问 http://blog.itzhouq.cn:7001

    如果不能访问,需要再次确认端口 7001 是否开放。

    [root@itzhouq /]# firewall-cmd --list-ports
    20/tcp 21/tcp 22/tcp 80/tcp 8888/tcp 39000-40000/tcp 9000/tcp 9000/udp 7001/tcp 7001/udp
    

    访问成功后能进入初始化页面,登录账号可自动生成第一篇文章。

    6、安装nginx

    安装 nginx 前,我们现在本地建立几个文件,用于存放 nginx 的配置文件等

    # 切换到服务器根目录
    cd /
    # 创建主目录
    mkdir dockerData
    # 创建文件
    mkdir dockerData/nginx dockerData/nginx/conf dockerData/nginx/logs dockerData/nginx/www dockerData/nginx/ssl
    

    上面的 dockerData 可以换成自己喜欢的名字

    • dockerData/nginx 用于存放 docker 下 nginx 自定义文件
    • dockerData/nginx/conf 存放 nginx 配置文件
    • dockerData/nginx/log 存放 nginx 日志文件
    • dockerData/nginx/www 存放 nginx 访问的资源文件
    • dockerData/nginx/ssl 存放 ssl 证书
      启动 nginx
    docker run --name nginx -p 80:80 -d --rm nginx
    

    如果你没有备案,可以将上面的 80:80 换成 8081:80,因为这个东西一会儿也要删掉,所以加上 --rm 参数,命令执行玩后通过 docker ps 查看 nginx 是否在运行,在运行的情况下访问你的域名加端口号查看是否正常安装,80 直接省略。如下表示访问成功。

    导出配置文件

    • docker cp nginx:/etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf 导出配置文件 nginx.conf
    • docker cp nginx:/etc/nginx/conf.d /dockerData/nginx/conf/conf.d 导出配置为你 nginx.conf
      执行 docker stop nginx,会自动删除现在的 nginx 容器,然后执行如下命令重新启动一个 nginx 容器。
    docker run -d -p 80:80 --name nginx -v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d -v /dockerData/nginx/www:/usr/share/nginx/html -v /dockerData/nginx/logs:/var/log/nginx nginx
    

    访问你的域名,你会发现报错了

    这时我们可以前往 /dockerData/nginx/logs 下查看日志文件

    2019/08/05 14:57:54 [error] 6#6: *3 directory index of "/usr/share/nginx/html/" is forbidden, client: 121.32.33.217, server: localhost, request: "GET / HTTP/1.1", host: "www.jinjianh.com" 
    

    因为 /usr/share/nginx/html/ 被挂载到了服务器上面的 /dockerData/nginx/www 目录下,原来的欢迎页面在 dockerData/nginx/www 是没有的,所有就报错了,这里我们随便建一个。

      # 打开项目文件
    cd /dockerData/nginx/www
    # 使用vim 创建并编辑文件
    vim index.html
    # 此时我们会进入vim界面,按 i 插入,然后输入
    <h1>Hello Docker-Nginx</h1>
    # 输入完后,按 esc,然后输入 :wq
    

    再次访问我们的域名就可以看到我们刚刚写的 h1 标签内容。

    7、申请 SSL 证书和上传证书

    访问阿里云云盾证书服务

    证书类型选择 免费版(个人)DV。购买成功后区证书控制台选择证书申请,填写个人信息,域名验证方式和CSR生成都选择默认就行,一直下一步,等待证书签发,一般几分钟就能成功。待证书的签发状态更新为已签发,下载证书。

    我这里使用的是 Nginx 服务器,下载 Nginx 服务器的证书备用。

    将下载的证书解压上传到服务器 /dockerDat/nginx/ssl 目录下。

    [root@itzhouq ssl]# pwd
    /dockerData/nginx/ssl
    [root@itzhouq ssl]# ll
    total 8
    -rw-r--r-- 1 root root 1679 Apr 14 15:16 3758775_blog.itzhouq.cn.key
    -rw-r--r-- 1 root root 3659 Apr 14 15:16 3758775_blog.itzhouq.cn.pem
    

    8、配置 Nginx

    开始配置 nginx

    cd /dockerData/nginx/conf/conf.d
    vim default.conf
    

    完整配置:

    server {
        listen       443;
        server_name  localhost;
        ssl on;
        # 下面两个配置需要换成自己的
        ssl_certificate /ssl/3758775_blog.itzhouq.cn.pem;  # ssl 证书目录
        ssl_certificate_key /ssl/3758775_blog.itzhouq.cn.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;  
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
           # 官方博客上此处用的是域名,但配置时发现不好使,所以我用的是服务器ip
           proxy_set_header Host $http_host;  # 这个必须加上,否则会出现Latke配置错误的问题
           proxy_pass http://22.22.22.22:8080;   # 这里换成自己的IP
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    server{
      listen 80;
      server_name blog.itzhouq.cn; # 换成自己的博客域名
      rewrite ^(.*) https://$host$1 permanent;
    }
    

    由于我们现在用的 nginx 容器并未监听 443 端口,所以需要删除现在的容器,重新启动一个新的 nginx 容器

    docker stop nginx  # 停止容器
    docker rm nginx # 删除容器
    # 启动新的
    docker run -d -p 80:80 -p 443:443 --name nginx 
    -v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
    -v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d 
    -v /dockerData/nginx/ssl:/ssl/ 
    -v /dockerData/nginx/www:/usr/share/nginx/html 
    -v /dockerData/nginx/logs:/var/log/nginx nginx
    
    

    此时可以访问:https://blog.itzhouq.cn试试

    9、Nginx 代理 solo 实现 https访问

    让 solo 还是跑在 8080 端口上,通过 nginx 代理到 443 端口即可,由于我们上面启动 solo 时添加了 --rm 参数,只需要 docker stop solo 即可自动删除 solo 容器,然后我们重新启动一个 solo 容器 。

    docker ps -a		# 查看全部容器中是否有solo
    docker rm solo		# 如果solo没有删除的话,执行这条命令
    
    docker run --detach --name solo --network=host 
    --env RUNTIME_DB="MYSQL" 
    --env JDBC_USERNAME="root" 
    --env JDBC_PASSWORD="123123" 
    --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" 
    b3log/solo --listen_port=8080 --server_scheme=https --server_host=blog.itzhouq.cn --server_port=
    
    
    • --server_scheme=http 换成 --server_scheme=https 即可
    • --server_port:最终访问端口,使用浏览器默认的 80 或者 443 的话值留空即可

    到这里基本就搭建好 solo 博客了。

    10、遇到的坑

    可能如果遇到问题,需要检查上述配置或者命令哪里执行有问题。我在这里踩到的几个坑分享一下:

    1、Nginx 反向代理配置问题。

    location / {
        proxy_set_header Host $http_host;  # 这个必须,否则会出现Latke配置错误的问题
        proxy_pass http://47.56.31.65:8080;
    }
    

    我博客配置好了之后通过浏览器访问,一直提示 Latke 配置错误,去社区也是看了,每个人的情况还不大一样,我看了好一会儿帖子才找到答案。可以看下这个帖子,感谢 Leif160519 的回答。

    2、 域名需要备案才能访问

    如果是国内的服务器和域名需要备案才能访问。我后期重新更换到了阿里云香港的服务器和域名,就不需要备案了。

    3、端口

    你用到的端口都需要在阿里云安全组策略中开放。

    参考文章

  • 相关阅读:
    Freesql使用一张带父子关系的表,生成list树型数据
    css特效实现html表格显示部分内容,当鼠标移上去显示全部。
    ASP.NET Core如何自动生成小写的破折号路由
    windows服务+OpenSSH+SVN在Jenkins上的自动化部署进阶篇
    Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入门
    .net(C#)中结构和类的区别
    Web.config配置详解
    关于Asp.net core配置信息读取的源码分析梳理
    极简实用的Asp.NetCore框架再新增商城模块
    极简实用的Asp.NetCore模块化框架新增CMS模块
  • 原文地址:https://www.cnblogs.com/itzhouq/p/solo.html
Copyright © 2020-2023  润新知