聊聊情怀~一名技术人怎能少了自己的博客?

对于建站,建一个完整的博客网站知识都比较零散。从域名 domain 的购买,DNS 配置,服务器安装,上线网站服务程序等一条龙,牵涉的内容着实不少。我们一样一样把它通关,心之所向即是大道。

一切的由来都要从进程的重启说起。

有一次和同事聊到进程自动重启,因为某些设备的配网动作需要重启 IOT 进程并触发接下来的流程,本来我想的还是比较简单,比如先启动一个同名子进程,然后关掉当前进程就够了。

但是我这同事牛逼得一匹非得搞个守护进程,说他们老东家中兴的后台就是如此,愚蠢如我一时没听懂,他就介绍我去看 Nginx 的源码,说里边就有这种实现。

嗯,我信了。于是开始翻找资料,翻着翻着,想到与其一上来就看源码,还不如先熟悉一下它的功能再说。

既然要熟悉功能那就离不开亲自上手操作了。Nginx 作为一个对标 Apache 的服务器软件,适合用于搭建网站项目。想到自己不是一直有写博客嘛,还定期在各大平台上发表,也说不定哪天平台就判定我违规,甚至帐号都有被封禁的可能,这样怕不是连说拜拜的机会都没有。

你会说,这种担忧是不是有点夸张了?

如果你留意最近有个车评人袁先生,在广州给某界测评了旗下某款车型,因为路面颠簸了点,方向盘没把握住,一下子猛拐,就为此说了些大实话,最终被平台封禁了帐号。虽说栖身于各大媒体平台的自媒体,有非常低的进入门槛,但是生存能力其实也是比较脆弱的。

再说回我身边的朋友,也有被封号的经历,所以某些事迟早要来,早做准备也好。

至于自己,作为一个在科技行业摸爬滚打的老油条,从情怀来讲,怎能没有自己的博客网站?

那么,它应该是脚踏七星彩云的大英雄?没那气势,学不来。

它应该是学富五车的大学问?我还年轻,慢慢来。

它应该是充满各种科幻概念的部落?少了烟火气,我更希望它是充满生活气息的一隅,悄悄打下这个时代的烙印。

就算是技术文,我也希望用隔壁大妈都听得懂的话讲出来。

所以我要开始搭一个自己的博客网站,并且是冲着言论自由去的,它将是一个大杂烩。

刚动手时,在网上看了不少的教程。对于建站,建一个完整的博客网站知识都比较零散。从域名 domain 的购买,DNS 配置,服务器安装,上线网站服务程序等一条龙,牵涉的内容着实不少。

不过不用怕,我们一样一样把它通关,心之所向即是大道。

域名和服务器

域名

先来看看耳熟能详的域名,什么是域名?

域名就是一串能替代 IP 便于记忆的字符串,比如 google.com

你要是让我平白无故地去记忆一串串毫无规律的数字,比如 IP 地址,这真的很为难我啊。如果不是过目不忘的奇才,相信你也深有同感。

所以域名这东西就是为了照顾普通网民,方便我们记住网站地址的。

然后我们需要选一个自己喜欢的域名字段,再买下它。如你所见,我选了 englyf.com

在哪儿买呢?在各大域名服务商手里就可以很方便地选购,它们会提供域名查询功能,我只能从查询结果里选中一个,没显示的就不要惦记了,因为你心仪的域名字段可能早就被别人买下来了。

花了那么多心思挑选,我可以永久占有这个域名吗?

理论上是不行的。域名是由 ICANN (也叫互联网名称与数字地址分配机构)管理和颁发,这个机构规定了任何域名最多只能提供 10 年的使用期,所以购买的只是使用时间,到期了还想继续使用也可以续期,否则强制收回。

这么说,买域名其实是租使用权而已,服务商其实就是个中介商。

要想持续占用它就需要不断续期,这就有个坑了,续期时要是换服务商会变得很麻烦。先不说换了服务商再续期价格可能差别很大,甚至有的商家会故意为难你,让你的域名暂时锁定不能用,所以麻烦啊。这个时候,我建议挑选服务商以大厂为妙。大厂突然倒闭的可能要比小厂低很多吧?

挑来挑去,我挑了一家国外靠前的服务商,无它,还是为了自由二字。

服务器

聊完域名,接下来要说对应的 IP 地址了。

IP 地址对应的是硬件设备在网络中的通信地址,就好像我们每家每户都有个门牌号。IP 地址通常由通信服务商提供,比如国内的三大电信公司。如果你有自己的服务器,自己拉宽带网络,那么通信服务商会给你一个 IP 地址。如果你是从云厂商租借服务器,那么云厂商会从他们的 IP 池里分一个给你用,你是不需要自己拉网线的。

我从云厂商租了一台服务器资源,它并不是一台独立的服务器,而是虚拟出来的服务资源,我可以把它当做一台独立的设备使用。

咱的目标是它不会动不动就被封,就像冲动如我,在某一天讲了未经核实的大实话也可以云淡风轻一般没有后顾之忧。

所以服务器得放在外边。那么里边指的是哪里?你每天要汇报行踪,查绿码,测核酸的地方就叫里边。

还要考虑网速的问题,欧美日那些服务器都有点远,途中经过太多网络节点,就算带宽很足也不管用。要是里边的朋友不能自由阅读,毋宁啥也不干。所以我选了 HK 地区,毕竟墙再高,靠近围墙信号也会强一些,有些厂商甚至提供了高速回国的信道,目前来看就算不依赖工具直接访问阅读内容都很 OK。

莫非打脸要等一段时日,再回过头来看?

至于服务器的配置大小,由于是运行在公网的博客网站,所以 1G 单核的配置就不要考虑了,最起码都要加一倍的配置,否则安装部署都可能让你犯难。

云厂商一般对新客都比较有优惠,所以抓住第一次购买的红利,挑选厂商一定要找售前客服问问看,别漏了。

最终由于某厂商客服推荐廉价入手 4G 4 核配置一台。

DNS 配置

从用户输入网址 URL 到网页被浏览器完全加载,浏览器访问网页的通信过程涉及 DNS 解析、TCP 连接建立、TLS/SSL 加密、HTTP 请求与响应、HTML 解析、资源加载、JavaScript 执行和页面渲染等多个步骤。

DNS 又叫域名系统,简单来说就是用于将我们的域名映射到 IP 地址的系统。计算机设备在互联网中互相通信依赖于各自的 IP 地址,所以浏览器用户和网站之间的通信过程必然要经历 DNS 服务过程。

DNS 服务过程,分为本地查找缓存和远程 DNS 服务器查找。本地又分为本地缓存和系统缓存,DNS 服务器也有多级。查找先本地再远程,这样一级一级查找直到找到对应信息。

那么 DNS 返回的信息是从何而来?

我们在购买域名后,对应的服务商会提供配置选项。

对于域名所有者来说,需要在服务商后台配置页面添加 A/CNAME 记录才能使得域名正确指向服务器 IP。

A 类型的记录负责将域名指向 IP 地址,名字一栏一般填 @,值一栏一般填目标服务器 IP 地址。

有的服务商会在域名被注册成功时自动为其添加一条 A 类型的记录(值为 parked 而不是 IP 地址)。在该域名被指向任何网站或服务之前,parked 记录会帮助域名能够显示一个基本的网页,而不是返回错误页面。直到域名所有者添加了新的 A 记录将域名指向 IP 地址,parked 记录会自动被移除。

CNAME 类型的记录负责将子域名指向主域名。比如名字一栏填 www,值一栏填主域名。这样浏览器用户输入带有 www 的 URL 时,DNS 会先转换为主域名,然后才查找对应 IP 地址。

以 godaddy 为例,看我的配置页面:

如上配置之后,可通过 dig 或者 nslookup 指令验证域名指向:

如果这步返回有多个 IP,说明域名服务商给你的域名配置加了料,比如多个 A 记录或 CDN 服务导致的等。这有可能会对后边的网站配置 SSL 证书有影响,配置 SSL 之前建议暂时去掉多余的记录配置,保持域名指向唯一的 IP 地址。

到目前为止,基础设施已打好。

安装

接下来就是安装配置在服务器中运行的相关程序和服务了。

我采用的服务器系统是 Ubuntu 20,这个系统对于大陆大部分 linux 开发者来说都不陌生,安装软件包自然采用比较主流的 APT。

进入系统默认使用 root 用户登录,在安装任何软件包之前,先更新一下 APT 包缓存:

apt-get update -y

更新 APT 包缓存之后,开始安装一些后边需要用到的依赖包:

apt-get install gnupg2 curl unzip git acl -y

Node

node 真的是一个神奇而万能的开发框架,哪哪都有它,它基于 javascript 语言开发。后边将要安装的 blog 服务程序 ghost 就是用 node 开发的,启动运行也需要 node 作为后台引擎。

由于 ghost 对 node 的版本有要求,一般都建议安装最新版 ghost,所以在安装 node 时最好先上 ghost 官网了解一下当前版本要求,下面是直达链接

https://ghost.org/docs/faq/node-versions/

当前 ghost 推荐 node 最新版本为 20,所以在使用 APT 安装 node 之前需要先指定安装仓库,通过下载对应脚本并执行:

curl -sL https://deb.nodesource.com/setup_20.x | bash -

然后就是常见的 node 安装步骤:

apt-get install nodejs -y

Nginx 和 MariaDB

安装 Nginx 的方法也是常规步骤:

apt-get install nginx -y

除此之外,由于网站是允许评论,甚至可以和博主一样发表内容,所以允许注册成员,那么成员信息又需要持久化存储在服务器中,这就离不开数据库技术了。

数据库是用来持久化存取数据的高效方式,有很多种类型,其中要数关系型数据库应用最广。

关系型数据库就像一个表格,每行是一整条数据,比如某成员的完整信息就可以是一行数据。成员名字是八戒,联系方式是 bajielyf@gmail.com,头像索引是 232115,id 是 87112543。每列是各条数据的不同字段,比如各成员的名字、联系方式、头像、id 等等都分别作为一个字段。这样的数据是结构化存储的,使用 SQL 语言可以非常快速地存取。

目前互联网上比较主流的大型关系型数据库引擎当属 MySQL,它目前还是开源免费的,但是它的创始人离开产品团队之后对于它目前的发展定位很不满意,担心它最终会变成闭源产品,于是基于原来的代码仓库做了分支,并且用自己爱女的名字 Maria 给它命名为 MariaDB。

对代码仓库拉分支,有点类似于乡下经常能看到的兄弟分家,但是弟弟直接拷贝了大哥的财产,大哥也没有被占到便宜。

要选择 MySQL 还是 MariaDB 作为我的网站数据库呢?

两个我都试过了,MySQL 运行起来要比 MariaDB 明显消耗更多系统资源,而且两个数据库引擎是兼容的。对于我这种穷逼一样的技术男,性格比较单纯,买不起太多的服务器资源,谁帮我省钱我就爱谁!

由于是服务器引擎版本,所以安装指令如下:

apt-get install mariadb-server -y

数据库引擎安装完毕,虽说可以正常运行了,但是它还处于不设防的状态,非常容易收到入侵,万一随意泄漏了登录用户的隐私数据,到时造成了损害找谁承担?

谁都不愿当冤大头,鉴于此,数据库引擎安装包提供了安全性配置脚本帮助管理者重设安全属性,执行下面的命令开始配置:

mysql_secure_installation

然后它会一条一条询问你的决定:

Enter current password for root (enter for none):
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

上面我们配置了数据库引擎 root 用户的密码,删掉了测试用户,禁止从远程登录数据库,还把测试数据库删掉了,最后重载数据引擎以使新特性生效。

优化了数据库引擎的安全属性之后,还需要创建新的数据库,后边的 blog 网站服务需要用它存储数据,数据库引擎可以管理多个数据库。操作新数据库也需要单独的用户,方便权限管理。

登录数据库管理系统:

mysql -u root -p

创建数据库需要使用 SQL 语言执行:

MariaDB [(none)]> CREATE DATABASE ghostdb;
MariaDB [(none)]> CREATE USER 'ghostuser'@'localhost' IDENTIFIED BY 'password';
MariaDB [(none)]> GRANT ALL ON ghostdb.* TO 'ghostuser'@'localhost';

创建了新数据库 ghostdb,然后又创建数据库管理系统新用户 ghostuser,并且限制用户 ghostuser 只能通过本地登录,用户密码设置为 password。数据库 ghostdb 内所有内容都被授权给通过本地登录的用户 ghostuser。

设置完毕,刷新特性,然后退出数据库管理系统:

MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> EXIT;

Ghost

最终目标是启动 Ghost 服务并在后台驻留运行。

Ghost 官方文档建议通过 Ghost Cli 安装管理 Ghost 服务,所以先安装 Ghost Cli。Ghost 基于 node 运行,所以通过 npm 包管理器就可以快速安装 Ghost Cli,我这里安装最新版的 Ghost Cli:

npm install -g ghost-cli@latest

同样为了方便管理对 Ghost 的权限,需要创建一个专门的系统用户,既要让它权限比较低,又要在必要时能动用 sudo 指令获得超级用户的权限:

adduser user1
adduser user1 sudo
adduser user1 www-data

把 user1 用户添加到用户组 sudo 和 www-data。

运行 Web 服务器进程时,使用一个特定的低权限用户(如 www-data)有助于提高系统的安全性。以防 Web 服务器被攻击者利用,就算被攻击者控制,该用户的权限也受到限制,从而降低攻击对系统的潜在威胁。

盖房子之前要先选好地皮,接着,创建网站工作目录了:

su - user1
sudo mkdir /var/www/ghost
sudo chown -R www-data:www-data /var/www/ghost
sudo chown -R www-data:www-data /var/www/
sudo chmod 775 /var/www/ghost
sudo setfacl -R -m u:user1:rwx /var/www/ghost/

依据前面的权限管理,网站工作目录创建完毕仍然需要匹配存取权限。

终于轮到施工队入场了,开始动工:

cd /var/www/ghost
ghost install

Ghost 安装流程开始后,同步需要管理人员输入配置信息,所有需要的信息在上面的内容中都有准备:

? Enter your blog URL: https://englyf.com
? Enter your MySQL hostname: localhost
? Enter your MySQL username: ghostuser
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghostdb
? Configuring Ghost
? Setting up instance
+ sudo useradd --system --user-group ghost
+ sudo chown -R ghost:ghost /var/www/ghost/content
? Setting up "ghost" system user
? Setting up "ghost" mysql user [skipped]
? Do you wish to set up Nginx? Yes
+ sudo mv /tmp/englyf-com/englyf.com.conf /etc/nginx/sites-available/englyf.com.conf
+ sudo ln -sf /etc/nginx/sites-available/englyf.com.conf /etc/nginx/sites-enabled/englyf.com.conf
+ sudo nginx -s reload
? Setting up SSL [skipped]
? Do you wish to set up Systemd? Yes
+ sudo mv /tmp/englyf-com/ghost_englyf-com.service /lib/systemd/system/ghost_englyf-com.service
+ sudo systemctl daemon-reload
? Setting up Systemd
+ sudo systemctl is-active ghost_englyf-com
? Do you want to start Ghost? (Y/n) Yes

这里边的设置 SSL 暂时跳过,后边会专门使用其它手段安装相关证书。

到这里 Ghost 网站服务程序已经启动并上线,但是还缺乏 SSL 证书,由于服务 URL 被配置为 HTTPS 类型,所以访问 URL 仍然会失败。

SSL 证书

SSL 证书(Secure Sockets Layer,现在通常指的是 TLS,Transport Layer Security),说白了就是帮助用户安全访问网站内容,比如提供端到端的数据加密。

当你的浏览器与服务器建立连接时,SSL 证书会启用加密协议,确保数据在传输过程中是经过加密的。就算黑客截获了你的数据,他也无法读取,甚至篡改你的内容。

SSL 证书还提供了一种身份验证机制,保证你访问的服务器站点是经过第三方机构确认过的目标服务器。

证书由受信任的第三方证书颁发机构(CA,Certificate Authority)签署,这些 CA 对服务器的身份进行了标记,所以访问带有 SSL 标记的站点是可信的。

另外,各大搜索引擎,比如 google 对有 SSL 证书的站点页面是优先索引和推荐的,要想自己的站点内容被容易搜索到,还是要上 SSL 证书。

Ghost 博客不安装 SSL 证书仍然可以访问,但为了提高安全性、用户信任度和搜索引擎排名,建议安装 SSL 证书。

那么如何获取安装证书?需要费用吗?

获取 SSL 证书需要支付费用也可以免费。

Let's Encrypt 是一个非营利性的证书颁发机构,提供免费的 SSL/TLS 证书,需要 90 天就续一次。

使用 Certbot 可以轻松地获取和管理 Let's Encrypt 提供的 SSL 证书。安装 SSL 证书后,确保配置 Nginx 将接收到的 HTTP 请求重定向 到 HTTPS,以确保所有流量都使用加密通道传输。

sudo apt-get install certbot python3-certbot-nginx -y
sudo certbot --nginx -d englyf.com

安装 certbot 完成后,输入站点域名 englyf.com 并启动配置,然后配置程序执行过程中需要确认几个选项和输入 email 地址:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): bajielyf@gmail.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for englyf.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/englyf.com.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/englyf.com.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://englyf.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=englyf.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/englyf.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/englyf.com/privkey.pem
Your cert will expire on 2024-12-05. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

第一个问题,向证书机构提供联系方式,输入 email 地址即可;第二个问题,是否同意服务条款,不同意是无法继续执行的;第三个问题,是否愿意和机构的合作伙伴共享联系方式,是否都没什么问题;第四个问题,是否需要配置 nginx 将接收到的 HTTP 请求重定向 到 HTTPS,建议配置重定向。

好了,站点 https://englyf.com 终于可以正常访问了,在浏览器里输入 englyf.com 就可以进入博客:

如果需要查看服务器中有多少站点在运行中,可以:

ghost ls

ghost 指令用于管理和维护 Ghost 博客网站,基本是限制由非 root 用户执行,是为了防止高级别用户破坏了站点数据。所以执行 ghost 指令前,应该切换到上面特意添加的系统用户 user1。

从这里也可以看出 ghost 网站是以 ghost_englyf-com 服务的形式在后台运行。

网站后台

作为网站的管理人,总要登录网站的后台管理界面吧?写博客也是要有个输入页面的,就类似其它技术博客网那样。

在域名后边添加 /ghost 就行。

englyf.com/ghost

登录后台时需要注册管理员账号,只允许注册一个管理员,其它人进入无法再次注册。

不太喜欢的地方是这博客网站没有现成的翻译文案,都是需要自己动手翻译的,可能是因为它有比较灵活主题方案吧?

看起来,它的免费主题都很有风格,还没决定使用哪一个,或许各位看官有什么建议?