将我的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上
- 作者: 邱海梦旌
- 创建于 : 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 进行许可。