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

序言
这次的网站部署工作还挺不容易的,是一次非常新奇的尝试,从此刻执笔写下这篇文章开始,我已经意识到这将是一个漫长的过程,也说明本篇的内容很长,对于我或是读者来说都是一段漫长的征途了。
早在一年前我就搭建好了我的 blog,并且购买并配置了域名,那时候我的 blog 一直都是在 GitHub Pages 上的,但是访问速度实在太慢,于是想到把 blog 部署到国内的服务器上,本篇文章记录的正是这个部署的过程。
服务器
那首先我得有一台国内的服务器,因此我购买了一台云服务器 ECS。
服务器的操作系统是CentOS 7.9 64 位
之后配置服务器的过程,因为不同的操作系统命令会有区别,还请读者根据自己的操作系统查询命令。
安装 MATE 桌面环境
这个环节是非必要的,读者可跳过,这只是我熟悉服务器的一个小过程。
1.执行以下命令,更新系统的软件包
1 | yum -y upgrade |
2.依次执行以下命令,安装 MATE 桌面环境
之后会出现一些提示,都让他通过就行
1 | yum groups install "X Window System" |
3.设置默认使用图形化桌面环境启动实例
1 | systemctl set-default graphical.target |
4.执行以下命令重启 ECS 实例,也可以在控制台手动重启
1 | reboot |
5.之后通过 ECS 管理控制台的 VNC 连接实例就可以进入到图形界面
更多的详细过程可参考阿里云的文档:
如何在 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 |
配置 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 "邮箱" |
之后可以在C:\Users\用户名\.ssh目录下看到ssh
更新 Github 的 SSHkey
因为这里我们的 ssh 变了,所以 Github 上的 ssh 也应该重新设置下
登录 Github,点击个人头像中的 Settings,找到 SSH and GPG keys,删除原来的 SSH Keys,建立新的 SSH Keys
在 ssh 目录下找到 id_rsa.pub,拷贝其中内容到 GithubSSHkey 中
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 | cd nginx-1.20.2 |
之后再依次输入以下命令
1 | make |
到此 Nginx 就安装好了。
运行 Nginx 及欢迎页面问题
进入到 nginx 文件夹下的 sbin 目录启动 nginx,依次执行以下命令
1 | cd /usr/local/nginx/sbin |
之后在浏览器输入服务器的公网 IP 地址,就会出现 Nginx 的欢迎页面
也有可能出现 CentOS 的欢迎页面
关于出现 Nginx 或 CentOS 页面的问题,我当时在这卡了一段时间,因为我格式化过服务器,第一次安装 Nginx 时出现的是 Nginx 的欢迎页面,第二次安装 Nginx 就出现了 CentOS 的欢迎页面,我就以为 Nginx 没安装成功,但是查看 Nginx 的确实在运行,于是找了下问题所在:
检查了阿里云的安全组策略,Nginx 的安装步骤,都没有发现问题,安装 Nginx 时阅读 nginx.conf 配置文件会发现欢迎页 index.html 文件路径。找到上面路径下的 html 文件,通过阅读发现这就是 CentOS 欢迎页面显示的内容,这证明安装 Nginx 的欢迎页已经不是 Nginx 欢迎页面了,所以我们的 Nginx 安装是完全正确的,只是显示页面改变了。
Nginx 页面无法访问和服务器防火墙问题
在面对防火墙之前,我们找到服务器的网络安全组,看一看有没有开放80 端口,没有的话要添加一个。
然后我们回到服务器。
1.查看防火墙状态
1 | firewall-cmd --state |
如果没有运行,执行以下命令运行起来
1 | systemctl start firewalld.service |
再次查看防火墙的状态会显示 running
2.依次执行以下命令,手动开放 80 端口
1 | iptables -I INPUT -p tcp --dport 80 -j ACCEPT |
出现success
至此问题解决,可以正常访问 Nginx 欢迎页面。
创建 blog 仓库和部署
到这一步可以说是万事俱备,只欠东风了,现在我们需要进行:
- 新建仓库用来存放网站的内容
- 提交后把内容自动同步到站点目录
创建仓库
1.依次执行以下命令进入 git 目录,新建一个仓库
1 | cd /home/git |
2.进入 hooks 文件夹
1 | cd blog.git/ |
hooks
Git 钩子:Git 钩子是每次在 Git 存储库中发生特定事件时自动运行的脚本。它们允许您自定义 Git 的内部行为,并在开发生命周期的关键点触发可自定义的操作。
- Git 钩子(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。
- 通过钩子可以自定义 Git 内部的相关(如 git push)行为,关键点(如 git push)触发自定义的行为。
- Git 含有两种类型的钩子:客户端的和服务器端。
- 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于接收部署提交的代码。实现服务器和本地的 git 互通。
Git 钩子存在于每个 Git 仓库的 .git/hooks 目录中。
1.编写 post-receive 脚本
1 | vi post-receive |
输入 i 进入 INSERT 模式,内容如下
1 | #!/bin/bash |
写好后 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 | cd /home/git |
6.被同步的目录也需要授予最高权限和 git 用户
1 | cd /usr/local/nginx |
hexo 配置
打开 hexo 的主配置文件,添加 deploy 仓库
1 | type: git |
同步到服务器
在本地 blog 文件夹下 Git Bash Here,执行以下命令
1 | hexo clean |
完成后,输入服务器的 IP 地址就可以访问到网站了。
可以检查下服务器上是否有我们的博客文件
1 | cd /usr/local/nginx/html |
检查无误就大功告成了。
域名解析
这一步是让我的域名绑定服务器,绑定之后就能以域名访问网站了。这一步很简单,只需要添加域名解析就行。
这里添加两个记录: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 证书
点击证书栏右侧“下载”,找到服务器类型 Nginx 下载。
传输到服务器
下载后的证书是一个压缩包,解压后会有两个文件:**.key 和.pem**
这里可以解压后传输到服务器,也可以把压缩包直接传输到服务器,但是需要在服务器上解压,所以服务器需要安装 ZIP 解压软件。这里我选择先解压再传输到服务器。
安装 unzip
1 | yum install unzip |
1.在 Nginx 根目录下 conf 文件夹下创建存放证书的目录 cert
1 | cd /usr/local/nginx/conf |
这里我选择先解压再传输到服务器。
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 | # HTTPS server |
修改后的 HTTPS server
1 | HTTPS server |
3.修改 80 端口 server 的内容
原来 80 端口的 server
1 | server { |
修改后的 80 端口 server
1 | server { |
服务器界面展示:
修改完成后保存退出
重启 Nginx 服务
来到 nginx 的 sbin 目录执行重启命令
1 | cd /usr/local/nginx/sbin |
发现报错:
重启失败解决方案
好的,不论是跳转来这一步的朋友,还是跟着我步骤的朋友,现在看一看 nginx.conf 文件 443 端口那里的 HTTPS server 是不是注释掉的。
也就是如下
1 | # HTTPS server |
还没修改 server 的朋友请注意不要将 HTTPS server 解注释。
已经跟着我走的朋友请回去将其注释掉。
之后再次重启 Nginx 服务就成功了。
重启失败解决方案第二版
为什么有第二版解决方案呢,这版解决方案是针对:
由于我们未装 SSL 模块,启动时,会提示 nginx:[emerg]unknown directive ssl 错误
因为我是先遇到第一版错误,不知道错哪了,查资料时干脆把这一版的解决方案先做了,到最后发现我并未存在此版错误,但我认为还是有必要提一下的。
如果未做该版解决方案的朋友你跟着我前面的步骤很顺利的重启了,那么你可以跳过此小节到“放行 443 端口”。
好的,让我们看看这一错误该怎么解决。
先执行cd ~
1.检查你是否安装了 ssl 模块
1 | cd /usr/local/nginx |
如下图所示显示已经安装 ssl 模块则证明你不存在此版错误。
2.如果没有 ssl 模块,我们先来到 Nginx 的解压目录,跟着我的步骤走的朋友路径如下,其他的朋友可能你的解压目录在/usr/local/nginx-1.20.2
1 | cd ~ |
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 | cd /usr/local/nginx |
显示有 ssl 模块,那么就证明我们安装成功了,之后就能正常重启 nginx 了。
放行 443 端口
1.执行以下命令查看 443 端口是否在运行
1 | netstat -nplt lgrep 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 服务正常运行。
5.进入 ECS 安全组策略
放行 TCP 协议 443 端口的入方向请求
6.执行 curl 命令,查询服务器响应 header 信息
1 | curl -l https://invictusqiu.com |
结果显示 HTTPS 请求可以正常响应。
至此所有工作都完成了!
结尾
此番部署工作可谓是困难重重,在此途中卡了好多次,甚至一个重启 nginx 的问题都解决了好久,关于我是怎么知道 HTTPS server 需要注释掉的呢?在网上翻来覆去搞了半天,看到这个视频:
哈哈哈,找个错误 CPU 都干烧了,结果是这种错误。
这种 Error 可谓是读计算机专业家常便饭的事了。
最后分享一件事作为本篇文章的结尾:
我一直很钦佩纯粹的人,特别是以具体的目光投射到他身上时也依然纯粹的人,但这样的人只是我心目中的理想化,我也只是追寻着“这类不存在的人”的脚步前进罢了。几天前跟朋友聊天,聊到了跟几年前的自己做对比。假如需要你去做一件短时间内几乎不可能完成的事,以至于需要“燃尽”自己,你还会去做吗?我不可否认,在塑造世界观的那个年纪,现实、电影、小说、电子游戏等都或多或少影响到过我的世界观。
在几年前如果你问我这个问题,我的回答甚至偏向于“会”,但是现在我想还是算了罢,我想这就是现在的自己和几年前自己一个最大的对比。
我并不是否认“会”这个选项,只是它现在不是最优解了。所以我为什么钦佩纯粹的人,是因为他们从不会因为“时态”而去改变自身的选择,这也是我为什么仅仅只是追随他们而不是成为他们的原因吧。
本章一句:
以我残躯化烈火。—— Cyberpunk 2077 隐藏结局
- 标题: 将我的blog部署在云服务器ECS上
- 作者: Haijun Qiu
- 创建于 : 2023-04-15 15:33:22
- 更新于 : 2025-06-04 20:38:59
- 链接: https://blog.invictusqiu.top/2023/04/15/DeployBlog/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
预览: