#博客 #Linux

从0开始搭建博客

1. 概述

本篇博客,我教大家从0开始搭建一个 bolo博客,bolo 博客 和 solo 博客的区别是皮肤更加多,并且可以帐号密码登录。

本篇博客主要的内容如下:

  • linux 安装 docker,设置docker镜像加速
  • docker 安装 nginx
  • docker 的一些常用的命令
  • docker 安装 mysql 数据库
  • docker 安装 solo 博客
  • nginx 配置 https 证书

1.1 涉及技术

本篇博客,将会使用到一下的相关知识:

  • dokcer
  • mysql
  • 阿里云服务器
  • nginx
  • https
  • java
  • ...

2. docker

首先,我们需要购买一台阿里云的服务器,然后,就开始安装服务器的基本软件了,因为 solo 博客、mysql、nginx 等软件的安装都依赖 docker,所以,我们的第一步就是安装 docker 容器。

2.1 docker 的安装

因为系统是我们刚买的 ecs,所以无需像网上一样,yum 卸载 docker。

设置 docker 安装镜像,如果不设置的话,docker 安装起来会特别的慢。

sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

这里我使用的是阿里云的镜像源

安装 docker

yum install docker-ce docker-ce-cli containerd.io

启动 docker

systemctl start docker

运行 docker hello world

docker run hello-world

2.2 设置 docker 的镜像加速

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务。这里我使用的镜像加速使用的是阿里云的。

阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:

阿里云镜像

配置阿里云镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://zoi3dt5d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3. nginx

3.1 安装 nginx

这里的 nginx 我采用的是 docker 安装,因为需要 nginx 配置域名的 https,因此,我们需要把 nginx 的配置文件挂载在主机目录

docker run -d --name nginx -p 80:80 -p 443:443 \
-v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/logs:/var/log/nginx \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/conf:/etc/nginx/conf.d \
-v /opt/nginx/ssl:/root/ssl \
--privileged=true \
nginx

下面,我来解释下个参数的意义:

  • -d:后台运行 nginx 容器
  • --name nginx:指定 nginx 的容器名为 nginx
  • -p 80:80:将容器的 80 端口映射到主机 80 端口,ps:前面的端口为主机端口
  • -p 443:443:将容器的 443 端口映射到主机 443 端口, ps:443端口为 https 端口,后续配置 https 我们将使用到这个端口
  • -v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf:将 nginx 的配置文件映射到主机,ps:前面为主机目录,后面为 nginx 的容器目录
  • -v /opt/nginx/logs:/var/log/nginx:将 nginx 的日志文件映射到主机
  • -v /opt/nginx/html:/usr/share/nginx/html:将 nginx 的 html 静态文件映射到主机
  • -v /opt/nginx/conf:/etc/nginx/conf.d:将 nginx 的配置文件夹映射到主机
  • -v /opt/nginx/ssl:/root/ssl:将 主机的 ssl https 密匙,映射到 nginx 的 /root/ssl 目录
  • --privileged=true :容器用户运行 root 权限

我们可以使用一下的一些命令,查看容器的运行情况:

  • docker ps :查看正在运行的容器,如果 nginx 运行成功了,这里会显示 nginx 的容器
  • docker exec -it nginx /bin/bash :进入 nginx 容器里面,查看容器内部的运行情况
  • docker stats:查看容器的基本内存、cpu占用情况
  • docker logs nginx:查看 nginx 容器运行的日志

3.2 docker 的一些命令

下面是以上的一些命令的截图:

4. mysql

4.1 安装 mysql

为了简单方便,我这里安装 mysql 的方式是采用 dokcer 安装。

docker run -d --name mysql -p 3306:3306 \
-v /opt/mysql/conf.d:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=我的密码 \
mysql

以下是相关命令解释:

-p 3306:3306:将容器的 3306 端口映射到主机

-v /opt/mysql/conf.d:/etc/mysql/conf.d:将 mysql 的配置文件映射到主机

-v /opt/mysql/data:/var/lib/mysql:将 mysql 的数据文件映射到主机

-e MYSQL_ROOT_PASSWORD=我的密码: 设置 mysql root 密码

4.2 mysql 允许外网访问

进入 mysql 容器

docker exec -it mysql /bin/bash

登录 mysql

mysql -uroot -p

设置 root 可外网访问

GRANT ALL ON *.* TO 'root'@'%'; 
flush privileges; 

开放阿里云服务的 3306 端口,使用 Navicat 进行连接吧!

5. bolo

5.1 安装 git

yum install git

5.2 拉取源码

git clone https://github.com/adlered/bolo-solo.git

如果拉取的速度很慢,可按照我下面的方式,设置一个镜像:

浏览器下载一个 GitHub 加速的插件,下载完成后刷新页面,GitHub页面会变成下面:

选择合适的镜像,下载即可,

下载完成后,修改 .git/config

5.3 构建镜像

我们是需要 https 访问的,所以需要做如下的操作:

前往项目根目录下 src/main/resources目录,编辑 latkes.properties文件,将 http修改为 https,即可使用 https 访问。

进入项目根目录,执行一下的命令

docker build -t "bolo" .

5.4 运行 bolo

运行下面的脚本

docker run -it -d -p8080:8080 \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="**" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://172.18.0.24:3306/bolo_blog?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
--rm \
bolo --listen_port=8080 --server_scheme=https --server_host=blog.booleandev.xyz

参数解释:

-p8080:8080:容器与主机的端口映射

--env RUNTIME_DB="MYSQL": 数据库

--env JDBC_USERNAME="root": 数据库用户名

--env JDBC_PASSWORD="**" :数据库密码

--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver":数据库驱动

--env JDBC_URL="jdbc:mysql://172.18.0.24:3306/bolo_blog?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC":数据库链接

--listen_port=8080:bolo容器监听端口

--server_scheme=https:http or https

--server_host=blog.booleandev.xyz:域名

5.5 相关解释

相信大家注意到,bolo 连接的数据库链接为 172.18.0.24,而不是 127.0.0.1,这是为什么呢?

因为 bolo 博客和主机运行的不是一个网络,所以无法通过 127.0.0.1 进行访问,容器和宿主机的网络通信是桥接,那么宿主机和docker会有两个网卡,eth0和docker0,docker0是容器之间的一个路由,eth0是宿主机的ip路由,两个路由可以直接通信,所以,只要找到宿主机的eth0网卡即可。

下面是我的网卡信息:

[root@booleandev .git]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:51ff:fe42:367d  prefixlen 64  scopeid 0x20<link>
        ether 02:42:51:42:36:7d  txqueuelen 0  (Ethernet)
        RX packets 453368  bytes 233613690 (222.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 496030  bytes 492850722 (470.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.24  netmask 255.255.240.0  broadcast 172.18.15.255
        inet6 fe80::216:3eff:fe02:edf2  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:02:ed:f2  txqueuelen 1000  (Ethernet)
        RX packets 1798448  bytes 2109780912 (1.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 632237  bytes 320525103 (305.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 372  bytes 73305 (71.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 372  bytes 73305 (71.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth1376aef: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::30c7:fdff:fe57:22fd  prefixlen 64  scopeid 0x20<link>
        ether 32:c7:fd:57:22:fd  txqueuelen 0  (Ethernet)
        RX packets 41327  bytes 41068253 (39.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38087  bytes 35132337 (33.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

因此,solo 容器需要访问数据库,只需要使用 eth0地址即可

5.6 验证 solo 部署成功

以上,solo 的本地部署就完成了,所以我们需要验证下是否部署成功,使用

curl 127.0.0.1:8080

如果出现了 html,则说明部署成功了

如果出现相应的错误的话,则只需要 dokcer run 时,把 -d 参数去除,即可以看到错误信息

6. https

6.1 申请 https 证书

https 证书一般可以到你购买域名的位置申请即可。我这里使用的是腾讯云生成的证书,下载完文件后,出现以下几个文件:

因为我们采用 nginx,所以只需要把 Nginx 下的两个文件移到 nginx 的映射目录 /opt/nginx/ssl 下即可

6.2 配置 nginx

修改 /opt/nginx/nginx.conf


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
	# 为了避免文件过长,将其它的配置包含进来
    include /etc/nginx/conf.d/*.conf;
}

编写 /opt/nginx/conf/blog.conf

server {
	listen       443 ssl http2;
	server_name  blog.booleandev.xyz;
	ssl_certificate      /root/ssl/1_blog.booleandev.xyz_bundle.crt;
	ssl_certificate_key  /root/ssl/2_blog.booleandev.xyz.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://172.18.0.24:8080;  # 内网IP
		 proxy_set_header HOST $host;
		 proxy_set_header X-Real-IP $remote_addr;
		 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		 proxy_set_header X-Forwarded-Proto $scheme;
		 proxy_set_header X-Forwarded-Scheme $scheme;
	}
}
server {
	listen 80;
	server_name blog.booleandev.xyz;
	return      301 https://$server_name$request_uri;
}

6.3 修改域名解析

域名解析添加一个 A 记录,我这里使用的是腾讯云的域名,配置页面大致如下:

7. 成功

输入 https://blog.booleandev.xyz,即成功!

博客

8. 参考文章