将我的blog部署在云服务器ECS上

将我的blog部署在云服务器ECS上

邱海梦旌 Lv1

序言

这次的网站部署工作还挺不容易的,是一次非常新奇的尝试,从此刻执笔写下这篇文章开始,我已经意识到这将是一个漫长的过程,也说明本篇的内容很长,对于我或是读者来说都是一段漫长的征途了。

网站主页

早在一年前我就搭建好了我的blog,并且购买并配置了域名,那时候我的blog一直都是在GitHub Pages上的,但是访问速度实在太慢,于是想到把blog部署到国内的服务器上,本篇文章记录的正是这个部署的过程。

服务器

那首先我得有一台国内的服务器,因此我购买了一台云服务器ECS。

服务器的操作系统是CentOS 7.9 64位

之后配置服务器的过程,因为不同的操作系统命令会有区别,还请读者根据自己的操作系统查询命令。

安装MATE桌面环境

这个环节是非必要的,读者可跳过,这只是我熟悉服务器的一个小过程。

1.执行以下命令,更新系统的软件包

1
yum -y upgrade

2.依次执行以下命令,安装MATE桌面环境
之后会出现一些提示,都让他通过就行

1
2
yum groups install "X Window System"
yum groups install "MATE Desktop"

3.设置默认使用图形化桌面环境启动实例

1
systemctl set-default graphical.target

4.执行以下命令重启ECS实例,也可以在控制台手动重启

1
reboot

控制台重启ECS

5.之后通过ECS管理控制台的VNC连接实例就可以进入到图形界面
VNC连接ECS
图形界面

更多的详细过程可参考阿里云的文档:
如何在Linux系统的ECS实例中安装图形界面

安装Git

Git 是分布式版本控制系统,有了它我们能很容易地进行主机与服务器的同步

1.首先查看服务器上是否有安装Git

1
git --version

2.执行以下命令安装Git

1
yum install git

之后碰到提示直接输入y通过。安装完成会出现Complete!

3.执行以下命令创建一个Git用户

1
useradd git

4.设置Git账户的密码

1
passwd git

设置Git账户和密码

配置ssh

要想实现主机和服务器的Git连接,我们需要给到服务器我们主机的密钥

首先主机上要安装Git,主机Git的安装过程在此略过……
之前我一直都用着Git,所以已经配置过ssh,但为了温故而知新,咱们从头再来配置一遍。

生成ssh

1.我们在Desktop右键选择Git Bash Here,然后输入命令,引号内为你的Git用户名

1
git config --global user.name '用户名'

2.输入邮箱

1
git config --global user.email '邮箱'

然后可以输入以下命令确认下账户

1
git config --list

3.输入以下命令生成ssh,遇到暂停输入的情况就按下回车

1
ssh-keygen -t rsa -C "邮箱"

配置ssh
之后可以在C:\Users\用户名\.ssh目录下看到ssh

更新Github的SSHkey

因为这里我们的ssh变了,所以Github上的ssh也应该重新设置下

登录Github,点击个人头像中的Settings,找到SSH and GPG keys,删除原来的SSH Keys,建立新的SSH Keys

在ssh目录下找到id_rsa.pub,拷贝其中内容到GithubSSHkey中
Github的SSH keys

OK,之后我们在使用Git管理你的Github仓库时就不会出问题了。

将公钥给服务器

将公钥给到服务器,在ssh目录下右键选择Git Bash Here,输入以下命令

1
ssh-copy-id -i id_rsa.pub git@服务器IP地址

注:服务器IP地址为公网IP地址

将公钥给服务器

好的,到这里我们的ssh全部完成,让我们回到服务器上。

Nginx

Nginx是一个高性能的HTTP和反向代理服务器,我选择使用Nginx来作为web服务器。

安装Nginx

1.执行以下命令安装Nginx,版本我选择了1.20.2

1
wget http://nginx.org/download/nginx-1.20.2.tar.gz

2.安装依赖

1
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

3.上一步完成后,解压依赖

1
tar -zxvf nginx-1.20.2.tar.gz

4.解压后进行配置,依次输入以下命令

1
2
cd nginx-1.20.2
./configure

配置Nginx
之后再依次输入以下命令

1
2
make
make install

到此Nginx就安装好了。

运行Nginx及欢迎页面问题

进入到nginx文件夹下的sbin目录启动nginx,依次执行以下命令

1
2
cd /usr/local/nginx/sbin
./nginx

运行Nginx

之后在浏览器输入服务器的公网IP地址,就会出现Nginx的欢迎页面

Nginx欢迎页面

也有可能出现CentOS的欢迎页面

CentOS欢迎页面

关于出现Nginx或CentOS页面的问题,我当时在这卡了一段时间,因为我格式化过服务器,第一次安装Nginx时出现的是Nginx的欢迎页面,第二次安装Nginx就出现了CentOS的欢迎页面,我就以为Nginx没安装成功,但是查看Nginx的确实在运行,于是找了下问题所在:

检查了阿里云的安全组策略,Nginx的安装步骤,都没有发现问题,安装Nginx时阅读nginx.conf配置文件会发现欢迎页index.html文件路径。找到上面路径下的html文件,通过阅读发现这就是CentOS欢迎页面显示的内容,这证明安装Nginx的欢迎页已经不是Nginx欢迎页面了,所以我们的Nginx安装是完全正确的,只是显示页面改变了。

Nginx页面无法访问和服务器防火墙问题

在面对防火墙之前,我们找到服务器的网络安全组,看一看有没有开放80端口,没有的话要添加一个。
开放80端口

然后我们回到服务器。

1.查看防火墙状态

1
firewall-cmd --state

如果没有运行,执行以下命令运行起来

1
systemctl start firewalld.service

再次查看防火墙的状态会显示 running

2.依次执行以下命令,手动开放80端口

1
2
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
firewall-cmd --permanent --add-port=80/tcp

出现success
至此问题解决,可以正常访问Nginx欢迎页面。

创建blog仓库和部署

到这一步可以说是万事俱备,只欠东风了,现在我们需要进行:

  1. 新建仓库用来存放网站的内容
  2. 提交后把内容自动同步到站点目录

创建仓库

1.依次执行以下命令进入git目录,新建一个仓库

1
2
cd /home/git
git init --bare blog.git

2.进入hooks文件夹

1
2
cd blog.git/
cd hooks/

创建仓库

hooks

Git 钩子:Git 钩子是每次在 Git 存储库中发生特定事件时自动运行的脚本。它们允许您自定义 Git 的内部行为,并在开发生命周期的关键点触发可自定义的操作。

  • Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。
  • 通过钩子可以自定义 Git 内部的相关(如 git push)行为,关键点(如 git push)触发自定义的行为。
  • Git 含有两种类型的钩子:客户端的和服务器端。
  • 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于接收部署提交的代码。实现服务器和本地的git互通。

Git 钩子存在于每个 Git 仓库的 .git/hooks 目录中。
Git 钩子

1.编写post-receive脚本

1
vi post-receive

输入i进入INSERT模式,内容如下

1
2
3
4
5
6
#!/bin/bash
#nginx下html文件夹目录
DIR=/usr/local/naginx/html
git --work-tree=${DIR} clean -fd
#直接强制检出
git --work-tree=${DIR} checkout --force

写好后ESC退出INSERT模式,:wq保存退出

2.授予运行权限

1
chmod +x post-receive

3.授予git用户

1
chown -R git post-receive

4.给到一个读写的最高权限

1
chmod 777 post-receive

5.回到git目录下,给仓库同样的操作

1
2
3
cd /home/git
chmod 777 blog.git/
chown -R git blog.git/

6.被同步的目录也需要授予最高权限和git用户

1
2
3
cd /usr/local/nginx
chmod 777 html/
chown -R git html/

hexo配置

打开hexo的主配置文件,添加deploy仓库

1
2
3
type: git
repo: git@服务器IP地址:/home/git/blog.git
branch: master

同步到服务器

在本地blog文件夹下Git Bash Here,执行以下命令

1
2
hexo clean
hexo deploy

完成后,输入服务器的IP地址就可以访问到网站了。

可以检查下服务器上是否有我们的博客文件

1
2
cd /usr/local/nginx/html
ls

检查无误就大功告成了。

域名解析

这一步是让我的域名绑定服务器,绑定之后就能以域名访问网站了。这一步很简单,只需要添加域名解析就行。

这里添加两个记录:www和@,记录值都是服务器的IP地址
域名解析

SSL证书

SSL 证书就是遵守 SSL 安全套接层协议的服务器数字证书。而 SSL 安全协议最初是由美国网景 Netscape Communication 公司设计开发的,全称为:安全套接层协议 (Secure Sockets Layer) , 它指定了在应用程序协议(如 HTTP、Telnet、FTP)和 TCP/IP 之间提供数据安全性 分层的机制,它是在传输通信协议(TCP/IP)上实现的一种安全协议,采用公开密钥技术,它为 TCP/IP 连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。由于此协议很好地解决了互联网明文传输的不安全问题,很快得到了业界的支持,并已经成为国际标准。SSL 证书由浏览器中“受信任的根证书颁发机构”在验证服务器身份后颁发,实现网站身份验证和加密传输功能。

装载SSL证书产品后自动激活浏览器中显示“锁”型安全标志,地址栏以“https”开头。

获取SSL证书

获取的方式挺多,可以购买,也可以免费获取,我的证书是领的阿里云免费给的20张证书。
免费的SSL证书

下载SSL证书

点击证书栏右侧“下载”,找到服务器类型Nginx下载。
下载SSL证书

传输到服务器

下载后的证书是一个压缩包,解压后会有两个文件:**.key和.pem**

这里可以解压后传输到服务器,也可以把压缩包直接传输到服务器,但是需要在服务器上解压,所以服务器需要安装ZIP解压软件。这里我选择先解压再传输到服务器。

安装unzip

1
yum install unzip

1.在Nginx根目录下conf文件夹下创建存放证书的目录cert

1
2
cd /usr/local/nginx/conf
mkdir cert

这里我选择先解压再传输到服务器。

2.在ECS控制台发送.key和.pem文件,目标路径为

1
/usr/local/nginx/conf/cert/

上传成功后,进入cert文件夹可以看到存在这两个文件了

修改 server

1..返回conf文件夹编辑Nginx配置文件nginx.conf,修改与证书相关的配置,目的是打开443端口。

1
vim nginx.conf

2.找到HTTPS server,将其内容解注释并修改

以下步骤含错误示范,还请读者不要着急模仿,可以先去下面看一眼“重启失败解决方案”的内容,方便之后一步到位。

当然也可以跟着我的步骤来,之后修改错误。

原来的HTTPS server内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# HTTPS server
#
# server {
# listen 443 ssl;
# server_name localhost;


# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;


# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}

修改后的HTTPS server

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
27
28
29
30
31
HTTPS server

server {
#HTTPS的默认访问端口为443
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动
#如果使用Nginx 1.15.0及以上版本,请使用listen 443 ssl 代替listen 443和ssl on
listen 443 ssl;
#填写证书绑定的域名
server_name www.invictusqiu.com;
root html;
index index.html index.htm;

#填写证书文件名称
ssl_certificate cert/9575407_www.invictusqiu.com.pem;
ssl_certificate_key cert/9575407_www.invictusqiu.com.key;

ssl_session_timeout 5m;

#表示使用的加密套件的类型
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的TLS协议的类型,需要自行评估是否配置TLSv1.1协议
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

location / {
#Web网站程序存放目录
root html;
index index.html index.htm;
}
}

3.修改80端口server的内容

原来80端口的server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#后面内容可忽略
}

修改后的80端口server

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
server {
listen 80;
#填写证书绑定的域名
server_name www.invictusqiu.com;
#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*)$ https://$host$1;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#后面内容可忽略
}

服务器界面展示:
443端口原来的server
443端口现在的server
80端口原来的server
80端口现在的server

修改完成后保存退出

重启Nginx服务

来到nginx的sbin目录执行重启命令

1
2
cd /usr/local/nginx/sbin
./nginx -s reload

发现报错:
重启错误

重启失败解决方案

好的,不论是跳转来这一步的朋友,还是跟着我步骤的朋友,现在看一看nginx.conf文件443端口那里的HTTPS server是不是注释掉的。

也就是如下

1
2
3
4
5
# HTTPS server

server {
listen 443 ssl;
server_name localhost;

还没修改server的朋友请注意不要将HTTPS server解注释。

已经跟着我走的朋友请回去将其注释掉

之后再次重启Nginx服务就成功了。

重启失败解决方案第二版

为什么有第二版解决方案呢,这版解决方案是针对:
由于我们未装SSL模块,启动时,会提示nginx:[emerg]unknown directive ssl错误

因为我是先遇到第一版错误,不知道错哪了,查资料时干脆把这一版的解决方案先做了,到最后发现我并未存在此版错误,但我认为还是有必要提一下的。

如果未做该版解决方案的朋友你跟着我前面的步骤很顺利的重启了,那么你可以跳过此小节到“放行443端口”。

好的,让我们看看这一错误该怎么解决。

先执行cd ~

1.检查你是否安装了ssl模块

1
2
cd /usr/local/nginx
./sbin/nginx -V

如下图所示显示已经安装ssl模块则证明你不存在此版错误。
存在ssl模块

2.如果没有ssl模块,我们先来到Nginx的解压目录,跟着我的步骤走的朋友路径如下,其他的朋友可能你的解压目录在/usr/local/nginx-1.20.2

1
2
cd ~
cd /root/nginx-1.20.2

3.添加ssl模块

1
./configure --with-http_ssl_module

4.执行make命令,编译安装包

1
make

5.查看objs文件夹下有一个nginx文件,这个就是新版程序,然后备份下之前的nginx

1
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

6.把编译好的nginx文件替换之前的

1
cp objs/nginx /usr/local/nginx/sbin/nginx

如果无法替换,显示
cannot create regular file '/usr/local/nginx/sbin/nginx': Text file busy

执行以下命令查看nginx进程

1
ps -ef | grep nginx

发现正在运行

查看进程号,执行以下命令关闭nginx进程

1
kill -QUIT 4809

再次查看nginx进程,可以看到已经关闭,之后再次执行上面的替换命令,就能成功替换了。

7.最后查看下是否安装成功了

1
2
cd /usr/local/nginx
./sbin/nginx -V

显示有ssl模块,那么就证明我们安装成功了,之后就能正常重启nginx了。

放行443端口

1.执行以下命令查看443端口是否在运行

1
netstat -nplt lgrep 443

可以看到正在运行
443端口正常运行

2.添加防火墙端口

查看防火墙运行状态

1
firewall-cmd --state

显示running,则进入下一步。

查看开放的端口

1
firewall-cmd --list-ports

发现没有443端口。

添加443端口

1
firewall-cmd --zone=public --add-port=443/tcp --permanent

显示success

3.重新加载防火墙

1
firewall-cmd --reload

显示success

再次查看开放的端口

1
firewall-cmd --list-ports

可以看到存在443端口。

添加防火墙端口

4.检查本地443端口加载的HTTPS服务以及证书是否正常,域名名称为你自己的域名

1
echo | openssl s_client -connect 127.0.0.1:443 -servername invictusqiu.com 2>/dev/null

结果出现SSL-Session表示HTTPS服务正常运行。

SSL-Session

5.进入ECS安全组策略
进入ECS安全组策略

放行TCP协议443端口的入方向请求
放行443端口

6.执行curl命令,查询服务器响应header信息

1
curl -l https://invictusqiu.com

结果显示HTTPS请求可以正常响应。
响应header信息

至此所有工作都完成了!

结尾

此番部署工作可谓是困难重重,在此途中卡了好多次,甚至一个重启nginx的问题都解决了好久,关于我是怎么知道HTTPS server需要注释掉的呢?在网上翻来覆去搞了半天,看到这个视频:

哈哈哈,找个错误CPU都干烧了,结果是这种错误。
这种 Error 可谓是读计算机专业家常便饭的事了。

最后分享一件事作为本篇文章的结尾:
  我一直很钦佩纯粹的人,特别是以具体的目光投射到他身上时也依然纯粹的人,但这样的人只是我心目中的理想化,我也只是追寻着“这类不存在的人”的脚步前进罢了。几天前跟朋友聊天,聊到了跟几年前的自己做对比。假如需要你去做一件短时间内几乎不可能完成的事,以至于需要“燃尽”自己,你还会去做吗?我不可否认,在塑造世界观的那个年纪,现实、电影、小说、电子游戏等都或多或少影响到过我的世界观。
  在几年前如果你问我这个问题,我的回答甚至偏向于“会”,但是现在我想还是算了罢,我想这就是现在的自己和几年前自己一个最大的对比。
  我并不是否认“会”这个选项,只是它现在不是最优解了。所以我为什么钦佩纯粹的人,是因为他们从不会因为“时态”而去改变自身的选择,这也是我为什么仅仅只是追随他们而不是成为他们的原因吧。

本章一句:
以我残躯化烈火。—— Cyberpunk 2077 隐藏结局

  • 标题: 将我的blog部署在云服务器ECS上
  • 作者: 邱海梦旌
  • 创建于 : 2023-04-15 15:33:22
  • 更新于 : 2024-12-09 23:01:10
  • 链接: https://blog.invictusqiu.top/2023/04/15/DeployBlog/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论