一次博客部署的经历

本文最后更新于:2023年4月24日 凌晨

一次博客部署的经历

一、前言

在六七月份前前后后花了一个多月写一个博客项目,但是我还没有在真实环境部署过项目的经历,正好现在已经部署完了,就把部署过程写下来吧,以后忘记怎么部署了还可以看看。:)

二、服务器/域名购买

考虑到国内的服务器和域名还是比较便宜的,所以就选择了在国内购买服务器和域名。我购买的是阿里云的服务器以及域名。

为域名配置好了 www 记录,让域名指向我购买的服务器 IP 地址。

三,服务器相关配置

购买服务器的第一件事就是配置 ssh 远程连接。首先修改服务器的 /etc/ssh/sshd_config,修改如下配置。

1
2
3
4
5
6
# 禁止密码登录
PasswordAuthentication no
# 关闭 root 登录
PermitRootLogin no
# 修改 ssh 端口
Port 2022

这些配置防止一些频繁的暴力破解攻击,接下来在本地生成公私钥对。

1
2
# 如果没特殊需求可以一路回车
ssh-keygen -t rsa

把私钥留在本地,上传公钥到服务器,并且将公钥中的内容导入 .ssh/authorized_keys 中。

1
2
3
scp .ssh/id_rsa.pub root@xx.xx.xx.xx:/root/. 

cat id_rsa.pub >> ~/.ssh/authorized_keys

这个时候还不可以登录,因为修改了默认的 22 端口,默认 22 是被阿里云的安全组放行的,但我修改的端口是没被阿里云的安全组放行的,所以要配置安全组规则。

找到安全组设置,手动添加一条规则,优先级任意,协议类型为自定义 TCP,目的为 2022,源为:0.0.0.0/0,保存。

重启 ssh ,退出服务器,采用密钥登录。

1
2
3
4
5
6
7
8
9
service ssh restart


# 采用密钥登录
ssh -i ~/.ssh/id_rsa root xx.xx.xx.xx

vim /etc/ssh/ssh_config
# 取消下面这行的注释,配置私钥默认路径
IdentityFile ~/.ssh/id_rsa

当然有了这些还不够,所以还可以使用 fail2ban 来做更强力的防护。

安装 fail2ban

1
2
sudo apt-get update
sudo apt-get install fail2ban

检查 fail2ban 是否启动

1
sudo systemctl status fail2ban

/etc/fail2ban/jail.d/ 中创建一个 sshd.local,也就是创建一个新的监狱规则。fail2ban 最终会读取这个 监狱配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[sshd]
# 是否启用,不启用则为 false
enabled = true

# 如果 SSH 是其他端口,需要在这里修改
port = ssh

# 存储日志文件的路径
logpath = %(sshd_log)s

# 最大尝试次数
maxretry = 3

# 拦截时间
bantime = 172800

# 过滤规则
filter = sshd

# 过滤的时长(秒)
findtime = 3600

# 执行的动作
action = iptables[name=SSH, port=ssh, protocol=tcp]

重启 fail2ban,并且查看规则。

1
2
3
fail2ban-client reload

fail2ban-client status sshd

三,项目部署

在本地进行 maven 打包,并且上传到服务器。

1
2
3
maven package

scp target/MyBlog.jar root@xx.xx.xx.xx:/root/.

在服务器中安装 jre,由于只是每次部署到服务器的都是编译好的,所以只需安装 jre 即可。

1
apt-get install default-jre

安装数据库,这里安装的是 mariadb 数据库。

1
apt-get install mariadb-server 

进行 mariadb 初始化。

1
sudo mysql_secure_installation

修改 /etc/mysql/mysql.conf.d/mysqld.cnf 配置数据库的字符集编码。

1
2
3
4
5
6
7
8
9
[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[mysql]
default-character-set=utf8

由于高版本 (8) 的 mysql 加密规则是 caching_sha2_password,会导致普通用户连接不上,所以这里修改加密规则为 mysql_native_password,首先以 root 环境登录进 mysql 交互终端,执行以下命令。

1
2
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root' AND plugin = 'unix_socket';
FLUSH PRIVILEGES;

退出 mysql ,重启。

1
sudo /etc/init.d/mysql restart 

创建相应的数据库并且导入相应的数据库脚本和数据脚本。

由于每次启动都需要写很长的命令,所以写一个脚本,方便运行。

启动脚本:

1
2
3
#!/bin/bash
name=MyBlog.jar
nohup java -jar ${name} &

暂停脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
port=8080
#根据端口号查询对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');

echo "pid=$pid"
#杀掉对应的进程,如果pid不存在,则不执行
if [ -n "$pid" ]; then
echo "正在执行kill命令..."
if kill -9 $pid; then
echo "执行成功"
fi
fi

更改 start.shstop.sh 的权限。

1
2
chmod u+x start.sh
chmod u+x start.sh

找到安全组设置,手动添加一条规则,优先级任意,协议类型为自定义 TCP,目的为 8080,源为:0.0.0.0/0,保存。

执行 start.sh 脚本,打开浏览器输入服务器 IP 地址 + 8080,即能看到效果。

四,反向代理与HTTPS

为了让项目更好的访问以及安全性,接下来配置 nginxhttps,不过这两个前提都是,服务器需要先备案。

1. 备案

首先域名是要进行实名认证的,才能进行 ICP 备案,这个实名认证很快。

然后找到阿里云中的 备案服务号申请,右侧是 ECS 名称,在下方列表中选择当前实例,进行申请。

基本都是填一下基本个人信息进行核验,然后就是一些主办者信息(我这里主办者是个人),网站信息,就是描述这个网站是干什么用的( 由于我写的是博客相关的关键字,后来有客服来打电话帮我修改= = ),后面就是上传个人身份证正反面以及人脸识别,最后信息校验,进入 ICP 备案初审。

差不过隔了一天,就收到了 阿里云 的短信,提示备案订单已经提交交管局审核,去工信部验证页面使用刚才的短信验证码验证。

隔天之后,收到 工信部 的短信,告诉我备案已经成功并且给了备案号,这个需要放入网站的底部中间位置。

2. Nginx 配置与安装

nginx 安装:

1
apt-get install nginx

修改 /etc/nginx/nginx.conf,加入以下配置:

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name youdomain;

location / {
proxy_pass http://127.0.0.1:8080; # 端口要对应
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}

重启 nginx

1
sudo nginx -s reload

找到安全组设置,手动添加一条规则,优先级任意,协议类型为自定义 TCP,目的为 80,源为:0.0.0.0/0,保存。

打开浏览器,输入 域名 即可访问到网站,但此时还不是 HTTPS 的

3. HTTPS 配置

要配置 https 首先要有 ssl 证书,这里证书是通过阿里云免费获取。

clipboard.png

当申请完成后,在证书管理的列表中选择已申请的证书,进行下载,选择 nginx 格式下载。

上传到服务器的 /usr/local/nginx/cert 下,一个文件为 pem 后缀的,一个文件为 key 后缀的。

修改 /etc/nginx/nginx.conf 配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80; #监听80 http 重定向到https
server_name you domain;
# 强制转到 https
rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
listen 443 ssl; #监听443 https
server_name you domain; #配置域名
ssl_certificate cert/xxx.pem; #配置证书位置
ssl_certificate_key cert/xxx.key; #配置证书位置
location / {
proxy_pass http://localhost:8080; # 要反向代理的服务器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}

重启 nginx

1
sudo nginx -s reload

找到安全组设置,手动添加一条规则,优先级任意,协议类型为自定义 TCP,目的为 443,源为:0.0.0.0/0,保存。

打开浏览器,输入 https:// + 域名 ,就可以看到右上角的小绿锁咯。


一次博客部署的经历
http://aim467.github.io/2022/06/14/记一次博客部署/
作者
Dedsec2z
发布于
2022年6月14日
更新于
2023年4月24日
许可协议