从零开始启动、配置、保护你的云服务器并搭建一个简单的网站

本文涉及的产品
.cn 域名,1个 12个月
简介: 本文详细介绍了如何准备原料、搭建基础环境、进行安全防护、建设网站、管理证书以及开启BBR优化网络性能。主要内容包括获取健康云服务器、配置SSH登录、创建非root用户、启用密钥认证、安装Nginx、申请TLS证书、配置HTTPS自动跳转及优化网络性能等步骤。通过本文,读者可以掌握从零开始搭建个人网站的全过程。

1 原料准备

这一章比较特殊,因为涉及到金钱交易行为,本文基于中立立场,不做具体的推荐。我能做的,是告诉你需要准备哪些东西。

1.1 获取一台云服务器

你需要获取一台健康的、IP 没有被墙的云服务器,并在管理后台做下面这些基础准备:

  1. 在云服务器的后台安装 Debian 的最新稳定版(本文以 Debian 10 为例)
  2. 小本本记下云服务器的 IP 地址(本文会用 "100.200.300.400" 来表示)

    这是一个故意写错的非法 IP,请替换成你的真实 IP

  3. 小本本记下云服务器的 SSH 远程登陆端口(Port)
  4. 小本本记下 SSH 远程登录的用户名和密码

购买云服务器是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。

关于选择 Debian 10 作为操作系统,这里稍微多说一句:不管你在网上听说了什么,不管哪个大神告诉你 XXX 版的 Linux 更好、XXX 版的 Linux 更牛,这些 Linux 的派系之争跟现在的你半毛钱关系也没有!使用 Debian 10 足以让你的云服务器服务器在安全、稳健运行的同时得到足够的优化(如 cloud 专用内核、及时的 bbr 支持等)。等你对 Linux 熟悉之后,再回头去尝试其他的 Linux 发行版也不迟。

1.2 获取一个心仪的域名

你需要获取一个域名、并在 DNS 设置中添加一条 A 记录,指向你云服务器的 IP 地址

  1. 请选择靠谱的域名服务商。
  2. 在 DNS 设置中,添加一条指向你云服务器的 IP 地址的 A 记录(A 记录的名字可以随便起,本文会用 "www" 来表示。完整的域名则会用 "www.example.com" 或者 "www.example.com" 来表示)。效果如下图:

添加A记录

不是一个真实可用的网址,请替换成你的真实网址

1.3 你本地电脑上需要安装的软件

  1. SSH 远程登录工具

    • Windows: PuTTY
    • macOS/Linux: Terminal
  2. 远程文件拷贝工具

    • Windows: WinSCP
    • macOS/Linux: Terminal
  3. 靠谱的文本编辑器

2 远程登录

2.1 远程登录云服务器(PuTTY)

首先,鉴于零基础人群中 Windows 的用户基数最大,所以本文以 Windows 为例进行展示。

其次,虽然 Windows 10 之后的 PowerShell 和 WSL 也可以达到很好的 SSH 操作体验。但是因为并非所有版本的 Windows 都有最新的组件,故本文还是以老牌的 PuTTY 为例,进行 SSH 远程登录的操作详解。(使用其他工具的话、在 SSH 登陆之后的操作都是一样的)

下面就跟我一步步操作吧。

  1. 进入 PuTTY 的官网,选择适合你操作系统的版本下载。(本文以 64 位版本为例)

    下载PuTTY

  2. 安装运行后,将会看到 PuTTY 的主界面。现在请拿出你上一章记东西的小本本,在下图的对应位置填入你云服务器的 IP 地址(云服务器 IP)端口(云服务器 PORT) 。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions),未来使用时只要按 Load 即可一键载入设置。

    设置PuTTY

  3. 我建议将 Connection 中的 keepalive 设置为 60 秒,防止你一段时间没有操作之后 SSH 自动断线。另外务必再次保存设置。

    防止频繁断线

    对 PuTTY 的任何设置更新都要再次手动保存 Session,不然关闭后就会丢失

  4. 点击 Open 就会进入 SSH 连接窗口,对应下图输入用户名与密码,与你的云服务器远程主机建立连接。(本文假设默认用户名是 root,另外,在 Linux 系统输入密码的时候,是不会出现 ****** 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!)

    SSH远程登录

2.2 成功登录 SSH!初识命令行界面

  1. 如果你的信息都填写正确,你将会看到类似下图的界面,说明已登录成功:

    初次登录云服务器

    这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【命令行界面】- Command Line Interface,或者缩写为 CLI

    接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,你说一句,它做一句

  2. 现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 4.19.37-5)、上次登录时间及 IP 等。当然根据云服务器的不同,你看到的界面可能会略有不同。

  3. 请注意命令行最下面一行,闪动的光标左边,有一串字符。图中显示的是root@vps-server:~#,这一串要怎么理解呢?很简单:

    • 现在的用户是 root
    • root 所在的服务器是 vps-server
    • root 现在所在的文件夹是 ~
    • # 之后是你可以输入命令的地方

    前两个很直观,无需多说。第三个是关于 Linux 的文件夹系统,现在也不需要过于深入,你只需要知道,"~"就是【当前用户的大本营】。第四个,提示符#,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "#" 或者 "$" 开头,提示你后面是你输入命令的地方。(所以你复制命令的时候,只需要复制后面的内容,不要复制提示符)

2.3 第一次更新 Linux 的软件

  1. 正如你的手机,无论安卓还是 iPhone,为了 APP 及时更新(获取安全补丁和新功能),都会时不时从应用商店获得更新信息,并且提示你有多少个 APP 可更新。Linux 系统也有逻辑十分类似的更新机制。所以只要你会更新手机 APP,就能学会更新 Linux 软件!

  2. Linux 下,每个 APP 都叫做一个“包” (package)。管理 APP 的程序自然就叫做“包管理器”(Package Manager)。你可以通过它安装、更新、卸载各种软件、甚至更新 Linux 系统本身。Linux 下的包管理器非常强大,此处按下不表,现在你只需要知道 Debian 系统的包管理器叫做 apt 即可。接下来,我们就先使用 apt 做一次软件的全面更新,让你熟悉它的基本操作。

  3. 小小白白 Linux 基础命令:

    | 编号 | 命令名称 | 命令说明 |
    | :------: | :-----------: | :----------: |
    | cmd-01 | apt update | 查询软件更新 |
    | cmd-02 | apt upgrade | 执行软件更新 |

  4. 现在请输入第一条命令,获取更新信息

    apt update
    
  5. 然后请输入第二条命令,并在询问是否继续安装 (Y/n) 时输入 y 并回车确认,开始安装

    apt upgrade
    
  6. 完整流程演示如下:

    初次软件更新流程演示

3 安全防护

3.1 为什么要做安全防护

Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在 Linux 的基石之上,这背后牵涉到巨大的经济利益和商业价值,当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力,这才让大家能享受到基本稳定的现代化数字生活。

现在,你拥有了一台云服务器,并且将会敞开他的数据访问渠道来达到流量转发的目标,那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时,新人由于知识和信息的不足,看待安全问题是总是难免两极分化:要么觉得轻如鸿毛和自己没有半点关系,要么觉得重于泰山甚至惶惶不可终日。

  • 对于前者,我的建议是:安全无小事,尽量多查一些安全方面的信息,免得自己真的受了损失才后悔莫及

  • 对于后者,我的建议是:不用紧张,我们的服务器仍不具有太高的价值、一般不会吸引到高水平的攻击,需要面对的基本都是一些自动化脚本的恶意扫描和登录尝试,跟着本文做一些基础的防护即可

3.2 具体的风险到底是什么

就像我们在《远程登录篇》配置的一样,任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的云服务器服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:

  1. 【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏

  2. 【端口】:如果使用默认端口,那么【端口 = 22

  3. 【用户名】:如果使用默认用户,那么【用户名 = root

  4. 【密码】:密码不存在默认值,一定是由云服务器后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:

    • 如果你用了云服务器管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全

    • 如果你为了好记、把密码改成了类似123456这种超弱的密码,破解你的云服务器服务器可谓不费吹灰之力

    • 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说密码表,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)

  5. 但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。

    一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 root 控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意云服务器的登录记录、进程变化、CPU 占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的云服务器服务商封禁你的账号、或者收到律师函为止。

  6. 别忘了,你获得云服务器时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,一旦这些坏事发生,它们就不可避免的与你产生了关联。

3.3 我们要做的安全防护有哪些

基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险:

  1. 【端口】:将 SSH 远程登录端口修改为【非 22 端口】 (4.4)
  2. 【用户名】:建立【非 root】的新用户、并禁用 root 用户 SSH 远程登录 (4.5、4.6)
  3. 【密码】:SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录 (4.7)

记得按顺序来,别把自己锁在门外了。

3.4 将 SSH 远程登录端口修改为非 22 端口

现在,我们来解决【端口 = 22】的问题。(注意:有些云服务器服务商,默认的端口已经是非 22 端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)

  1. 小小白白 Linux 基础命令:

    | 编号 | 命令名称 | 命令说明 |
    | :------: | :-----------------: | :----------: |
    | cmd-03 | nano | 文本编辑器 |
    | cmd-04 | systemctl restart | 重启某个服务 |

  2. 小小白白 Linux 基础配置文件

    | 编号 | 配置文件位置 | 文件说明 |
    | :-------: | :--------------------: | :------------------: |
    | conf-01 | /etc/ssh/sshd_config | SSH 远程登录程序设置 |

  3. 我们要做的第一件事,当然就是【用nano这个文本编辑器打开SSH远程登录程序设置】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:

    nano /etc/ssh/sshd_config
    
  4. 文件打开后,你就进入了nano的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢?

    nano的界面

  5. 我们要做的第二件事,是【在打开的文件中找到Port这一项,并修改它的端口】。Port 后面的数字就是 SSH 的端口,一般建议把它改成一个大于1024小于65535的整数(本文以9753为例)。请结合nano的快捷键,想一下该怎么操作呢?果然,你又说对了!就是:

    • 使用 ctrl+w 进入搜索模式,然后输入 Port 22 并回车
    • 删除 22 并改成 9753
    • 说明:如果这一行开头有个#,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带#的,或者把#删掉就好。

    本文以9753为例,就意味着随着本文的发布,这个端口会变成一个不大不小的特征,也许会被攻击者优先尝试、也许被 GFW 干扰、阻断。所以我强烈建议你用一个自己想到的其他端口,毕竟,你有 6 万多个端口可以自由选择。

  6. 我们要做的第三件事,是【保存文件并退出】

    • 如果第 3 步你有仔细观察,就会发现保存并不是常见的 ctrl+s
    • 正确的快捷键:保存是 ctrl+o + 回车,退出是 ctrl+x

    • (部分操作系统) 新增一个防火墙规则,设置为新增的SSH端口, 否则实例重启后无法SSH登陆。

    • 如 Ubuntu 的 ufw
    sudo ufw allow 9753/tcp
    
  7. 我们最后要做的事,是【重启 ssh 服务,使变更生效】

    systemctl restart ssh
    

    然后可以尝试在ssh软件上打开新的会话尝试是否可以连上,如果出现问题可以通过旧的ssh会话修改配置(重启sshd时已经打开的ssh不会被关闭)

  8. 完整流程演示如下:

    修改非22端口演示

  9. 修改 PuTTY 配置

    现在新的端口已经生效,下次使用 PuTTY 登录时就要用9753了。所以现在请到 PuTTY 的设置中修改端口号码,然后保存 Session。嗯,你应该知道去哪里改了吧?(如果不知道的话,要重读前面的内容了哦!)

3.5 建立非 root 的新用户

第二步,我们来解决【用户名 = root】的问题。

首先你要理解, Linux 系统中的root,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦root账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:

  1. 小小白白 Linux 基础命令:

    | 编号 | 命令名称 | 命令说明 |
    | :------: | :-----------: | :--------------------------: |
    | cmd-05 | adduser | 给系统新增用户 |
    | cmd-06 | apt install | 安装某个软件 |
    | cmd-07 | visudo | 修改 sudo 权限设置专用编辑器 |

  2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以vpsadmin为例:

    adduser vpsadmin
    

    执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 ****** 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。

    建立新用户

    本文以vpsadmin为例,就意味着随着本文的发布,这个用户名也会变成一个不大不小的特征,也许会被攻击者优先尝试。所以和端口一样,我强烈建议你用一个自己想到的其他用户名。

  3. 完整流程演示如下:

    建立新用户

  4. 我们要做的第二件事,是【安装sudo功能】(sudo 就是在关键时刻,让普通账户临时获得 root 的神力,战力全开拯救世界)

    apt update && apt install sudo
    

    聪明的你大概已经发现,这一行命令其实是两个命令。前一半 apt update 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 apt install
    就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的sudo程序】。 && 则是把两个命令连起来执行的意思。

  5. 我们要做的第三件事,是【把vpsadmin用户加入sudo名单里,让他有资格借用root的神力】

    visudo
    

    User Privilege Specification 下加入一行 vpsadmin ALL=(ALL) NOPASSWD: ALL 即可。

    我要特别说明的是NOPASSWD这个设置,它的意思是vpsadmin用户临时使用root权限时,不用额外输入密码。这与一般的安全建议相反。我之所以如此推荐,是因为很多新人不顾危险坚持使用root账号就是因为用root时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用root用户的风险】大于【使用sudo
    时不用输密码的风险】,所以做了以上的建议。
    如果你希望遵守传统习惯、每次使用sudo时需要输入密码,那么这一行改成 vpsadmin ALL=(ALL:ALL) ALL 即可。

  6. 完整流程演示如下:

    建立新用户

3.6 禁用 root 用户 SSH 远程登录

  1. 现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用nano编辑器打开SSH远程登录程序设置】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:

    nano /etc/ssh/sshd_config
    
  2. 找到PermitRootLogin Yes这一项,然后把它后面的设定值改为no即可。还记得怎么操作吗?............ 正确答案:

    • 使用 ctrl+w 进入搜索模式,然后输入 PermitRootLogin 并回车
    • 删除 yes 并改成 no
  3. 保存文件并退出。还记得怎么操作吗?............ 正确答案:

    • 保存是 ctrl+o,然后 回车 确认
    • 退出是 ctrl+x
  4. 重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案:

    systemctl restart ssh
    
  5. 完整流程演示如下:

    禁用root用户SSH远程登录

  6. 下次通过 PuTTY 远程 SSH 登录的时候,root用户已无法连接,用户名就要换成vpsadmin了!方便起见,我们可以在 PuTTY 中把vpsadmin设置成默认登录用户名。(啰嗦君:别忘了保存 Session)

    PuTTY设置默认用户名

3.7 使用 RSA 密钥登录并禁用密码登录

第三步,我们来解决【密码】可能被撞破的问题。

前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助 1Password,或者 macOS 的 keychain 等密码管理工具),否则很容易中招。

超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。

所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到云服务器备用。每次登录时,SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)

本文以 RSA 密钥举例,是因为 RSA 密钥在各种设备、各种 SSH 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。
其他的常见密钥还有:

  • DSA - 已经从数学层面被证明不安全,所以永远不要用它
  • ECDSA - 密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的云服务器上有值得 NSA 关注的东西就不要用它
  • Ed25519 - 这是一个与 ECDSA 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门
    所以,如果你的设备和软件都支持的话,我建议优先选择 Ed25519 密钥。

那我们现在就来配置【密钥验证】吧!

  1. 运行PuTTYgen (PuTTY 密钥生成器)。位置是 开始菜单 --> 所有程序 --> PuTTY (64-bit) --> PuTTYgen

    1. 点击Generate开始生成(在界面空白处乱晃鼠标增加随机数)

      生成密钥

      本图中是以 2048 位的 RSA 密钥为例的。但实际上,如果要获得与 EDCSA/Ed25519256 位密钥相同的安全性,你需要使用 3072 位的 RSA 密钥。(即右下角的数字改成 3072

    2. 你可以给私钥设置密码,增加一层安全性

    3. 点击 Save public key 保存公钥,文件名为 id_rsa.pub
    4. 点击 Save private key 保存私钥,文件名为 id_rsa (PuTTY 私钥自带.ppk后缀)
    5. 最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 authorized_keys。(用 vscode 保存,默认会变成带txt后缀的文本文件,这没关系,之后上传云服务器时我们会把后缀名去掉)

      保存密钥

  2. 将公钥上传至云服务器的vpsadmin用户下

    1. 这一步就需要用到之前准备的WinSCP了。
    2. 官网下载并安装,会提示你导入 PuTTY 的设置,当然一键导入啦!

      一键导入Session

    3. 如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可

      WinSCP登录设置

    4. WinSCP 左边的目录就是本地电脑上的文件夹和文件,请定位到密钥所在的文件夹

    5. WinSCP 右边的目录则是云服务器服务器上的文件夹和文件,默认就在 /home/vpsadmin/ 文件夹,此时在请点击右下角 X hidden 来显示隐藏文件

      本地和远程文件夹

    6. 在右边(云服务器中)点击右键并新建文件夹,起名.ssh (注意有一个.

      在云服务器中建立放置公钥的文件夹

    7. 将【公钥】authorized_keys上传到.ssh文件夹内

      上传authorized_keys

    8. 在上传时,将【公钥】从 authorized_keys.txt 改名为 authorized_keys(去掉.txt这个后缀名)

      确保没有任何后缀

    9. 完整流程演示如下:

      WinSCP操作完整演示

  3. 在云服务器端设置 SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录

    1. 小小白白 Linux 基础命令:

      | 编号 | 命令名称 | 命令说明 |
      |:--:|:--:|:--:|
      | cmd-08 | sudo | 用root权限运行某个命令 |
      | cmd-09 | chmod | 修改目标文件/文件夹的权限 |

    2. SSH 远程连接到云服务器上(PuTTY)

    3. 修改 authorized_keys 文件权限为 600 (仅所有者可读可写)

      chmod 600 ~/.ssh/authorized_keys
      
    4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的root变成了普通用户vpsadmin,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用sudo命令了:

      sudo nano /etc/ssh/sshd_config
      
    5. 找到(ctrl+w) PasswordAuthentication 改成 no

    6. 找到(ctrl+w) PubkeyAuthentication 改成 yes,然后保存(ctrl+o)退出(ctrl+x)

    7. 重启 SSH 服务。(啰嗦君:别忘了现在需要使用sudo来获得权限)

      sudo systemctl restart ssh
      
    8. 完整流程如下:

      SSH开启密钥验证并禁用密码验证

  4. 云服务器端已经设置好了公钥,现在要给 PuTTY 指定私钥位置供登录时使用(啰嗦君:别忘了保存 Session)

    PuTTY指定私钥位置

  5. 至此,【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给 PuTTY 保存了默认的登录用户名和私钥。未来使用 PuTTY 登录时,载入VPS-SERVER配置后,点击Open就可以一键登录了。

    如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图:

    输入私钥密码

  6. 别忘了给WinSCP也做对应的密钥设置,否则之后想要传输文件时就无法登录了:

    WinSCP指定私钥位置

任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦

4 网站建设

4.1 登录云服务器、安装运行 Nginx

  1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。

    sudo apt update && sudo apt install nginx
    
  2. 完成后,Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 http://100.200.300.400:80,若看到下图的界面就说明 Nginx 已经正常在运行了。

    Nginx默认界面

  3. 如果无法看到上述Nginx默认页面,可能是需要配置Debian系统上默认的防火墙组件Uncomplicated Firewall (UFW),以便启用 HTTP (80) 和 HTTPS (443) 端口流量。

    a. 验证方法,输入:

    sudo ufw status
    

    b. 如果输出如下,表明80和433端口未开启,需要执行c步骤

    Status: active
    To                         Action      From
    --                         ------      ----
    22/tcp                     ALLOW       Anywhere
    22/tcp (v6)                ALLOW       Anywhere (v6)
    

    c. 启用UFW的Nginx 80 和 443 端口命令

    sudo ufw allow 'Nginx Full'
    

    d. 输入a中命令再次验证,如果输出如下,表示Nginx流量已经被防火墙放行,这样就应该可以看到前述第2点中的Nginx默认页面。

    Status: active
    To                         Action      From
    --                         ------      ----
    22/tcp                     ALLOW       Anywhere
    Nginx Full                 ALLOW       Anywhere
    22/tcp (v6)                ALLOW       Anywhere (v6)
    Nginx Full (v6)            ALLOW       Anywhere (v6)
    

4.2 创建一个最简单的网页

  1. 小小白白 Linux 基础命令:

    | 编号 | 命令名称 | 命令说明 |
    |:--:|:--:|:--:|
    | cmd-10 | mkdir | 新建文件夹 |
    | cmd-11 | systemctl reload | 重新加载某个服务 |

  2. 小小白白 Linux 基础配置文件:

    | 编号 | 配置文件位置 | 文件说明 |
    |:--:|:--:|:--:|
    | conf-02 | /etc/nginx/nginx.conf | Nginx 程序设置 |

  3. 创建一个网站专用的文件夹/home/vpsadmin/www/webpage/并建立网页文件index.html

    mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
    

    如果你用的不是 vpsadmin 这个用户名,请务必理解这条命令中 “~” 符号的意义(这关系到【第 5 步】你要写的内容):

    • 如果是 【非 root 用户】,“~” 就等价于 /home/用户名
    • 如果是 【 root 用户】,“~” 就等价于 /root
  4. 把下面的内容完整的复制进去,然后保存(ctrl+o)退出(ctrl+x)

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>My Personal Web Page</title>
       <style>
          body {
          
                font-family: Arial, sans-serif;
                margin: 0;
                padding: 0;
                background-color: #f4f4f4;
          }
          header {
          
                background-color: #333;
                color: #fff;
                padding: 10px 0;
                text-align: center;
          }
          main {
          
                padding: 20px;
          }
          footer {
          
                background-color: #333;
                color: #fff;
                text-align: center;
                padding: 10px 0;
                position: fixed;
                width: 100%;
                bottom: 0;
          }
       </style>
    </head>
    <body>
       <header>
          <h1>Welcome to My Personal Web Page</h1>
       </header>
       <main>
          <h2>About Me</h2>
          <p>Hello! My name is [Your Name]. I am passionate about [Your Interests]. This is a brief introduction about myself.</p>
    
          <h2>My Hobbies</h2>
          <ul>
                <li>Hobby 1</li>
                <li>Hobby 2</li>
                <li>Hobby 3</li>
          </ul>
    
          <h2>Contact Me</h2>
          <p>You can reach me at: <a href="mailto:your.email@example.com">your.email@example.com</a></p>
       </main>
       <footer>
          <p>© 2024 [Your Name]. All rights reserved.</p>
       </footer>
    </body>
    </html>
    

    赋予其他用户读取该文件的权限

    chmod -R a+r .
    
  5. 修改 nginx.conf 并重启 Nginx 服务,将80端口的 http 访问定位到刚才建立的 html 页面上

    1. 修改 nginx.conf

      sudo nano /etc/nginx/nginx.conf
      
    2. 将下面一段,添加在 http{} 内,然后保存(ctrl+o)退出(ctrl+x)。(记得将域名替换为之前准备好的、包含二级域名的真实域名)

              server {
             
                      listen 80;
                      server_name www.example.com;
                      root /home/vpsadmin/www/webpage;
                      index index.html;
              }
      

      如我在【第 3 步】中的提示所说,请务必确保 /home/vpsadmin/www/webpage 改成你的实际文件路径。

    3. nginx 重新载入配置使其生效

      sudo systemctl reload nginx
      
    4. 完整的设置流程如下:

      网页设置演示

    5. 此时如果你访问 http://www.example.com,你看到这样的页面则说明成功:

      http网页成功

4.3 常见错误的说明

首先,如果你一路按照文章的说明来操作,并且足够细心,那肯定不会出错。所以,我并不打算修改本文的写法。

那为什么依然有很多同学卡在了这一步,网页怎么也打不开呢?基本上就是两个字:粗心。因为这里配置可能出现的问题只有两种,原因也只有两个。

一、两种问题:

  • nginx.conf 里面的 /home/vpsadmin/www/webpage 这一条,与你的实际文件路径不符,nginx 找不到文件
  • 路径正确,但 nginx 无权读取

二、两个原因:

  • 使用了【非 root 用户】,但仍然直接拷贝文中的命令不加修改。(这基本就等于抄答案时把同学的名字一起抄过去了)
  • 坚持使用【 root 用户】

碰到错误的同学,就回过头仔细看一下【5.3】中【第 3 步】和【第 5-2 步】的说明吧。

本文前期已经用了大量篇幅说明了使用【非 root 用户】对安全的重要性,全文也是基于此而写。所以,因使用【 root 用户】而导致的问题并不在本文的设计范围里。
但我相信,坚持使用【 root 用户】的同学应该是有主见、动手能力强、或者有一定 Linux 基础的同学。问题的症结我已经全部说明了,我相信你一定可以自行解决。

5 证书管理

5.1 申请 TLS 证书

接下来我们要做的,是为我们的域名申请一个真实的 TLS 证书,使网站具备标准 TLS 加密的能力及 HTTPS 访问的能力。

请不要轻易使用自签证书。它并没有让操作简单太多,但增加了无谓的风险(如中间人攻击)。

这里我会使用一个叫做 acme.sh 的证书管理工具,它简单、轻量、高效,并可完成证书自动更新。

另外,我相信,现在你已经逐渐熟悉了 Linux 的基础操作,所以已经多次出现的命令从本章开始不再重复截图、只做简单的描述。如果实在想不起来怎么用的话,就稍微复习一下前面的章节吧。

5.2 安装 acme.sh

  1. 小小白白 Linux 基础命令:

    | 编号 | 命令名称 | 命令说明 |
    |:--:|:--:|:--:|
    | cmd-12 | wget | 访问(或下载)某个网页文件 |
    | cmd-13 | acme.sh | acme.sh 证书管理相关的命令 |

  2. 运行安装脚本

    wget -O -  https://get.acme.sh | sh
    
  3. acme.sh 命令生效

    . .bashrc
    
  4. 开启 acme.sh 的自动升级

    acme.sh --upgrade --auto-upgrade
    
  5. 到这一步的完整流程如下图:

    acme.sh安装演示

5.3 测试证书申请

在正式申请证书之前,我们先用测试命令(--issue --test)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多 5 次),导致后面的步骤无法进行。

  1. 测试证书申请的命令如下(本文均以 ECC 证书为例,因为时至今日,实在没什么理由不用它):

    acme.sh --issue --server letsencrypt --test -d www.example.com -w /home/vpsadmin/www/webpage --keylength ec-256
    

    ECC证书的主要优势在于它的 Keysize 更小,意味着同等大小下安全性的提升和加密解密速度的加快。如 ECC-256bit 的强度大约相当于 RSA-3072bit,何乐而不为呢?当然,有人说 ECC 证书握手会明显更快,这我觉得就有些夸张了,因为 RSA 握手也没有太慢,就算有差别应该也是毫秒级,很难直接感知。
    另外,如果有些网站确实需要兼容某些古老设备的,那也还是请按需选择RSA证书。

  2. 你最终应该看到类似这样的提示:

    [Wed 30 Dec 2022 04:25:12 AM EST] Using ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory
    [Wed 30 Dec 2022 04:25:13 AM EST] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
    [Wed 30 Dec 2022 04:25:13 AM EST] Create account key ok.
    [Wed 30 Dec 2022 04:25:13 AM EST] Registering account: https://acme-staging-v02.api.letsencrypt.org/directory
    [Wed 30 Dec 2022 04:25:13 AM EST] Registered
    [Wed 30 Dec 2022 04:25:13 AM EST] ACCOUNT_THUMBPRINT='CU6qmPKuRqhyTAIrF4swosR375194z_1ddUlWef8xDc'
    [Wed 30 Dec 2022 04:25:13 AM EST] Creating domain key
    [Wed 30 Dec 2022 04:25:13 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/www.example.com_ecc/www.example.com.key
    [Wed 30 Dec 2022 04:25:13 AM EST] Single domain='www.example.com'
    [Wed 30 Dec 2022 04:25:13 AM EST] Getting domain auth token for each domain
    [Wed 30 Dec 2022 04:25:14 AM EST] Getting webroot for domain='www.example.com'
    [Wed 30 Dec 2022 04:25:14 AM EST] Verifying: www.example.com
    [Wed 30 Dec 2022 04:25:23 AM EST] Pending
    [Wed 30 Dec 2022 04:25:25 AM EST] Success
    [Wed 30 Dec 2022 04:25:25 AM EST] Verify finished, start to sign.
    [Wed 30 Dec 2022 04:25:25 AM EST] Lets finalize the order.
    [Wed 30 Dec 2022 04:25:25 AM EST] Le_OrderFinalize='https://acme-staging-v02.api.letsencrypt.org/acme/finalize/490205995/7730242871'
    [Wed 30 Dec 2022 04:25:25 AM EST] Downloading cert.
    [Wed 30 Dec 2022 04:25:25 AM EST] Le_LinkCert='https://acme-staging-v02.api.letsencrypt.org/acme/cert/xujss5xt8i38waubafz2xujss5xt8i38waubz2'
    [Wed 30 Dec 2022 15:21:52 AM EST] Cert success.
    --BEGIN CERTIFICAT--
    sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
    cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
    wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
    2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
    SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
    wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
    tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
    0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
    1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
    0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
    7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
    IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
    TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
    iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
    tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
    haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
    0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
    YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
    FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
    G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
    Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
    NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
    x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
    yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPIjw9AKH=
    --END CERTIFICAT--
    [Wed 30 Dec 2022 15:21:52 AM EST] Your cert is in  /home/vpsadmin/.acme.sh/www.example.com_ecc/www.example.com.cer
    [Wed 30 Dec 2022 15:21:52 AM EST] Your cert key is in  /home/vpsadmin/.acme.sh/www.example.com_ecc/www.example.com.key
    [Wed 30 Dec 2022 15:21:52 AM EST] The intermediate CA cert is in  /home/vpsadmin/.acme.sh/www.example.com_ecc/ca.cer
    [Wed 30 Dec 2022 15:21:52 AM EST] And the full chain certs is there:  /home/vpsadmin/.acme.sh/www.example.com_ecc/fullchain.cer
    
  3. 注意:这里申请的是测试证书,没办法直接用的,只是用来证明你的域名、配置全都正确。仔细观察,你会发现给你发证书的域名是 https://acme-staging-v02.api.letsencrypt.org,这个 staging 你就理解成【测试服】吧!

  4. 如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。

    acme.sh --issue --server letsencrypt --test -d www.example.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
    

    嗯没错,就是在命令的最后加了一个 --debug 参数

  5. 这一步确定成功之后,就可以申请正式的证书了。(测试证书不需要删除,它会自动被正式证书覆盖)

5.4 正式证书申请

  1. 申请正式证书的命令如下(即删掉 --test 参数,并在最后加入 --force参数):

    acme.sh --set-default-ca --server letsencrypt
    acme.sh --issue -d www.example.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
    

    --force 参数的意思就是,在现有证书到期前,手动(强行)更新证书。上一步我们从“测试服”申请的证书虽然不能直接用,但是它本身是尚未过期的,所以需要用到这个参数。

  2. 你最终应该看到跟上面很像的提示:

    vpsadmin@vps-server:~$ acme.sh --issue -d www.example.com -w /home/vpsadmin/www/webpage --keylength ec-256
    [Wed 30 Dec 2022 15:22:51 AM EST] Using CA: https://acme-v02.api.letsencrypt.org/directory
    [Wed 30 Dec 2022 15:22:51 AM EST] Creating domain key
    [Wed 30 Dec 2022 15:22:51 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/www.example.com_ecc/www.example.com.key
    [Wed 30 Dec 2022 15:22:51 AM EST] Single domain='www.example.com'
    [Wed 30 Dec 2022 15:22:51 AM EST] Getting domain auth token for each domain
    [Wed 30 Dec 2022 15:22:51 AM EST] Getting webroot for domain='www.example.com'
    [Wed 30 Dec 2022 15:22:51 AM EST] Verifying: www.example.com
    [Wed 30 Dec 2022 15:22:51 AM EST] Pending
    [Wed 30 Dec 2022 15:22:51 AM EST] Success
    [Wed 30 Dec 2022 15:22:51 AM EST] Verify finished, start to sign.
    [Wed 30 Dec 2022 15:22:51 AM EST] Lets finalize the order.
    [Wed 30 Dec 2022 15:22:51 AM EST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/490205996/7730242872'
    [Wed 30 Dec 2022 15:22:51 AM EST] Downloading cert.
    [Wed 30 Dec 2022 15:22:51 AM EST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw'
    [Wed 30 Dec 2022 15:22:51 AM EST] Cert success.
    --BEGIN CERTIFICAT--
    sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
    cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
    wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
    2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
    SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
    wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
    tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
    0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
    1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
    0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
    7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
    IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
    TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
    iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
    tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
    haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
    0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
    YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
    FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
    G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
    Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
    NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
    x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
    yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM=
    --END CERTIFICAT--
    [Wed 30 Dec 2022 15:22:52 AM EST] Your cert is in  /home/vpsadmin/.acme.sh/www.example.com_ecc/www.example.com.cer
    [Wed 30 Dec 2022 15:22:52 AM EST] Your cert key is in  /home/vpsadmin/.acme.sh/www.example.com_ecc/www.example.com.key
    [Wed 30 Dec 2022 15:22:52 AM EST] The intermediate CA cert is in  /home/vpsadmin/.acme.sh/www.example.com_ecc/ca.cer
    [Wed 30 Dec 2022 15:22:52 AM EST] And the full chain certs is there:  /home/vpsadmin/.acme.sh/www.example.com_ecc/fullchain.cer
    
  3. 仔细观察,你会发现这次给你发证书的域名是 https://acme-v02.api.letsencrypt.org,少了 staging,自然就是【正式服】了!

5.5 证书安装

  1. 证书申请完成后,需要安装,安装到指定位置,并在配置文件中引用即可:

    vpsadmin@vps-server:~$ acme.sh --installcert -d www.example.com --cert-file /你要安装到的位置/cert.crt --key-file /你要安装到的位置/cert.key --fullchain-file /你要安装到的位置/fullchain.crt --ecc
    [Mon 14 Feb 2022 03:00:25 PM CST] Installing cert to: /etc/cert/cert.crt
    [Mon 14 Feb 2022 03:00:25 PM CST] Installing key to: /etc/cert/cert.key
    [Mon 14 Feb 2022 03:00:25 PM CST] Installing full chain to: /etc/cert/fullchain.crt
    
  2. 证书安装完成后,需要修改 Nginx 配置文件,将证书引入。

    sudo nano /etc/nginx/nginx.conf
    

    server{} 内添加如下内容:

    listen 443 ssl http2;
    ssl_certificate /etc/cert/fullchain.crt;
    ssl_certificate_key /etc/cert/cert.key;
    

    请注意,这里的 /etc/cert/ 是一个示例路径,你可以根据自己的实际情况修改。

  3. nginx 重新载入配置使其生效

     sudo systemctl reload nginx
    
  4. 此时如果你访问 https://www.example.com,你看到正常的网页,且浏览器地址栏有小锁头,那么证书安装成功。

5.6 证书自动更新

  1. 证书的有效期是 90 天,所以我们需要设置证书自动更新。

    acme.sh --upgrade --auto-upgrade
    
  2. 你可以通过下面的命令来手动更新证书:

     acme.sh --renew -d www.example.com --force
    

    --force 参数的意思就是,在现有证书到期前,手动(强行)更新证书。上一步我们从“测试服”申请的证书虽然不能直接用,但是它本身是尚未过期的,所以需要用到这个参数。

  3. 你可以通过下面的命令来查看证书的有效期:

    acme.sh --list
    

    你可以看到证书的有效期,以及证书的存放位置。

5.7 开启 HTTP 自动跳转 HTTPS

  1. 为了保证网站的安全性,我们需要将 HTTP 请求自动跳转到 HTTPS。

    sudo nano /etc/nginx/nginx.conf
    
  2. http{} 内添加如下内容:

    server {
        listen 80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
    }
    
     server {
          listen 443 ssl http2;
          ssl_certificate /etc/cert/fullchain.crt;
          ssl_certificate_key /etc/cert/cert.key;
     }
    
  3. nginx 重新载入配置使其生效

    sudo systemctl reload nginx
    
  4. 此时如果你访问 http://www.example.com,你会被自动跳转到 https://www.example.com

6 开启 BBR

  1. 传说中的BBR

    我相信,你肯定不止一次的听过bbr这个东西,在各种博客添油加醋之下,让人觉得它神乎其神。更有bbrplus, bbr2, 魔改bbr 等一大堆衍生品。仿佛神油一般,用了就能野鸡线路变专线。

    那么,这东西究竟是什么?它有没有用?又该用哪一个版本呢?

  2. 实际的BBR

    BBR = Bottleneck Bandwidth and Round-trip propagation time,是一种 TCP 的拥塞控制算法。简单粗暴的理解就是数据流量的交通管理
    :当公路不再塞车的时候,每辆车自然就能保持较快的车速了。

    那么它有没有用呢?一般而言,有BBR没有BBR 会有可以感知的差别(速度、稳定性、延迟方面都会有一些改善),所以 【非常建议开启 BBR

    但开启之后,BBR4.x5.x 之间的差异往往比较微妙、见仁见智,造成体验差别的决定性因素仍然是线路质量。所以 【不必纠结版本、不必盲目追新、跟随你的发行版更新内核即可】

  3. bbrplus, bbr2, 魔改bbr 和其他各种听起来就酷炫的版本是不是更好?

    一句话:不是!不要用这些!这些都为了吸引眼球乱起的名字!

    BBR 的更新和发布,都是跟随 Linux 的内核(Kernel)进行的。换言之,只要你用的是比较新的内核,就自然会使用到新版BBR

    而这些名字看起来很酷炫的东西,说白了就是仍未正式发布的、尚在测试阶段的内核及其对应的BBR版本。这些脚本也仅仅就是通过下载预览版的内核(甚至第三方魔改内核)来率先开启而已。

    内核的稳定是一台服务器稳定运行的基石。【BBR 测试版带来的细微性能差异绝对不值得更换不稳定的内核。】 请选择你所在的 Linux 发行版所支持的最新内核,这样可以最大限度的保持服务器的长期稳定和兼容。

    所谓魔改bbr的【领先】是有非常强的时效性的。比如很多 bbrplus 脚本,因为几年来都没有更新,到现在还会把你的内核换成 4.19,要知道现在稳定如 Debian 已经是 5.9 的时代了,那么这个脚本放在 2018 年 1 月也许领先了一点,到 2018 年 10 月 4.19 正发布时就已经失去了意义,放在现在甚至可以说是完完全全的【降级】和【劣化】

  4. fq, fq_codel, fq_pie, cake和其他算法哪个好?

    一句话:看不懂的话,请保持fq,足够、且不会劣化你的线路

  5. 锐速、Finalspeed、LotServer 和其他“加速工具”

    一句话:不要用这些!把他们丢进历史的垃圾桶吧!

    它能解决的也只有丢包率的问题。不太准确的比喻,就是本来你用一辆车送你的货,有时候车半路就坏了(丢包),用了这些以后,你直接派出 3
    份一样的货,让三辆车同时送,只要有一辆没坏就能送到。马路上都是你的车,自然就能把别人挤下去。但可想而知,你挤别人的时候,别人也会来挤你,而整个机房的出口道路一共就那么宽,最终势必就变成集体大堵车了。

    它们的原理不是算法优化、不是提速、大多数是简单粗暴的多倍发包。对于【丢包率非常高】的差线路可能有一点作用,但【对丢包率低的好线路没有任何优化作用,反而会成倍的消耗你的流量】,进而造成服务器和你的邻居不必要的压力。
    如果你的线路真的丢包率奇高,真正靠谱的解决方案是【换线路】。

  6. 啰嗦了这么多,就是因为围绕 BBR 忽悠小白的错误概念和坑人脚本实在是太多了。我希望你们现在对 BBR 有了相对清晰的理解。接下来,我们就动手安装最新的 Debian 内核并开启BBR 吧!(真的很简单)

    1. 给 Debian 10 添加官方 backports 源,获取更新的软件库

      sudo nano /etc/apt/sources.list
      

      本文以 Debian 10 为例,所以使用 /etc/apt/sources.list 仍无问题,但如果你并不是根据本文从头开始,或者使用了其他 Linux发行版,那么建议你建立 /etc/apt/sources.list.d/ 文件夹,并在这个文件夹内建立自己的配置文件,形如 /etc/apt/sources.list.d/vpsadmin.list,以此保证兼容性,也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。

    2. 然后把下面这一条加在最后,并保存退出。

      deb http://archive.debian.org/debian buster-backports main
      
    3. 刷新软件库并查询 Debian 官方的最新版内核并安装。请务必安装你的云服务器对应的版本(本文以比较常见的【amd64】为例)。

      sudo apt update && sudo apt -t buster-backports install linux-image-amd64
      

      如果你的云服务器支持,可以尝试【云服务器专用内核】linux-image-cloud-amd64,优点就是精简、资源占用低,缺点嘛是有同学反馈不支持的系统强行安装会导致无法开机(Kernel 无法识别)。
      为了避免无法识别的悲剧,请确保:

      • 尝试前做一个系统快照,或者
      • 你有 vnc 可以救场(并且你知道怎么用)
    4. 修改 kernel 参数配置文件 sysctl.conf 并指定开启 BBR

      sudo nano /etc/sysctl.conf
      

      本文以 Debian 10 为例,所以使用 /etc/sysctl.conf 仍无问题,但如果你并不是跟着本文从头开始,或者使用了其他 Linux 发行版,那么建议你建立 /etc/sysctl.d/
      文件夹,并在这个文件夹内建立自己的配置文件,形如 /etc/sysctl.d/vpsadmin.conf,以此保证兼容性,因为部分发行版在 systemd
      207 版本之后便不再从 /etc/sysctl.conf 读取参数。使用自定义配置文件也可避免默认文件在不可预见的情况下被覆盖而导致配置丢失。

    5. 把下面的内容添加进去

      net.core.default_qdisc=fq
      net.ipv4.tcp_congestion_control=bbr
      
    6. 重启云服务器、使内核更新和BBR设置都生效

      sudo reboot
      
    7. 完整流程演示如下:

      因为我做展示的云服务器支持云服务器专用内核,所以动图中我用了 linux-image-cloud-amd64。如果你不确定你的 VPS 是否支持,那请务必按照第 3 步的命令,使用常规内核 linux-image-amd64

      更新Debian内核并开启`BBR`

    8. 确认BBR开启

      如果你想确认 BBR 是否正确开启,可以使用下面的命令:

      lsmod | grep bbr
      

      此时应该返回这样的结果:

      tcp_bbr
      

      如果你想确认 fq 算法是否正确开启,可以使用下面的命令:

      lsmod | grep fq
      

      此时应该返回这样的结果:

      sch_fq
      

7 来源

本文整合自 GitHub 储存库 XTLS/Xray-docs-next 中的相关 Markdown 文件,并根据实际情况进行了适当的修改。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
域名解析 弹性计算 程序员
想要轻松地搭建一个即开即用的WordPress博客吗?借助宝塔面板镜像+阿里云ECS,迅速拥有自己的个人博客
拥有个人博客是每位程序员的梦想,但对服务器不熟悉的初学者而言,搭建博客颇具挑战。本文介绍利用阿里云市场的宝塔面板镜像与ECS云服务器,轻松搭建WordPress博客的方法,让您快速拥有专属博客空间。通过简单的操作步骤,即使是新手也能轻松上手,实现从零到有的博客搭建过程。
187 3
|
6月前
|
弹性计算 应用服务中间件 Linux
阿里云ECS服务器上从零开始搭建nginx服务器
阿里云ECS服务器上从零开始搭建nginx服务器
|
6月前
|
弹性计算 安全 Linux
【新手0基础】快速完成幻兽帕鲁服务器的搭建及部署
如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。
|
域名解析 弹性计算 网络协议
阿里云轻量服务器建站步骤(一步步来)
阿里云轻量服务器建站步骤(一步步来)阿里云轻量应用服务器怎么使用?阿里云轻量应用服务器使用教程:轻量应用服务器购买、重置密码、远程连接、宝塔面板的Web环境搭建、WordPress网站程序安装到网站上线,阿里云服务器网分享轻量应用服务器从购买、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程
|
前端开发 Linux 数据安全/隐私保护
小白从购买服务器到部署环境
因为本人目前也是小白阶段,所以看了各种资料和视频一步步从阿里云上通过学生认证买了一个服务器,以下是从购买到部署一站式展示。如有错误欢迎指正!
|
存储 前端开发 数据可视化
关于自己初次使用云服务器的经验总结
偶然间在知乎上看到了一篇帖子,介绍了阿里云开发者飞天计划对学生的照顾优惠,以培养学生学习服务器和专业知识为目的,免费赠送服务器试用,于是自己抱着边试用边学习的心态参加了这个活动。
310 0
关于自己初次使用云服务器的经验总结
|
关系型数据库 MySQL 数据管理
基于云服务器的环境搭建和项目部署学习
本文章主要用于记录使用阿里云服务器进行环境搭建和项目部署期间的所思所学,水平有限,不吝赐教。
|
弹性计算 关系型数据库 MySQL
从零到一上手玩转云服务器-- mysql安装体验
第一期,主要是熟悉一下ecs的创建与管理 ,mysql的安装及服务启动,yum源的配置,快速搭建门户网站。
116 0
从零到一上手玩转云服务器-- mysql安装体验
|
存储 弹性计算 数据可视化
阿里云ECS搭建Linux服务器并实践的体验
简介: 在一周的服务器搭建学习过程中我学会了基础的Linux服务器搭建,并拥有了部分个人见解与成就,为此我写了该篇体验来与大家分享。
|
弹性计算 安全 大数据
初次使用阿里云ECS服务器心得体会
描述下自己所使用的心得,体会
下一篇
无影云桌面