公众号旧文

如何用没有公网 IP 的服务器,做一个网站?

作者:胖子阅读 —

本文讲的不是利用静态托管建站,而是真的使用自己的服务器和域名。

正文开始:

之前我一直以为,想做一个网站,至少需要:

  • 一台有公网 IP 的服务器
  • 域名解析
  • 端口开放

但实际上,即使服务器没有公网 IP,也可以上线一个网站。

而且我今天用一晚上就已经把它做出来了。

一、事情的起点

事情还要从2年前说起。

2年前的某一天,我们学校的官网,突然就无法访问了。

一直到了1年前,才恢复,但是网站改了,之前的内容都没有了。

好在我有先见之明,提前保存了历届的毕业照。

这些照片一直躺在我的电脑里,直到最近。

我有了一个很简单的想法:做一个网站,把这些毕业照放上去。

二、问题出现了:服务器没有公网IP

我的服务器是 IPv6 only + IPv4 NAT,IPv4可出站,IPv6可入站。

简单理解就是:

我的服务器能访问别人,但是别人访问不了我。

也就是说,按常规方式部署,大部分人根本打不开我的网站。

三、关键转折:Cloudflare Tunnel

我没有去折腾端口映射,也没有换服务器。

而是用了一个更简单的方案:

Cloudflare Tunnel

它的逻辑很巧妙:

服务器主动连 Cloudflare

然后由 Cloudflare 提供公网入口

于是我不再需要公网 IP,网站直接可以通过域名访问。

甚至还支持 HTTPS!

https://grad.example.xyz

一年5块钱的 .xyz 域名可以看这篇:

注册域名,果然还是花些钱才省心

四、而且,我没有写后端

一个网站通常会有前后端,但是我的毕业照网站不需要。

我用的是 HTML + CSS + JavaScript + 图片

也就是纯静态网站。

虽然用Github pages和Cloudflare pages也能做,但我更希望自行保存那些照片。

五、数据怎么管理?

我也没有用数据库,而是只用了一个文件:

data.json

[
  {
    "year": "2009",
    "image": "photos/2009/xxx.jpg"
  }
]

六、自动化是关键

我写了一个 Python 脚本,扫描 photos/ 目录,并自动生成 data.json

这样上传图片 = 更新网站,完全不需要手动改代码。

七、上传流程简单到离谱

整个流程只有四步:

  1. 建目录
  2. 上传图片(scp)
  3. 生成 data.json
  4. 刷新网页

例如:

scp *.jpg root@100.64.0.15:/var/www/grad-site/photos/2013/ && \
ssh root@100.64.0.15 "python3 /var/www/grad-site/tools/generate_data.py"

八、网站结构的进化

一开始,我是这样设计的:

首页展示所有毕业班的全部图片,但很快就发现:

太乱,太慢,找不到重点

于是我改成:

首页只显示年份,点击年份后,查看该年份所有毕业班

也就是:

index.html → 年份列表

year.html?y=2009  → 2009届

这一步,让网站从图片堆变成了结构化内容。

图片

九、体验升级

最后我给网站加了这些功能:

  • 点击放大图片
  • ← → 切换
  • Esc 关闭
  • 图片懒加载

十、性能优化

我还第一次使用了 Cloudflare CDN

/photos/ 下的所有图片,全部缓存到全球节点。

效果:

cf-cache-status: HIT

这意味着,用户访问走 CDN,几乎不消耗服务器流量,打开速度非常快。

十一、最终效果

现在这个网站,没有公网 IP 也能访问,不需要配置端口映射。

支持多年份管理,支持上传图片后自动更新

自带 CDN 加速,并且图片浏览体验完整

后记:

在当下的时代,显然我们不需要完美的条件,才开始做一个网站。

如果你也有一堆照片、资料,你也完全可以做一个属于自己的网站。

大家可以在评论区猜猜这个网站域名+服务器的成本,一个月是多少?