环境准备
服务器:阿里云服务器 2核2g
Shell工具:Finalshell
阿里经常搞活动,云服务器1年99,不是特别贵,有条件的同学可以购买玩玩(不是打广告,我是用惯了阿里产品。。)
购买连接:www.aliyun.com/lowcode/pro…
- 服务器购买完成之后,打开控制台
- 打开云服务器ECS
- 可以查看自己的实例信息,"IP地址"栏显示公网和内网IP;
- 打开实例,建议把你的实例账户密码重置一下;
- 打开安全组,管理规则,这里我配置了两个安全组,一个基础的,一个业务的,嫌麻烦的可以配一个组
- 基础安全组如下图:将入方向的22;80;443放开;
- 业务安全组如下图:将入方向3306,81,8090端口放开,后续安装halo需要用到;
注意:业务安全组的授权对象别用0.0.0.0/0;会有安全问题!我这里之前没有注意随便给了0.0.0.0/0,导致被很多莫名其妙的地址访问;
MySQL和halo的你可以给实例的公网IP,NPM没有域名的不用加,有域名的可以配置自己当前电脑使用的网络IP
Shell工具用自己用的顺手的,自行下载即可,这里主要是给小白推荐,我用的是finalshell:www.hostbuf.com/
finalshell安装完成之后,打开新建一个SSH连接
名称:随便;
主机:阿里云实例公网IP;
端口不变;
用户名:阿里云实例登陆的用户名;
密码:阿里云实例密码;
登陆成功~
安装Halo
安装Halo我主要是参考官方文档来的,官方文档链接:docs.halo.run/getting-sta…
一开始用了docker部署,但是docker部署默认使用自带的 H2 Database 数据库,如果要使用自己搭建的mysql数据库,官方建议使用docker-compose部署;所以我这边用了docker-compose部署方式
安装docker
先装docker,docker-compose部署依赖于docker
- 卸载老的版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装yum工具包
$ sudo yum install -y yum-utils
- 配置仓库源
# 1. 默认使用国外源,非常非常非常慢!
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 2. 推荐用国内源,丝滑!
$ sudo yum-config-manager \
--add-repo \
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 安装Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动Docker
$ systemctl enable docker
$ systemctl start docker
若不报错,说明启动成功。
- 验证是否安装成功
在docker启动的前提下,在命令行输入以下指令
docker run hello-world
docker run hello-world会先从本地搜索名为hello-world的镜像,若没有找到,则先从docker hub中pull该镜像,拉去镜像到本地成功后,再通过run指令来启动容器运行该镜像。
出现以下信息,说明没啥毛病
安装mysql
- 下载Mysql镜像,冒号后面可以自己指定版本号,我用的是5.7
docker pull mysql:5.7
- 查看docker镜像
docker images
会出现已下载的镜像文件
- 在本地创建mysql的映射目录
mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf
- 创建Mysql容器并运行
docker run -p 3306:3306 --name mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 查询mysql容器是否在运行
docker ps
STATUS为Up说明在正常运行
好了,数据库环境搭建好了,可以用navicat客户端连接看看;
注意:新建一个halo的数据库,halo博客搭建需要用到;
安装docker-compose
- 下载最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 测试安装结果
docker-compose --version
部署Halo
好了,上述依赖都安装完毕,下面开始进入正题,部署Halo
- 下载halo镜像;这里我用的2.11版本镜像, 建议不要使用latest 标签镜像,很久没更新了
docker pull halohub/halo:2.11
- 查看镜像,下载成功
- 在系统任意位置创建一个文件夹,此文档以 ~/halo 为例
mkdir ~/halo && cd ~/halo
注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存
- 创建 docker-compose.yaml
我这里是halo+mysql;如果你是其他数据库可以参考一下官方文档:docs.halo.run/getting-sta…
yaml文件的创建位置:~/halo/docker-compose.yaml
这里我使用vim创建的时候格式排版乱了,我在自己电脑创建好,再上传到云服务器中;
version: "3"
services:
halo:
image: halohub/halo:2.11
container_name: halo
restart: on-failure:3
network_mode: "host"
volumes:
- ./halo2:/root/.halo2
command:
# 修改为自己已有的 MySQL 配置
- --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo
- --spring.r2dbc.username=root
- --spring.r2dbc.password=
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
# 端口号 默认8090
- --server.port=8090
- 启动halo
docker-compose -f docker-compose.yaml up -d
在浏览器输入自己的阿里云实例公网地址;ip:8090/console,首次启动会进入初始化页面,自己填写相应信息即可;
安装Nginx Proxy Manager(有域名的同学看过来~)
顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。
即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。
Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。
- 首先,我们创建一个文件夹来存放 NPM 的 docker-compose.yml 文件
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
vi docker-compose.yml
- 在英文状态的输入法下,按下 i,左下角出现 --INSERT-- 后,粘贴填入下面的内容
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建
注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。
- 启动 NPM
docker-compose -f docker-compose.yml up -d
不出意外,此时你使用阿里云实例的公网ip:81就可以访问 NPM 的网页端了。81入口我们之前放开过
默认登陆的用户名:admin@example.com 密码:changeme
初次登陆修改一下账户和密码
成功之后,页面如下,我这里已经配置一个了,初次Proxy Hosts为0
- 接着点击 Add Proxy Host,弹出如下对话框:
看起来都是英文,很复杂,但是其实很简单,我们只要用到其中的几个功能即可,这边稍微解释一下:
- Domain Names :填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上
- Scheme :默认 http 即可,除非你有自签名证书
- Forward Hostname/IP :填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)
- Forward Port:填入 Halo 映射出的端口,这边默认是 8090
- Cache Assets :缓存,可以选择打开
- Block Common Exploits: 阻止常见的漏洞,可以选择打开
- Websockets Support :WS 支持,可以选择打开
- Access List: 这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。
样例:
Forward Hostname/IP:我这里给的是内网ip,内网ip你可以在云实例的信息中找到;
一键申请 SSL 证书
申请一张 SSL 证书,让我们的网站支持 https 访问
点击save即可;但是我这里报错了。。。
Nginx proxy manager Internal Error报错解决
自动申请不行,网上找了很久也没有找到解决方案;
我开始尝试手动配置;
- 打开阿里云控制台;搜索数字证书管理服务,点击SSL证书,点击免费证书,创建证书(如果你是其他厂商云服务器,应该也类似功能,你可以自己找找)
- 输入你自己的域名;快速签发可以不点;
- 等待几分钟,证书会出现
- 点击下载,下载Nginx的证书,会得到一个压缩包,里面有key和pem文件
- 打开NPM 的网页端,添加证书
name:随便填;key:导入下载的证书key文件;Certificate:导入下载的证书pem文件,点击Save
- 添加好了之后,回到Proxy Hosts列表,重新配置Proxy Host,SSL选择刚刚手动添加的证书,保存
至此大功告成~