我与我的服务器
今天来谈谈数年来我在服务器上的探索。
当然,我选择的方案不一定是最优解,只是和大家分享一下我这些年踩过的坑,以及对一些特定问题的解决方案。
起步
从一开始,我没有选择把网站托管到常规的云平台。我在家里找了台机器,接入了网络,刷了个系统作为服务器。于是我遇到的第一个显著的问题便是没有公网 IP。
IP
我的服务器一开始是为了和我的朋友一起玩 Minecraft 游戏而搭建的,为了让其他玩家能够 24 小时随时加入服务器游玩,而不需要在我的个人电脑上一直开着服务端。
最开始我使用的方案是花生壳内网穿透,个人用户可以免费申请一个用于内网穿透的花生壳域名,然后其他人就能通过这个带宽极低的服务连接到我。
幸运的是,通过与运营商的沟通,我家成功获得了一个公网 IP 地址。如果你很不幸没那么幸运,可以试试更优秀的内网穿透服务(比如很多人都在用的 Sakura FRP),或者看看下面的 VPS 章节。
域名
好了,现在我终于得到了梦寐以求的公网 IP,赶紧上网搜了下教程,写了个 index.html,然后用命令 python -m http.server 开个网站(HTTP)服务器看看。命令告诉我只需要点击 153.xxx.xxx.35:8000 就能访问我的网站了,事实也确实如此,我看到了我写的简单网页。
这很棒,也很有成就感。就差一步了——我需要一个域名。
我们平时访问的网站(比如 B站 百度)都有自己的域名,你输入 www.baidu.com 就能直接访问百度,而不用输入 180.101.51.73。
我找到的域名注册商叫做聚名网,并注册了我的第一个域名 peterserver.top,peterweb.site ov0.cc,以及现在的 mygo.plus。
于是我满心欢喜地在我的新域名上启动了 Minecraft 服务器,和大家一起愉快地玩了好几天,然后……
DDNS
然后我家的路由器重启了。运营商为我家提供的 IP 地址,在每次路由器拨号上网时都会改变,而域名的解析记录不会自己变。
现在我需要一种不用隔几天就给域名解析记录还新 IP 的方法。最开始,我选择了路由器内置的 DDNS 功能,让我有些意外的是它居然也由花生壳提供服务。它会自动将我家现在的 IP 地址绑定到它们提供的域名,我只需要在我的域名解析记录中添加一条 CNAME 记录就行,DDNS 服务会自动帮我换 IP 地址。
一切都挺好的,就是有点不太好。花生壳家的 DDNS 实在是一言难尽,隔三差五我就得去路由器配置里重启 DDNS 服务。最终我朋友给我提供了一个新的 DDNS 解决方案:DuckDNS。这是一个免费的 DDNS 服务,只需要在服务器上配置一个定时脚本即可。
SSL 证书(一)
为什么我的网站链接左边总有个打开的锁,还写着不安全?这个问题困扰了我很久。事实上,这是因为我的网站服务器并没有打开 SSL 服务,也就是只提供 HTTP 而不是 HTTPS 服务。抛开链接旁边这把锁的美观性不谈,最显著的问题真的就是不安全。
通过 HTTP 协议访问时,双方所有的流量在互联网上都是明文的。如果你向我发了一串密码,有心之人只要想都能看到,这一眼就能看出来不安全,因此我需要而且很需要 HTTPS 协议。
HTTPS 需要 SSL 证书,我从网上找了个方案,使用 OpenSSL 生成自签名证书。网站确实成功用上了 HTTPS,但是迎面而来的是不安全三个大字,还有浏览器里的此网站不安全是否无视风险继续访问提醒。
于是我发现,一个网站想要安全,需要一个权威机构颁发 SSL 证书,我最开始选择了 Certum 个人用户可以免费注册 30 天期限的证书,缺点就是要频繁更新了。
标准端口
一直以来,我的网站都需要带上 2500 端口访问,就像 ov0.cc :2500。
我不是没有试过不用写端口——也就是用标准端口——的方式,但是 HTTP 和 HTTPS 的标准端口 80 和 443 都被运营商封杀了,我大概需要备案之类的才行,总之非常麻烦。
为了寻找这个问题的解决办法,我的不断探索引出了服务器方案的第二阶段。
贪心的需求
我对网站的要求其实相当矛盾,一方面,我希望能被快速访问,另一方面,我也不希望被纳入审查,也就是进行备案。这可能听起来很奇怪,因为在国内一个正规网站几乎都是要经过备案的,如果不这么做,那几乎不可避免地要绕过相当多的限制才能提供服务。
但我做到了。
端口转发
我开始使用 Cloudflare,它提供国外网站的 CDN 加速,攻击防护,免费自动 SSL 续签以及各种其他服务,而且完全免费!
最重要的是,将我的域名解析托管给 Cloudflare后,它支持将标准端口的访问映射到我服务器的非标准端口上。
除了访问一些网页路径时的小瑕疵,这一切都很完美。
在花了一周配置 Cloudflare 防护策略后,网站已经堪称完全体。
直到我的朋友访问了网站,告诉我那糟糕的人机验证,以及究极无敌慢的访问速度。
VPS
很显然,Cloudflare 在国内的访问速度真的一言难尽,无论我尝试怎样的加速策略,最后的结果甚至不如我最开始花生壳内网穿透的速度。这真的非常遗憾,
既然国内封杀标准端口,Cloudflare 又太慢,那我就搞一个国外服务器!听着很简单对吧?事实上也确实不难。
我选择的 VPS 服务商叫做 ClawCloud,相当便宜,3$ 就能买一个月,虽然性能完全不匹配我的家用服务器,但优势是带宽稳定且上下行对等,而且不封端口。
我开始将我的网站迁移上 VPS,这立刻解决了没有标准端口的问题:访问 ov0.cc == 成功访问。没有丑陋的端口。
SSL 证书(二)
快速访问解决了,但没了 Cloudflare,网站又开始出现烦人的不安全提醒,搞得我的网站好像很危险一样。
但每个月都上 Certum 申请也太麻烦了。在询问 AI 时,我得到了一个很棒的方案:ACME 可以自动向权威机构申请证书,包括我关了防护但还托管着域名的 Cloudflare。
我立刻申请了 DNS token,给我的 VPS 配置了 ACME 定时任务。终于,它每天都能自己获取权威证书了!
速度
尽管 VPS 距离中国大陆不远,但少量多数的文件的加载还是很慢。物理距离是一大限制,尽管文件本身加载耗时不长,但是延迟会让大量文件的加载越堆越慢。
于是我重新打开了我的家庭服务器,配置了自动从 VPS 拉取每日证书的定时任务,在 2500 端口开放了只有一个节点的 CDN 服务器,并配置了跨域允许 VPS 的域名请求资源。
现在 VPS 上的网页请求的所有资源其实都是从家用服务器发送过去的,速度相当之快。
现在
基本上来说,我的网站现在的运行机制很简单,国外的 VPS 提供标准端口访问的能力,以及提供基础的网站。网站中所有的资产和代码都会从家用服务器的非标准端口请求。它们同样用了 ACME 请求的权威证书来实现 SSL 加密。
这样中国大陆的各位既能方便地输入域名访问网站,大量数据的加载时的请求延迟和速度也得到了很优秀的改善。
到写下这篇文章为止,我已经来来回回折腾我的服务器 7 年了。这些年来探索各种新方案,被一堆问题推着走,反而学到了各种领域的技术知识,还是相当有价值和意义的,有点像一场 RPG 冒险故事的感觉吧。
所以如果各位有想法的话,我还是很推荐去试试搭建一个自己的小网站的,说不定就能学点奇怪的东西?