Halo 动态博客搭建和代理配置

本文最后更新于:2022年9月11日 下午

使用阿里云服务器搭建动态博客,以及配置Nginx反向代理。

动态博客搭建

之前搭建了静态的Hexo博客,因为是部署在Git Page上,所以服务器端基本不用操心,整个博客搭建过程也比较顺利;后面就一直想试试在一台真正的服务器上搭建一个网站,今天也是终于把这个愿望给完成了。这次选的是Halo这个动态博客框架,文档资料比较全,配置步骤也还好。

云服务器购买

首先当然是要租一台云服务器来放这个博客,我选的是阿里云的服务器,因为只是想来练练手,所以云主机选的是1核2G的配置,算上新人优惠一年也才 20 多块。服务器系统我装的是用的比较多的CentOS 7.4,然后设个好记的root用户密码,其他的就没什么了。

服务器端部署博客

服务器系统装好后,需要远程登录进行操作,我用的远程登录软件是Mobaxterm,集成文件传输功能,支持的协议也多。另外,在远程登录前,可以先去阿里云控制台云服务器 ECS面板的安全组下确认一下当前服务器的远程登录端口22端口是否是打开的,否则远程登录不上。

Mobaxterm中新建一个session,选择ssh登录方式,然后输入云主机的公网IP地址,选择root用户登录,然后按提示输入之前设置的密码就可以成功登录了。正常来说应该创建一个新用户来进行博客的部署,但我打算就用这个服务器来搭建这个博客,没有别的用途,所以就无所谓了,直接用root用户开整。

到这里,就可以参考Halo给的文档来部署博客了。

安装 Java

由于Halo是依赖于Java运行的,因此需要先安装JDK

1
2
sudo yum install java-11-openjdk -y
java -version # 查看 Java 版本,检测是否安装成功

Halo 下载与配置

首先下载Halojar包:

1
2
mkdir ~/app && cd ~/app # 创建包的存放路径并进入该目录
wget https://dl.halo.run/release/halo-1.5.4.jar -O halo.jar # 下载 jar 包,重命名为 halo.jar

然后创建Halo的工作目录,并编辑配置文件:

1
2
3
mkdir ~/.halo && cd ~/.halo
wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml # 下载 halo 提供的示例配置文件
vim ./application.yaml # 使用 vim 编辑配置文件

Vim打开配置文件后如下,可以改端口号和数据库用户名密码,其他保持默认就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server:
port: 8090 # 默认端口号,可以修改

# Response data gzip.
compression:
enabled: true

spring: # 使用 h2 数据库就行
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/.halo/db/halo
username: admin # 在 Halo 第一次运行前可以修改
password: 123456 # 在 Halo 第一次运行前可以修改
h2:
console:
settings:
web-allow-others: false
path: /h2-console
enabled: false

halo:
# Your admin client path is https://your-domain/{admin-path}
admin-path: admin # 博客后台管理界面位置

# memory or level or redis
cache: memory

启动 Halo

回到halo.jar的存放目录启动Halo

1
cd ~/app && java -jar halo.jar

出现如下提示则表示安装成功,Ctrl + C结束运行:

1
2
3
run.halo.app.listener.StartedListener    : Halo started at         http://127.0.0.1:8090
run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin
run.halo.app.listener.StartedListener : Halo has started successfully!

如果是升级Halo版本,则可能会报错提示8090端口被占用,这时只需要结束占用该端口的进程就行:

1
2
netstat -tlnp | grep ":8090" # 查找占用 8090 端口的进程
kill xxxx # xxxx 就是上个命令筛选出的进程所对应的进程号

设置 Halo 服务

因为最后要随时能访问博客,所以需要将Halo作为服务运行,Halo提供了服务的模板文件,将其下载并放到系统守护进程目录下:

1
2
wget https://dl.halo.run/config/halo.service -O /etc/systemd/system/halo.service
vim /etc/systemd/system/halo.service # 编辑服务配置

vim打开后的halo.service如下,只需填入halo.jar的目录就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Halo Service
Documentation=https://halo.run
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=USER # 这里我是 root 用户运行的,删掉这行就行,普通用户填入用户名即可
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH # YOUR_JAR_PATH 改为 halo.jar 的路径
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

重新加载系统守护进程

现在重新加载守护进程,并把Halo设为开机启动就行了:

1
2
3
systemctl daemon-reload # 重新加载系统守护进程
systemctl start halo # 启动 halo 服务
systemctl enable halo # 设置 halo 开机启动

至此,Halo的服务器端的配置基本就完成了,最后在阿里云控制台云服务器 ECS面板下的安全组中找到我们的服务器,添加规则开放8090端口,就可以在我们自己电脑上的浏览器通过主机IP地址:8090来访问搭建好的博客了。

域名购买与解析

通过IP访问毕竟不太方便,所以我又在阿里云上买了一个域名,算上新人优惠第一年只要 10 块钱左右,跟白嫖一样。域名买完后需要进行注册、实名认证、ICP备案和公安备案等一系列操作,虽然麻烦,但基本按流程走一下就行了,过程中会有阿里的客服联系确认信息。

有了域名之后,还要将域名解析到自己服务器的公网IP上,这个在阿里云控制台的云解析 DNS面板下添加记录,设置记录值为服务器主机IP地址就行了,

这样就可以通过域名:8090来访问刚刚建立的博客内容了。

SSL 证书购买

为了让服务器支持HTTPS,需要给服务器配置安全证书,在阿里云控制台数字证书管理服务面板下的SSL 证书选择免费证书购买,并绑定自己的域名,然后将证书压缩包xxx_nginx.zip下载到本地。通过Mobaxterm登录服务器,借助其FTP功能,直接将下载的证书压缩包文件拖到窗口中,就可以将证书上传到服务器中了。

Nginx 反向代理配置

虽然按照上面的配置就可以访问我们的博客了,但还存在一个问题,那就是由于上述服务器配置是直接接受网络请求的,当有大量的连接请求访问服务器的8090端口时,服务器不高的配置注定了它处理不过来这么多请求,这样就可能造成服务器卡死宕机。所以对于分布式部署的服务器,一般会使用Nginx服务器来接收客户端的请求,并按一定规则将请求分配给不同的后端服务器,实现负载均衡,这也就是反向代理。这里我只有一台服务器,所以Nginx会将请求直接转发给这台服务器,这样配置的基本思路就是:Halo仅监测云主机本地服务器127.0.0.1:8090的请求,Nginx服务器则接收外部客户端的请求并转发给本地服务器。

最后一句话中的Nginx服务器其实就是云主机本身,只不过它不是把请求转发给别的服务器,而是转发到自己内部的本地服务器上。

关于正向代理和反向代理的区别,前者相当于是在一个局域网中的客户端想要访问外网的服务器,这时候就需要客户端设置代理,让自己的请求通过代理服务器发送到外网服务器上,代理的是客户端;而后者则是在服务器端设置代理,将客户端的请求转发给不同的服务器去处理,比如图片请求就给图片服务器处理,视频请求就给视频服务器处理等等,代理的是服务器。

Nginx 编译和安装

首先下载Nginx 官网的源码到服务器:

1
wget https://nginx.org/download/nginx-1.xx.xx.tar.gz # 选择适当的版本即可,我用的 1.17.10

然后解压下载的压缩包并编译:

1
2
3
tar zvxf ./nginx-1.xx.xx.tar.gz && cd nginx-1.xx.xx # 解压压缩包
./config --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module # 配置编译选项
make && make install # 编译并安装

如果后面需要给服务器配置安全证书,则需要在编译选项中添加--with-http_ssl_module参数,否则证书配置时会报错。

Nginx默认安装在/usr/local/nginx/目录下,执行以下命令测试是否安装成功:

1
/usr/local/nginx/sbin/nginx -t # 执行后提示 Successful 就行了

Nginx 配置

接着配置Nginx代理,这之前需要将证书文件解压并放到Nginx的配置目录中:

1
2
mkdir /usr/local/nginx/conf/cert # 在 nginx 配置目录下创建保存证书的目录
unzip ./xxx_nginx.zip -d /usr/local/nginx/conf/cert # 将证书文件解压到上述目录下

然后编辑Nginx的配置文件,关于Nginx配置文件的介绍和说明可以参考CNBLOGS

1
vim /usr/local/nginx/conf/nginx.conf

进入编辑界面后定位到http模块,这里只需要编辑两个模块,首先是在upstream中定义http服务器组:

1
2
3
4
# nginx.conf
upstream halo {
server 127.0.0.1:8090; # 云主机中 halo 服务的运行地址
}

然后是编辑server模块,相当于是设置具体的转发规则,即Nginx接收到客户端请求后,根据这里设置的规则将请求转发给不同的服务器。对于我现在这台云主机,并不需要太复杂的配置,只需将客户端的httphttps请求转发到云主机的本地服务器就行,首先配置http请求转发规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# nginx.conf
server {
listen 80; # http 默认使用 80 端口
server_name your_domian; # 填写自己的域名
rewrite ^(.*)$ https://$host$1; # 将所有 HTTP 请求通过 rewrite 指令重定向到 HTTPS
#charset koi8-r;
#access_log logs/host.access.log main;
client_max_body_size 1024m; # 默认 1 M,上传大附件需要修改为较大的值

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;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

然后再配置https请求转发规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# nginx.conf
server {
listen 443 ssl; # https 默认使用 443 端口
server_name your_domain;
client_max_body_size 1024m;

ssl_certificate cert/xxx.pem; # 填写对应的解压完的证书文件
ssl_certificate_key cert/xxx.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://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;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

配置完后启动Nginx进行代理:

1
2
3
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 指定 Nginx 配置文件位置
/usr/local/nginx/sbin/nginx -s start # 启动 Nginx
/usr/local/nginx/sbin/nginx -s reload # 配置文件修改后。重新加载 Nginx

配置文件修改后,重新加载Nginx可能会报错,这时一般先指定一下配置文件的位置,再重新加载一次就可以了。

最后还需要检查云主机的80443端口是否已打开,打开后就可以使用域名安全地访问博客了,这时候就可以把云主机的8090端口对外关闭,只通过Nginx对博客进行访问。

总结

这次从头开始的博客搭建让我学到了很多知识,也积累了一些建站的经验,关于Nginx还需要学习的地方也还很多,慢慢来吧。

彩蛋

最近由于课题组服务器资源紧张,于是在阿里云上租了一个16核32G配置的Windows服务器来跑数值模拟,因为在浏览器登录和管理服务器太不方便了,就想着用Windows自带的远程桌面在自己的电脑上登录服务器使用。结果发现登不上去,于是就开始找问题:

  • 1.检查Windows远程登录端口3389否打开——没问题
  • 2.检查服务器是否开启远程登录以及管理员是否有远程登录权限——没问题
  • 3.检查Windows防火墙出入站规则——和阿里云安全组设的是一致的,没问题

一通操作之后还是登录不上,结果在阿里云的帮助里看到最后一条换网络环境,于是用电脑连手机热点,就登上去了😅。


Halo 动态博客搭建和代理配置
https://wanghao6736.github.io/2022/09/09/Website-Deployment/
作者
Wang Hao
发布于
2022年9月9日
许可协议