关于部署一个网站

摘要:一些关于部署网站的技术知识的概述。

域名

域名对一个网站的作用,无需多言。澄清一点,云服务器提供商和域名提供商是分离的。虽然云服务器经常向用户兜售域名,但你使用的域名不必来自云服务器提供商。反之亦然。

域名产业的结构

所谓购买域名,实际上是租赁域名一段时间的使用权(每次续约最长十年)。域名最终是由 ICANN(International Corporation for Assigned Names and Numbers)管理的。

域名的分配经手以下四个主体:ICANN 给每个TLD(顶级域名,如 .com .edu .net)分配一个 Registry(理解为注册处,如 .com 对应 Verisign)并下辖之;Registrar(字面意思是登记员,实际上是域名经销商,如 NameCheap,GoDaddy 等公司)与各个TLD的注册处谈判协商,获得大批域名的销售和控制权;最终 Registrant (域名注册人) 从域名经销商那里购买域名。

我们通常只看到以上三个环节的最后一步,即域名的零售。零售的域名通常按年收费,第一年的价格通常比续费价格低很多:如果一年的时间里网站火了,更改域名的成本就高,站长就心甘情愿负担高额续费价格【2024年9月4日更新,附注2】。很多域名经销商提供 WHOIS privacy,即让WHOIS查询返回的结果不包含注册域名时提供的隐私信息。

域名的功能

控制一个域名,就是控制该域名的 DNS record。正因如此,购买域名之后,进入的控制面板一般就是用来修改 DNS record 的。

DNS record 存在于全世界的 DNS 服务器中,它规定了指向该域名的请求该如何处理。改写其规则,可以让域名发挥出很多作用。由于指向子域名的请求要首先经过主域名,所以主域名的 DNS record 可以规定子域名如何处理。(如 info.example.com 是 example.com 的子域名)

创建 A record,可以把请求指引到某个 IP 地址。这是最常用的操作,把对域名的访问指引到某个云服务器上,依此把网站和域名关联起来。

创建 CNAME record,可以把请求 redirect 到另一个域名。访问"世界一流大学.com"之类的域名,却被重定向到某学校的官网,这个恶作剧就是通过购买相应的域名并创建 CNAME record 实现的。

最后,有些域名的控制面板允许你转发邮件,例如你拥有了 example.com 的域名,则你可以设置将发给 “<任意字段>@example.com” 的邮件转发给你设定的邮箱收件地址。不过,想要设置从该域名发信,就相对更困难了。不管怎样,这提供了一个匿名收信的渠道。

服务器

如果你不是技术人员但也想搭建个人博客,可以考虑使用各大云服务器厂商提供的轻量应用服务器,上面安装了开箱即用的 WordPress。

如果你选择从通用的服务器开始配置环境,以 WordPress 为例,过程与在本地配置环境差不多。举一个例子:下载并安装 Apache、PHP、PHP的sql extension、MySQL 或 MariaDB(MySQL 的开源分支,两者基本可以互相替代)。启动 MySQL 服务并为 WordPress 应用创建用户、密码和表。将 WordPress 解压后的文件放到 Apache 的 root directory 下,启动 Apache 服务。

HTTPS

让网站支持 HTTPS 传输协议,用户和网站之间的通信才更安全,防御监听和干扰。HTTPS 协议本质上就是用 SSL/TLS 来加密数据包。以 Apache 服务器为例,要让它处理使用 HTTPS 协议的请求,就需要安装 mod_ssl 模块。Nginx 同理。

然而,这还不够,HTTPS 协议的工作要求服务器安装有效的 TLS 证书。事实上,如果服务器没有提供证书或者提供了无效的证书,大部分的浏览器会发出警告(不安全 / 无效证书)。只有服务器上证书的签发机构(CA)在浏览器预置的“受信任的证书颁发机构列表”中,浏览器才会认为这证书是有效的,从而信任连接。

这么看来,必须向一家受信任的 CA 索要 TLS 证书。在众多受信任的 CA 中,Let’s Encrypt 为了推广 HTTPS 协议的使用,免费颁发 TLS 证书,甚至只需要在服务器上运行一个认证程序就可以自动生成证书,它颁发的证书最容易获取。

在服务器端下载并运行一个 Let’s Encrypt 委托 EFF 提供的名为 certbot 的脚本,脚本会自动验证域名是否会解析到当前服务器(因此域名控制台中 A record 要提前设置好),一旦证实当前服务器确实被授权处理域名的请求,则颁发一个域名对应的证书。将该证书安装到当前服务器上,服务器就支持 https 了。

注意,如果你的服务器没有被绑定到域名,certbot 会拒绝给你的服务器提供 TLS 证书。这时,可以使用 OpenSSL 等工具自行签署一个证书,得到 self-signed certificate。浏览器仍然会对这类证书发出警告(认为是无效的证书),然而由于证书是你亲自生成的,你可以信任这个证书,忽略浏览器的警告(2024年6月22日更新:这个操作不安全,见附注1的分析)。如果你要允许你的网站被公开访问,那还是最好配置一个域名吧,IP 地址裸奔的网站一般被认为是不可接受的。

后记

现在的域名提供商或云服务器厂商通常会提供域名-云服务器-HTTPS的一条龙解决方案,不需要技术知识也可以按照提示走完一系列流程,部署网站。会部署网站已经不是技术人员的竞争力所在了,因此学习这些技术不要带有功利的目的,不要浅尝辄止,要有深入钻研的精神。

【附注1】 仅当你在浏览器中查看证书详情确认证书中的公钥与服务器上的公钥相同时(手动验证身份而非信任证书),才可以忽略该警告。否则,这一情形中攻击者可以展开中间人攻击:1)中间人截获你的服务器发出的self-signed TLS证书,读取其中的公钥 k,用自己的公钥 k’ 制造一个新的 self-signed TLS 证书,返回给浏览器;2)浏览器前的你看到这是一个 self-signed certificate,在预料之中,无视了浏览器的警告;3)中间人截获浏览器用 k’ 加密的预设密码(s): Pub_k'(s),并用私钥解密得到 s;4)中间人用 k 加密 s,得到 Pub_k(s),返回给你的服务器;5)服务器用其私钥解密过程符合预期无报错,可以获得预设密码 s,开始与浏览器正常通信;6)中间人监听信道,并使用 s 解密、窃取信息。

【附注2】笔者最近目睹了一起积累起用户的站点被域名经销商收取天价续约费,不得不更换域名的惨案。关于如何避免这种情形的想法:1)最重要的是在域名过期前提前几个月敲定下一年的租赁合同,留有时间余地,才有议价权 2)如果域名提供商恶意涨价,把域名迁移到另一家域名经销商 (transfer to a different registry) ,类似电话号码的携号转网 3)选择域名经销商时,调查其声誉和定价策略,考虑一次性租赁域名多年的使用权(尽管不能超过10年)


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *