0. 准备工作
想要部署一个博客,你需要准备云服务器,域名,SSL
证书,其中这里SSL
证书,我会使用acme.sh
方式免费白嫖zeroSSL
的证书,并且可以自动续期。
在云服务器方面,选择很广,你如果是学生,推荐选择阿里云云服务器,对学生有很大的优惠力度,但是我第一台云服务器就是阿里云的轻量级云服务器,当时租一年是114元。如果你是非学生,那么你可以选择莱卡云云服务器,在相同的价格中,能租到性能更好的云服务器。我下面就是选择的莱卡云云服务器。
域名,这里我是很多年前在阿里云的万网中租的域名,而DNS
是在腾讯云这边,所以域名备案也是在腾讯云这边进行的。这里需要说明一点,如果你绑定的云服务器在国内大陆地区,都需要先备案,才能进行DNS
。
下面说一下如何选择莱卡云云服务器,如果你不需要,可以跳过。如果你不想要备案也可以考虑vultr
,这是一家支持使用支付宝支付的海外云服务器供应商,可选的节点很多,如果需要可以点击这里进行注册。
如果你面向的用户群体是国内大陆地区,那么你可以点击上图中的“国内云服务器”。
然后根据自己地理位置,价格等等选择一款符合自己需求的云服务器,我这里选择的是浙江电信云中的宁波电信云
点击“前往选购”会跳转到配置页面,选择你需要的配置,如果是部署博客,不需要选择太高的配置,这里我推荐选择2
核心4GB
运行内存10MB
带宽50GB
存储空间的云服务器就够用了。这里可以选择一个月一个月来租,也可以直接租一年,这里推荐直接租一年,因为租一年会给你减免两个月的费用,目前我这边看到的是这样的,如果你现在看到,也有可能优惠政策又不一样了。
下面我列举一下服务器配置对应的价格
| 地区 | 配置 | 价钱 | 链接 |
| ———– | ——————————– | ———- | ———————————————————— |
| 宁波电信云 | 2核4GB运行内存10MB带宽50GB主硬盘 | 1/月 38¥ | 点击跳转 |
| 宁波电信云 | 2核4GB运行内存10MB带宽50GB主硬盘 | 1/年 380¥ | 点击跳转 |
| 镇江电信云 | 2核4GB运行内存10MB带宽50GB主硬盘 | 1/年 580¥ | 点击跳转 |
| 中国香港CN2 | 1核1GB运行内存3MB带宽30GB主硬盘 | 1/年 420¥ | 点击跳转 |
| 美国CN2 | 2核1GB运行内存10MB带宽30GB主硬盘 | 1/年 385¥ | 点击跳转 |
1. 安装Nginx
更新系统依赖列表
yum -y update
执行上面命令提示下面内容
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
需要执行下面命令解决
yum -y install deltarpm
安装系统依赖
yum -y install gcc gcc-c++ libstdc++-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel
下载源码并进入源码
wget https://nginx.org/download/nginx-1.26.2.tar.gz && tar -zxvf nginx-1.26.2.tar.gz && cd nginx-1.26.2
执行配置并编译安装
./configure --prefix=/usr/local/nginx/ --with-http_ssl_module --with-stream --with-threads --with-file-aio --with-poll_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_slice_module && make -j 4 && make install
安装vim
yum install -y vim
创建系统服务
vim /etc/systemd/system/nginx.service
```shell
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
```shell
# 编辑了/etc/systemd/system/下的内容需执行下面语句
systemctl daemon-reload
# 启动
systemctl start nginx
# 查看状态
systemctl status nginx
# 设置开机自启
systemctl enable nginx
如果还没安装firewalld
,可以使用下面命令安装
yum install -y firewalld
安装好后,使用下面命令启动防火墙
systemctl start firewalld
但是你会得到一个警告,那么可以修改下面文件
vim /etc/firewalld/firewalld.conf
搜索AllowZoneDrifting=yes
,把它改为AllowZoneDrifting=no
最后记得重启防火墙
systemctl restart firewalld
现在就没有了那个警告了
开放防火墙端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
然后现在我们来访问一下,在浏览器地址栏中输入你服务器的ip
或者域名,就可以访问了,如下图所示。
2. 安装MySQL
这里采用源码编译方式安装,这里源码编译安装企业用的最多的MySQL5.7
安装前的准备
# 卸载默认的数据库
rpm -qa|grep mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
# 如果以前安装过 MySQL,先卸载干净
rpm -qa|grep mysql
rpm -e --nodeps mysql-*
# 删除配置文件
rm -rf /etc/my.cnf
cd /etc/init.d/
rm -rf mysql*
下载并解压源码
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.44.tar.gz && tar -zxvf mysql-5.7.44.tar.gz && cd mysql-5.7.44
安装之前需要先安装以下系统依赖
yum install -y gcc gcc-c++ cmake libaio-devel ncurses ncurses-devel bison openssl-devel
创建目录,用于保存cmake
产生的文件
cd /usr/local/src/mysql-5.7.44
mkdir build && cd build
执行配置,指定mysql.socket
的位置
cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=../boost -DWITH_INNODB_MEMCACHED=ON
如果不想要指定位置,可以使用下面命令,通常mysql.socket
默认位置在/tmp/mysql.sock
或者/var/run/mysqld/mysqld.sock
cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DMYSQL_TCP_PORT=3306 -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=../boost -DWITH_INNODB_MEMCACHED=ON
注意:如果执行cmake
失败了,把build
目录删除,然后重新创建build
目录,并且进入到build
目录中,然后重新执行上面的cmake
命令
创建用户组和用户
groupadd mysql
useradd -r -g mysql -M -s /sbin/nologin mysql
编译安装
make -j 4 && make install
配置权限
mkdir -p /usr/local/mysql/data
mkdir -p /usr/local/mysql/tmp
chown -R mysql:mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql
创建配置文件
vim /etc/my.cnf
写入下面内容
[client]
port=3306
socket=/usr/local/mysql/data/mysql.sock
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
bind-address=0.0.0.0
user=mysql
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
tmpdir=/usr/local/mysql/tmp
pid-file=/usr/local/mysql/data/mysqld.pid
log-error=/usr/local/mysql/data/error.log
socket=/usr/local/mysql/data/mysql.sock
default-storage-engine=innodb
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
ssl-cipher=TLSv1.2
对上面配置的解释
bind-address 设置允许访问的地址,设置为 0.0.0.0 表示任何地址都可以连接到数据库
user 指定用哪个用户运行 MySQL
port 指定运行的端口
basedir 指定 MySQL 的安装位置,这个要与上面 cmake 中 -DCMAKE_INSTALL_PREFIX 指定的一致
datadir 保存 数据库 文件的路径,这个要与上面 cmake 中 -DMYSQL_DATADIR 指定的一致
socket 的值要与 cmake 中 -DMYSQL_UNIX_ADDR 指定的值一致
到这里数据库就已经安装好了,下面我们需要初始化数据库
/usr/local/mysql/bin/mysqld --initialize-insecure --explicit_defaults_for_timestamp --user=mysql
注册为系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
cp /usr/local/mysql/bin/mysqld /etc/init.d/
chmod +x /etc/init.d/mysql
启动服务及查看状态
/etc/init.d/mysql start
/etc/init.d/mysql status
/etc/init.d/mysql stop
service mysql start
service mysql status
service mysql stop
设置环境变量
vim /etc/profile
```shell
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
```shell
source /etc/profile
设置开机自启
vim /etc/systemd/system/mysql.service
```shell
[Unit]
Description=MySQL Community Server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PermissionsStartOnly=true
PIDFile=/usr/local/mysql/data/mysqld.pid
ExecStartPre=/etc/init.d/mysql restart
ExecStart=/etc/init.d/mysql start
TimeoutSec=600
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
RuntimeDirectory=mysqld
RuntimeDirectoryMode=755
```shell
systemctl daemo-reload
systemctl enable mysql
设置MySQL
密码
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
flush privileges;
3. 安装JDK
下载源码
wget https://download.oracle.com/java/17/archive/jdk-17.0.11_linux-x64_bin.tar.gz
解压
mkdir -p /usr/local/jdk && tar -zxvf jdk-17.0.11_linux-x64_bin.tar.gz -C /usr/local/jdk
配置环境变量
vim /etc/profile
在文件末尾添加下面内容
export JAVA_HOME=/usr/local/jdk/jdk-17.0.11
export PATH=$PATH:$JAVA_HOME/bin
```shell
source /etc/profile
使用下面命令查看否是配置成功
java
javac
java -version
4. 安装Halo
修改设置密码规则
vim /etc/security/pwquality.conf
```markdown
difok=0: 新密码与旧密码可以完全相同
ucredit=-1: 必须包含至少 1 个大写字母(负值表示不需要)
lcredit=-1: 必须包含至少 1 个小写字母(负值表示不需要)
dcredit=0: 必须包含至少 1 个数字(0 表示必须全部为数字)
ocredit=-1: 必须包含至少 1 个特殊字符(负值表示不需要)
创建用户,并且给用户设置密码
useradd -m halo && passwd halo
登录到halo
用户
su - halo
创建目录,用于存放jar
,并且下载jar
mkdir ~/app && cd ~/app && wget https://dl.halo.run/release/halo-2.19.0.jar -O halo.jar
创建工作目录
mkdir ~/.halo2 && cd ~/.halo2
创建配置文件
vim application.yaml
写入下面内容
server:
# 运行端口
port: 8090
spring:
# 数据库配置,支持 MySQL、MariaDB、PostgreSQL、H2 Database,具体配置方式可以参考下面的数据库配置
r2dbc:
url: r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
username: admin
password: 123456
sql:
init:
mode: always
# 需要配合 r2dbc 的配置进行改动
platform: h2
halo:
caches:
page:
# 是否禁用页面缓存
disabled: true
# 工作目录位置
work-dir: ${user.home}/.halo2
# 外部访问地址
external-url: http://localhost:8090
# 附件映射配置,通常用于迁移场景
attachment:
resource-mappings:
- pathPattern: /upload/**
locations:
- migrate-from-1.x
这里不推荐使用H2
数据库,推荐使用MySQL
数据库,把数据库更改为MySQL
数据库
url=r2dbc:pool:mysql://localhost:3306/halo
platform=mysql
设置可执行权限
chmod +x halo.jar
测试一下看看能否正常启动
cd ~/app && java -jar halo.jar --spring.config.additional-location=optional:file:$HOME/.halo2/
如果没有报错,说明正常
切换到root
用户下,执行下面命令
然后我们做一个软链接,把/usr/local/jdk/jdk-17.0.11/bin/java
文件软链接到/usr/bin/java
ln -s /usr/local/jdk/jdk-17.0.11/bin/java /usr/bin/java
然后就可以注册到系统服务中了
切换到root
用户下,执行下面命令
vim /etc/systemd/system/halo.service
写入下面内容
[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=halo
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar /home/halo/app/halo.jar --spring.config.additional-location=optional:file:/home/halo/.halo2/
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog
StandError=inherit
[Install]
WantedBy=multi-user.target
```shell
systemctl daemon-reload
systemctl start halo
systemctl enable halo
通过下面命令可以查看日志
journalctl -n 20 -u halo
配置反向代理
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80;
listen [::]:80;
server_name www.yourdomain.com;
client_max_body_size 1024m;
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
5. 域名解析
在准备工作中已经准备好了我的域名,并且域名已经备案了,那么可以进行域名解析了,也就是DNS
这里我使用的是腾讯云DNS
首先进入到你的腾讯云控制台中,找到云DNS
可以访问下面链接,跳转到腾讯云云DNS
控制台
https://console.cloud.tencent.com/cns
如果你还没添加域名,可以点击添加域名,如下图所示
然后添加一条记录,记录类型选择A
类型,记录值填写你的服务器公网ip
,主机记录填写你要绑定的二级域名,比如这里我想要绑定二级域名为blog
,那么主机记录填写blog
,而如果我们想要只绑定一级域名,那么可以填写@
,这里通常还会绑定www
,其它保持默认,如下图所示
添加完成后,不会马上生效,一般要等待5分钟到10分钟生效
过了10分钟后,你可以在本地电脑打开cmd
,使用ping
命令查看是否生效,如果可以ping
通,那么说明已经完成DNS
配置,如下图所示
6. 使用acme申请证书
我这里的域名在腾讯云DNS
解析,目前免费的SSL
证书普遍都是90
天到期,所以这里推荐使用acme
方式免费白嫖zeroSSL
首先我们需要安装acme.sh
curl https://get.acme.sh | sh -s email=my@example.com
如果你已经安装过了,可以使用下面命令更新你的acme.sh
acme.sh --upgrade
6.1 获取腾讯云SecretId和SecretKey
有两种方式,可以使用主账号API
密钥,还可以使用子账号密钥,这里推荐后者,所以这里只讲使用子账号的方式获取SecretId
和SecretKey
。
具体可以参考腾讯文档
6.2 申请证书
设置环境变量
export Tencent_SecretId="<Your SecretId>" export Tencent_SecretKey="<Your SecretKey>"
注册到
zeroSSL
若还没
EAB KID
和EAB HCME KEY
,可以点击这里,进入网站后点击Generate
/root/.acme.sh/acme.sh --register-account --server zerossl -m myemail@example.com --eab-kid <EAB KID> --eab-hmac-key <EAB HCME KEY>
使用
acme.sh
申请证书acme.sh --issue --dns dns_tencent -d lukeewin.top -d *.lukeewin.top
安装证书
注意:不建议直接使用
~/.acme.sh
路径下的证书,而是通过acme.sh
提供的命令将证书安装到指定位置,以确保证书的正确使用和续期,具体可以参考install the cert to Apache/Nginx etc,下面以Nginx
为例。acme.sh --install-cert -d lukeewin.top -d *.lukeewin.top \ --key-file /usr/local/nginx/ssl/key.pem \ --fullchain-file /usr/local/nginx/ssl/cert.pem \ --reloadcmd "systemctl reload nginx"
修改
nginx.conf
文件server { listen 443 ssl http2; server_name lukeewin.top www.lukeewin.top; # 请替换为证书实际路径 ssl_certificate /usr/local/nginx/ssl/cert.pem; ssl_certificate_key /usr/local/nginx/ssl/key.pem; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; ssl_prefer_server_ciphers off; ssl_prefer_server_ciphers on; location / { root /nginx/www/html; } }
注意:将
/usr/local/nginx/ssl/cert.pem
和/usr/local/nginx/ssl/key.pem
替换为你的实际路径。
acme.sh
中文说明书
https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
腾讯文档关于acme.sh
说明书
https://cloud.tencent.com/document/product/302/105900
最后要记得开放443
端口
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
现在我们的博客就已经完成部署了
7. 其它
上面的步骤,我们其实已经可以通过域名访问了,但是如果你使用的是莱卡云,你还需要在控制台中添加域名白名单,如下图所示。
如果你使用的是vultr
,那么就不需要这个操作了。如果你使用的是阿里云,那么你需要在控制台中的安全组中开放对应的端口号,比如你需要开放80
端口和443
端口。
最后来看看我博客的效果,如下图所示。
评论区