前言

主要参考来自于渊行Yus的halo个人博客搭建Halo官网文档
但是针对个人遇到的不同的情况做了一些改变,但是今天太晚了3:20am(比利时时间),明天起来编辑。

第二天

由于大部分都是基于Halo官方文档和渊行Yus文章的改动,所以文章样式上可能有所类似。但是对于云服务器的选择,和nginx容器配置的模块会有所不同。

1. 云服务器选择

云服务器选择的话,个人觉得虚拟主机和云服务器都可以没有太大的所谓,但是鉴于云服务器比虚拟主机的价格实在是便宜太多了,所以还是建议选云服务器吧,两者区别不大。地区的话国内外都可,虚拟主机国内偏便宜,云服务器国外偏便宜。国内优点是网速快,但是缺点要备份;国外优点是网速慢对于国内而言,但是不用备份。

机器描述价格/元
华北2虚拟主机(1年)Linux+CPU单核+内存1G+每月高速流量200G+网页空间5G+数据库500M+峰值带宽5Mbps500
新加坡虚拟主机(1年)Linux+CPU单核+内存1G+每月高速流量200G+网页空间5G+数据库500M+峰值带宽5Mbps632
轻量应用服务器(1年)CentOS+CPU2核+内存1G+每月流量400G+ESSD40G+峰值带宽3Mbps468
新加坡轻量应用服务器(1年)CentOS+CPU2核+内存1G+每月流量1024G+ESSD40G+峰值带宽30Mbps288

这里以新加坡轻量应用服务器为例子,首先登录阿里云账号,点击进入控制台>轻量应用服务器>服务器列表>创建服务器>立即购买,按照以下来选择轻量应用服务器:

一级选项二级选项三级选项
地域和可用性亚太新加坡
镜像系统镜像CentOS 7.3
套餐配置#因人而异,一般最便宜的就够了
额外数据盘#因人而异,我的是0GB
购买市场#因人而异
到期自动续费#建议勾上,不然写了很久的blog突然被释放了那哭死
购买数量1

购买之后在控制台>轻量应用服务器>服务器列表中,就可以看见我们购买成功的轻量应用服务器了,点击进去。在概览>应用搭建>站点设置可以看见我们的域名还没有被绑定与解析,这个我们之后在做。
安全>防火墙下可以看到防火墙的规则,默认放行端口为80、443、22。这里我们点击添加规则,规则如下。我们放行端口8888和端口8090,这两个端口分别是宝塔默认端口和Halo默认端口。在放行完端口之后,我们便可以进入云服务器的控制台进行安装HaloCMS的操作了。

应用类型协议端口范围备注
自定义TCP8888#随便填
自定义TCP8090#随便填

2. HaloCMS安装

A. 服务器连接

市面上常见的ssh工具很多,类似XShell之类的,可以自行搜索下载,但是阿里云的控制台直接就给我们提供了ssh连接选项,那么问题来了,为什么不直接在网上ssh连接,非要下个软件呢?进入到服务器运维>远程连接>远程连接,这个地方我们直接通过阿里云提供的ssh进入到服务器控制台,接下来的步骤严格按照Halo官网文档的步骤执行即可,但是为了避免零基础同学,和避免我以后忘记,还是按着流程走一遍。

B. HaloCMS安装

我们直接进入Halo官方文档,关于Linux环境部署页面,点击此连接。首先,刚建立的服务器一般来说都是没有Java环境的,而Halo最低以来要求为Java11,所以我们直接安装JRE11,输入以下命令:

sudo yum install java-11-openjdk -y

安装完成后检查版本:

java -version

输出为以下类似内容则代表成功,不一定非得是一模一样,但是只要是JRE11环境即可。

openjdk version "11.0.10" 2021-01-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode, sharing)

我们不推荐直接使用系统 root 用户来运行 Halo。如果您需要直接使用 root 用户,请跳过这一步。

根据Halo要求,所以我们先创建一个叫Halo的系统用户,输入如下命令即可:
创建一个名为halo 的用户(名字可以随意,我们直接用halo)

useradd -m halo

给予sudo权限,也就是superuser

usermod -aG wheel halo

为halo用户创建密码,输入密码的时候是看不见的,直接输入即可。

passwd halo

创建完halo用户后,我们创建存放运行包的目录。如果无法创建提示"Permission Denied"信息,那么我们输入命令"sudo su root"切换到root用户。但是一般不会,因为halo拥有sudo权限了。

mkdir ~/app && cd ~/app

下载运行包。

wget https://dl.halo.run/release/halo-1.4.8.jar -O halo.jar

创建工作目录

mkdir ~/.halo && cd ~/.halo

下载实列配置文件到工作目录

wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml

编辑配置文件,配置数据库或者端口。(如果没有什么基础,建议不要随意修改配置,我之前讲8090修改为80端口之后一直安装失败,弄了好久才发现是这个的问题;如果不编辑配置文件直接跳过即可,如果想要配置参考vim语法配置参考

vim application.yaml

测试运行Halo

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

如果看到类似以下的日志输出,或者整个过程中没有报出"error",那么恭喜你,就证明你安装Halo成功了。

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!

因为我们之前已经放行了8090端口,那么此刻我们打开http://ip:端口号,就可以直接看到安装引导界面。但是我们现在仍有两点需要做的,不然会导致以下两个问题的出现:

  1. 断开SSL连接后,服务便会停止,网站无法访问
  2. 仪表盘>博客设置>博客地址中,只要博客地址不是http://ip:端口号,就会出现css和js效果无法显示的情况,即没有排版

问题1的出现是由于没有将halo作为服务运行,而问题2的出现是由于没有配置好反向代理以及域名解析,这两个问题其实都在Halo官方文档被提及,但是问题2我真是找了好久才知道...那么我们先将halo作为服务运行吧,毕竟先运行起来,才是王道。

C. Halo作为服务运行

退出halo账户,登录到root账户。(如果当前就是root账户,请略过此步骤。)

exit

下载Halo官方的halo.service木板

wget https://dl.halo.run/config/halo.service -O /etc/systemd/system/halo.service

修改halo.service

vim /etc/systemd/system/halo.service

如果对于VIM语法没有接触过的同学,你会发现你现在其实是无法输入字符的,那是因为你不在输入状态,对于没有接触过VIM的同学,我们知道以下几个命令就可以了,至于更详细的VIM语法,请参考vim语法

  1. i:进入输入模式,此模式下才能够输入和修改文件
  2. ESC:退出输入模式,进入到命令模式
  3. :w:保存文件
  4. :q:退出文件
  5. :wq:保存+退出文件

好了,我们可以开始修改配置文件了,首先大家看到的初始状态应该是这样的

[Unit]
Description=Halo Service
Documentation=https://halo.run
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=USER
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

这其中我们会发现在第9行User后面有一个变量USER,和第10行后面有一个变量YOUR_JAR_PATH。输入i进入输入模式,分别将这两个改为

  1. USER:运行 Halo 的系统用户,如果有按照上方教程创建新的用户halo来运行 Halo,直接输入User=halo。反之请删除User=USER
  2. YOUR_JAR_PATH:Halo 运行包的绝对路径,直接输入/home/halo/app/halo.jar。注意:此路径不支持 ~ 符号。

最终配置文件将被修改为如下内容:

[Unit]
Description=Halo Service
Documentation=https://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 //修改此处
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

修改完成后,输入ESC退出输入模式。然后,输入:wq和按下回车保存退出。接着输入以下命令,使Halo作为服务运行:
重新加载systemd

systemctl daemon-reload

运行服务

systemctl start halo

在系统启动时启动服务

systemctl enable halo

您可以查看服务日志的检查启动状态,若没有报"error",一般就说明启动成功。到目前为止,即使断开阿里云上的ssh连接,我们也可以登陆上我们的博客了,证明halo已经作为一个服务在运行了。但是,还有一个问题困扰着我们,就是我们只能通过http://ip:端口号才能够显示出css和js效果,不然就是很混乱的排版(没有css和js效果),那么我们这个时候,就要去设置域名解析和反向代理了。是时候进行下一步了。离最后的成功不远了,大兄弟们o( ̄▽ ̄)ブ。

3. 域名解析与反向代理

其实到这里我们Halo已经安装完了,但是我们会发现,只要把仪表盘>博客设置>博客地址的博客地址改变了,所有的css和js都会无效,这其中的原因是因为我们没有配置好反向代理以及域名解析这一步将介绍如何做这一部分。

A. 域名解析

首先,说到域名解析,我们首先得购买域名对不对,直接通过阿里云购买域名即可,进入控制台>域名>域名列表>域名注册,通过查询域名,找到一个自己喜欢的而且没有被注册的域名,然后加入清单>立即结算>立即购买,付完款之后,就会发现域名已经在控制台>域名>域名列表下面了。我们直接在我们选好的域名行上,找到操作>解析>添加记录,添加记录的格式如下:

一级选项二级选项
记录类型A-将域名指向一个IPV4地址
主机记录xxx.你购买的一级域名
解析线路默认
记录值#云服务器的公网ip
TTL10分钟

这里有两个需要解释的地方,一个是域名,一个是云服务器的公网ip。

  1. 对于域名而言,又分为一级域名和二级域名,这里主机记录中的你购买的一级域名,其实就是你购买的域名字符串+域名后缀,比如说你买了一个seanzou.com,那么域名字符串就是seanzou,域名后缀就是com,所以这个地方主机记录应该是xxx.seanzou.com。值得注意的是xxx.seanzou.com这个地方是一个二级域名,xxx可以是任何东西,比如blog,比如shop都是可以的,这个地方我们是个blog,所以我们一般将主机记录设为blog.seanzou.com,也就是本站。
  2. 对于云服务器的公网ip查询,请进入控制台>轻量应用服务器>服务器列表>你所购买的服务器>概览>服务器信息>IP地址这一栏,会发现有一个(公)和一个(内),我们选择公网的IP地址。也就是(公)xxx.xxx.xxx.xxx后面这xxx.xxx.xxx.xxx一串。

好了,这里域名解析已经完成了,但是通常为了保险起见,我都会去轻量服务器里面再域名解析一遍。即进入控制台>轻量应用服务器>服务器列表>你所购买的服务器>站点设置>域名>添加域名,输入域名blog.seanzou.com即可(这里以我的博客为例),然后确认,但是通常会显示域名已解析,那就说明我们之前解析成功了。很好,目前为止域名解析已经完成了,剩下的就是反向代理,反向代理我们用的是宝塔面板来安装。

B. Nginx反向代理

什么??宝塔是什么,之前没有提及过要这个啊。Σ(っ °Д °;)っ。这个不用怕,宝塔其实和Halo一样,只是一个web应用而已,我们直接复制宝塔面板的下载安装命令,CentOS会帮我们自动下载与进行安装即可,命令如下:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

等待一会儿后,安装就完成了(如果期间提示(y/n)选择,选y就可以。)。我们的控制台上出现了以下输出内容。这啥我们的服务器宝塔面板的访问地址,乱码是为了服务器安全,我们把这些信息给截图保存下来,如果忘记了可以在服务器的服务器运维>远程连接>远程连接中,输入bt default重新查看。

外网面板地址:`http://外网IP:端口号/乱码`
外网面板地址:`http://内网IP:端口号/乱码`
username:xxxxxxxx
password:yyyyyyyy

我们复制http://外网IP:端口号/乱码到浏览器打开,会发现宝塔已经被安装好了。接着点同意,他会要求注册账号,于是便注册账号。首次进入宝塔面板会有软件的推荐安装,这个我们直接关掉,我们只需要后面从软件商城中自行安装nginx就好了。

首先,在左侧看到安全>防火墙,会发现与阿里云的放行端口相似。事实上,是一模一样,在阿里云放行了什么端口,我们就在这里的防火墙放行什么端口。宝塔默认放行端口80、22、8888,但是没有放行端口443和8090。于是便在防火墙栏低下输入端口与备注/说明,点击放行,依此放行443和8090.

放行端口端口备注/说明放行
443#可以不填,建议填阿里云自带放行端口
8090#可以不填,建议填HaloCMS端口

然后我们继续左侧菜单栏软件商店>应用搜索,搜索Nginx,然后点击安装>Nginx 1.21.0>极速安装。我安装的版本的Nginx 1.21.0,过程会需要耗费点时间,请耐心等待。

等待Nginx安装完毕后,我们点击左侧网站>添加站点,输入如下后点击提交(注意这里的域名是我们的一级域名seanzou.com,而不是二级域名)。

一级选项二级选项
域名seanzou.com
备注seanzou_com(一般为自动填充)
根目录/www/wwwroot/seanzou.com(一般为自动填充)
FTP不创建
数据库不创建
PHP版本纯静态
网站分类默认分类

提交后我们会发现在网站管理中会出现我们刚刚添加的站点seanzou.com,我们点击同行的操作>设置,在域名管理中输入我们的二级域名blog.seanzou.com,然后点击添加。到目前为止,不要气馁,已经快结束了,而且接下来的一步很重要,因为Nginx由于版本的不同,配置文件可能会有很大的不同。
我们严格按照Halo官方文档来进行,点击进入。进入到Halo官方文档后,下拉至反向代理。官方文档中给出了我们需要添加的东西,但是这还不够(通过我的血的教训,也可能是我的误操作),除了这些东西以外,我们还需要参考渊行Yus的halo个人博客搭建的部分代码。总之最后需要添加与修改的东西,对于Nginx 1.21.0而言如下:

upstream halo {
  server 127.0.0.1:8090;
}
server {
  listen 80;
  listen [::]:80;
  server_name www.yourdomain.com;
  client_max_body_size 1024m;
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    proxy_pass http://halo;
  }
  location ~ .*\.(js|css)?$ {
    proxy_pass http://halo;
  }
  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;
  }
}

不着急,我们一步步来。首先,我们在左侧软件商店>应用分类>已安装>软件名称>Nginx 1.21.0>设置>配置修改中找到Nginx 1.21.0的配置文件。默认的Nginx 1.21.0配置文件全文如下:

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
        include       mime.types;
		#include luawaf.conf;

		include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;

server
    {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;

        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;
}

接下来我们进行下面几个操作:

  1. server模块上,第59行位置,加入upstream模块,即:
upstream halo {
  server 127.0.0.1:8090;
}
  1. server模块中,第62、63行:
        listen 888;
        server_name phpmyadmin;

改为

        listen 80;
        listen [::]:80;
        server_name blog.seanzou.com;
        client_max_body_size 1024m;
  1. server模块中,第70行,location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$模块中,加入proxy_pass http://halo;
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            proxy_pass http://halo;
            expires      30d;
        }
  1. server模块中,第75行,location ~ .*\.(js|css)?$模块中,加入proxy_pass http://halo;
        location ~ .*\.(js|css)?$
        {
            proxy_pass http://halo;
            expires      12h;
        }
  1. server模块中,第84行(即location ~ /\.模块 和 access_log /www/wwwlogs/access.log;的中间)加入location /模块
        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;
        }

以下是最终的Nginx 1.21.0配置文件:

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

stream {
    log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
  
    access_log /www/wwwlogs/tcp-access.log tcp_format;
    error_log /www/wwwlogs/tcp-error.log;
    include /www/server/panel/vhost/nginx/tcp/*.conf;
}

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
        include       mime.types;
		#include luawaf.conf;

		include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;

upstream halo {
  server 127.0.0.1:8090;
} //添加

server
    {
        listen 80; //修改
        listen [::]:80; //添加
        server_name blog.seanzou.com; //修改
        client_max_body_size 1024m; //添加
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
        
        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            proxy_pass http://halo; //添加
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            proxy_pass http://halo; //添加
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }
        
        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;
        } //添加

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;
}

修改完所有需要修改的地方,点击保存。通常来说这个时候,配置文件就已经生效了,但是为了安全起见,我们去到niginx管理>服务>重启>确定。等待nginx容器重启,然后就真真正正的完成啦!

完结撒花~★,°:.☆( ̄▽ ̄)/$:.°★

后序

1. 安装Halo之后

如果后续想对Halo进行各种主题包装,halo已经把地址给我们了,在博客页面中,有一篇自动生成的文章,有如下链接:

2. 致谢

  1. 感谢Halo官方提供的HaloCMS,我们才能用到这么好用的系统
  2. 感谢Halo官网文档提供的帮助
  3. 感谢渊行Yus的halo个人博客搭建提供的主要帮助
  4. 感谢各大CSDN、Stack Overflow等博主提供的博文帮助

Q.E.D.


立志做一个有趣的碳水化合物