让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

lxf2023-03-13 17:44:01

部署系统: CentOS 7

首先讲讲写这篇文章的契机是啥。由于某些不可抗力因素(具体是啥,下面会细说),我个人搭建的博客网站无法继续待在原来的服务器上了。需要给它挪窝,这意味着需要在一台全新的服务上重新搭一套环境。因此,索性记录下来分享给刚好有这方面需求的人。

文章首图就是我的个人博客首页截图,目前只有大体的框架,网站内容正在一步步的完善中。网站整体框架也开源了,GitHub地址:github.com/TangSY/hxkj

一、为什么要迁移

“旧服务器用的好好的折腾啥呀,重新搞一套环境这不是纯粹浪费时间吗,咋就这么想不开呢”

不着急回复,先来点小图:

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

从上图可以看出,目前云服务器厂商的服务器价格还是挺贵的,如果没有优惠,一台最低配置1C1G1M 的一年的价格在 680 元左右,而我目前使用的这台机子的续费价格,一年更是达到了4K+,这价格我得在工地上搬一年的砖才能支付得起了。

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

记得在我 18 年新购的时候,三年一共才 1449 元。对比现在一年 4K 的续费价格,只能说:黑心,真**黑心。这套路太NB了,让你低价入坑,然后掏钱高价续费。

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

所以,知道为什么要迁移了吧。无它,唯贫穷尔

我猜,可能有人会提个小小的建议:“服务器迁移很简单啊,只需要在旧服务器控制台执行制作镜像,然后新服务器安装系统的时候选择这个旧镜像就好了,连各种服务的状态都保持一致,极致的丝滑”。

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

作为一名程序员可不能这么偷懒,我顺带问了一下 chatGPT

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

来,划重点 不断学习和提高的意识。这不就是一次很好的学习机会吗,让我们一起来卷死运维,嘿嘿。

好了,不装了,摊牌了。最主要的原因是我上个服务器的配置是 2核8G内存平均使用量达到了 6G 左右。

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

我后来在某一次云服务商的促销活动中花 440 元买的轻量应用服务的配置只有 2核4G,内存直接缩水了一半,如果直接迁移过来,直接就撑爆了,搞得我不得不对原来的组件进行取舍、优化,然后重新安装,顺带熟悉熟悉 Liunx 系统。

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

二、开始迁移

1、Nginx VS Caddy

众所周知,Web 服务器是 Web 开发中不可或缺的基础组件。开源 Web 服务器有久负盛名且性能强劲的 Nginx,也有采用 Go 编写的后起之秀 Caddy。在这个 HTTPS 必选的时代,Caddy 凭借无需额外配置自动 HTTPS,分分钟完成 HTTPS 站点搭建,使它成为了中小型 Web 服务的首选服务器。Caddy 深受开源爱好者们的喜爱,2014 年开源至今在 GitHub 共收获了 4.5 万个 star。听起来非常具有诱惑力。

但...是,我最终还是选用了 Nginx。理由有以下两点:

  1. 我上个服务器采用的是 Nginx,并且服务器上配置的站点有一丢丢多,不想再去折腾这些配置信息了,索性继续使用 Nginx
  2. Nginx 的性能比 Caddy 强劲,对我这个丐版配置的服务器来说比较友好。

安装 Nginx

一条命令解决。在 CentOS 系统用 yum 安装软件就跟在前端项目中用 NPM 安装依赖一样丝滑。

yum install -y nginx

如果执行上面的命令安装失败了,大概率是没有添加 Nginx yum 资源库,执行以下命令添加上资源库,再执行安装命令就成功了!

rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装完成之后,配置文件的路径为:/etc/nginx/nginx.conf,默认网站根目录为:/usr/share/nginx/html

Nginx 操作常用命令:

  • vim /etc/nginx/nginx.conf,修改配置文件
  • nginx -s relaod,改完配置文件之后重载,让新配置生效
  • service nginx start,启动 Nginx 服务
  • service nginx stop,停止 Nginx 服务
  • service nginx restart,重启 Nginx 服务

2、ZeroSSL VS Let's Encrypt

这两玩意是干啥的?借用一下前面提到的一句话 “这个 HTTPS 必选的时代”。没错,它们就是给网站域名提供 HTTPS 证书服务的。最重要的是,都是免费的,白嫖嘛,谁不爱。啥?你说你没有域名?

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

部署博客网站没有域名,总不能让别人用 IP 地址访问吧,手上没有的话,建议停止往下阅读,立即去申请一个。便宜的 7-8 块钱/个/年,比一杯奶茶还便宜。该省省该花花,赶紧行动起来!

相信现在每个人的手上都持有一枚域名啦,咱们继续。

接下来咱们来看看这两货的异、同点:

  • 都支持配置多个域名和泛域名
  • 证书的有效期都只有 90
  • Zerossl 最多可配置域名的个数不受限制。然而,在使用 Let's Encrypt 申请证书的过程中,如果多次申请,会提示受到限制

因此,这边采用了 ZeroSSL

Tips: 以下所有涉及到示例邮箱(t@tsy6.com)、示例域名(hxkj.vip)的地方均需替换成申请者自己的邮箱及域名

2.1、安装 acme.sh

安装过程需要服务器已安装 socat 模块,它是一个多功能的网络小工具。

yum install socat -y

通过下面命令安装 acme.sh ,Email 用来接收重要重要通知。如:证书快到期未更新会收到通知。

curl https://get.acme.sh | sh -s email=t@tsy6.com

执行命令后几秒就安装好了,如果半天没有反应请 Ctrl+C 后重新执行命令。acme.sh 安装在 ~/.acme.sh 目录下,并自动创建了一个 cronjob,每天 0:00 点自动检测所有的证书,如果快过期了, 则会自动更新。

安装后,理论上会自动添加一个 acme.sh 全局应用别名,但有时候会 command not found,需要手动执行以下命令:source ~/.bashrc 或 source ~/.bash_profile,或关掉终端重新打开,然后再继续下一步。

2.2、生成证书

acme.sh 实现了 acme 协议支持的所有验证协议,一般有三种验证方式HTTP 方式、手动 DNS 方式和 DNS API 方式。这里主要推荐使用 DNS API 方式,因为他支持泛域名以及域名到期自动更新,可以更极致的解放我们的双手。

自动 DNS 验证方式需要使用域名解析服务商的 DNS API,像腾讯云和阿里云都提供 DNS API 功能。下面以阿里云为例:

首先,进入“AccessKey 管理”,创建密钥:

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

进入之后会提示创建子用户,那咱们根据提示创建一个

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

添加用户

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

给用户授权,这里只授予云解析权限就可以了

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

创建成功之后,可以拿到密钥信息啦

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

获取密钥后,使用如下命令把它们的 IdSecret 放到环境变量中:

export Ali_Key="YourAccessKeyId"
export Ali_Secret="YourAccessKeySecret"

再通过下面命令生成证书:

acme.sh --issue --dns dns_ali -d hxkj.vip -d *.hxkj.vip

一切顺利的话,你会在终端看到以下输出,代表证书已经生成了。

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

你可以在 ~/.acme.sh/example.com/ 目录中找到,我们主要需要用到这两个文件:fullchain.cer 和 hxkj.vip.key

如果出现下图中的错误,说明你的域名没有解析到这台服务器。可以按这篇文章操作:域名解析

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

更详细的 API 用法,可以查阅: github.com/acmesh-offi…

2.3、配置证书

接下来,咱们给前面步骤中安装好的 Nginx 配置一下证书。

首先使用下面命令生成一个名为 dhparam.pem 的文件。OpenSSLdhparam 用于生成和管理 dh 文件。dh(Diffie-Hellman) 是著名的密钥交换协议,它可以保证通信双方安全地交换密钥。

openssl dhparam -out /etc/nginx/dhparam.pem 2048

然后进入 /etc/ginx/ 目录,创建一个为名 ssl-options.conf 的 SSL 通用配置文件。

cd /etc/ginx/
vi ssl-options.conf

配置文件内容参考如下:

ssl_certificate   "/etc/nginx/cert/hxkj.vip/fullchain.cer";
ssl_certificate_key  "/etc/nginx/cert/hxkj.vip/hxkj.vip.key";
ssl_session_cache 	shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols  SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam  /etc/nginx/dhparam.pem
ssl_prefer_server_ciphers   off;
ssl_ciphers  ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

接着为网站的证书创建一个存放目录:

mkdir -p /etc/nginx/cert/hxkj.vip

目录中的文件不能手动复制过来,我们后面会通过 acme 脚本复制进来,这里先不管。

接下来打开对应的 Nginx 站点配置文件。

vi /etc/nginx/nginx.conf

参考编辑其内容如下:


server {
    listen       80;
    server_name  hxkj.vip www.hxkj.vip;
    rewrite ^(.*)$ https://$host$1 permanent;
}

server {
    listen       443;
    server_name  hxkj.vip www.hxkj.vip;
    ssl on;

    ssl_certificate     /etc/nginx/cert/hxkj.vip/fullchain.cer;
    ssl_certificate_key /etc/nginx/cert/hxkj.vip/hxkj.vip.key;
    include             /etc/nginx/ssl-options.conf;	

    location = /index.html {
       add_header Cache-Control "no-cache, no-store";
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

2.4、安装和自动更新证书

经过简单的配置之后,进入到了安装环节。前面提到不要直接复制证书到目标目录,正确的方式是使用 -install-cert 命令安装。在命令中指定目标位置,证书文件会被复制到相应的位置。并且,可以指定 reloadcmd 命令,当证书更新以后,reloadcmd 命令会被自动调用,让新的配置生效。

执行如下安装命令完成证书安装:(这是一整条命令,别分行复制)

acme.sh --install-cert -d hxkj.vip -d *.hxkj.vip \
--key-file       /etc/nginx/cert/hxkj.vip/hxkj.vip.key \
--fullchain-file /etc/nginx/cert/hxkj.vip/fullchain.cer \
--reloadcmd      "systemctl force-reload nginx"

这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后, 被再次自动调用。证书在到期之前会自动更新,你无需任何操作。爽否?

2.5、更新 acme.sh

目前由于 acme 协议和 ZeroSSL CA 都在频繁的更新, 因此 acme.sh 也需经常更新以保持同步。执行以下命令开启自动升级

acme.sh --upgrade --auto-upgrade

到此,整个 HTTPS 协议配置过程就结束了。但是,细心的同学估计会有这样一个疑问,“你刚刚不是说采用 ZeroSSL 的方式来生成证书吗,怎么整个安装过程,连 ZeroSSL 的半个影子都没看到”。问得好!这是因为 acme.sh 从 2021年8月1号 开始,默认的 CA 就是 ZeroSSL

让咱们前端也能轻松搭建属于自己的博客网站!搞定域名 + HTTPS

怎么样,是不是很简单,赶紧试试吧。

今天先把基础的环境给搭起来了,后面再迁移提效工具,例如:DockerOneDev。感兴趣的同学可以蹲一波后续。

三、结语

作者:HashTang

个人空间:hxkj.vip

别忘了点赞、关注支持一下哦~

欢迎评论区提问交流。