2026 年用 C 语言和 CGI 写了个商业网站:一个”反潮流”实验

· 科技资讯

2026 年用 C 语言和 CGI 写了个商业网站:一个”反潮流”实验

1994 年想做动态网站,你写个 C 程序丢进 cgi-bin 目录让 Apache 按请求 fork;32 年后,有人用” fundamentally 相同的技术”上线了一个有用户账号、Stripe 支付、Postmark 邮件的商业产品。这个实验叫 marketyour.games,作者 Corey Prophitt 在 Hacker News 上引发 344 分的讨论。他的结论很直白:CGI 在 2004 年衰落是合理的,但在 2026 年,那些理由不再成立。

技术栈:一个二进制 + 一个 SQLite 文件

整个项目的技术栈是 OpenBSD + C + httpd + SQLite,作者称之为 BCHS。没有框架——你写一个 C 程序,读 CGI 环境变量,返回 HTTP 响应。没有模板引擎——C 代码直接输出 HTML。没有独立的数据库服务器——通过 SQLite 的 C API 直接打开数据库文件。没有容器——构建一个静态链接的二进制,丢进一个文件夹。

每次请求 fork 一个新进程。部署新版本就是替换一个文件,不需要重启服务器、没有停机。新请求自动拿到新二进制。OpenBSD 的 httpd 默认从 chroot 目录服务,CGI 二进制被沙箱在自己的文件系统角落。安全加固靠 OpenBSD 原生的 pledge 和 unveil 系统调用。

额外依赖只有三个库:libcurl(调 Stripe 和 Postmark 的出站请求)、libsodium(随机 ID、密码哈希、HMAC 验证)、libcjson(JSON 解析)。后两者是单文件实现,直接 vendor 进项目。结果是一个几乎没有任何活动部件的构建——干净构建只要几秒,增量重编译不到半秒。

marketyour.games 技术栈 OpenBSD httpd + chroot pledge + unveil C 程序 CGI 接口 每请求 fork SQLite 单文件数据库 无进程·无配置 3 个库 libcurl libsodium+cjson 部署 = 替换 1 个文件 · 静态资源编译进二进制 · 无 JS · 渐进增强 Stripe 支付 · Postmark 邮件 · 用户账号 · 搜索面板 · 文件夹

“少即是多”:供应链安全的新视角

作者最有力的论点是供应链风险。在自主 AI 代理和每周针对包仓库的攻击日益频繁的今天,拥有一个极小的依赖图让人安心。现代技术栈的依赖图会膨胀:一两个直接依赖可能拉进数百个间接依赖,每个都由一个你从未听说的人维护,发布凭证用 2015 年复用的密码保护。

他的供应链是”一个 C 编译器 + 三个库”。要攻破它,得先攻破 libcurl——一个整个互联网都在盯着的项目,而不是一个每周下载 11 次、owner 在 2019 年就离开的项目。这个论点在 2026 年的安全环境下格外有说服力。

工具链的简化也带来了开发体验的简化。他用经典 Vim,零插件——没有 LSP、没有自动补全、没有代码格式化、没有 AI。复杂技术栈需要复杂工具:你需要一个语言服务器来穿越层层抽象。但这个栈简单到只需要一个纯文本编辑器。打开一个文件,读它,你就知道它做什么。而当你确实需要工具时,sanitizer、valgrind、gdb、ctags、cscope 这些”祖传”工具就在一个包安装的距离之内。

CGI 的”平反”

CGI 规范 2004 年发布,至今没有改过。它的整个接口就是一组基础 HTTP 概念:请求头、请求方法、查询字符串、body 数据。如果你懂 HTTP,你就已经懂 CGI。它不是要学的框架,而是一组根本性的协议约定。

作者把 CGI 比作”没有供应商的 serverless”:一个 supervisor 按请求调用你的代码,递给你一个环境变量包,收集结果。区别是——没有供应商锁定,没有惊喜账单。部署模型也极其简单:替换文件即完成升级,新请求自动使用新二进制,零停机。

当然,CGI 不是没有代价。没有框架意味着你要自己写 cookie 解析、查询参数验证、表单数据处理、输入转义。作者在一个头文件(cgi.h)里自己实现了这些,但承认”我不确定这是正确的方案”。社区有 kcgi 这样的库,但采用一个库就意味着接受它的 API 和安全模型。他期待看到一套可以”drop in”的共享工具,像 stb 库那样。

这对开发者意味着什么

这个项目的价值不在于”C 语言能写 Web 应用”(这从来不是问题),而在于它挑战了一个假设:现代 Web 开发必须用现代技术栈。React + Next.js + PostgreSQL + Docker 不是唯一路径,甚至不一定是最好路径。如果你的产品是一个单用户二进制、一个 SQLite 文件、三个库——你的攻击面、运维负担、依赖风险、工具链复杂度全部降到最小。

作者说”我会再次使用这个技术栈”。在 AI 代理开始大规模生成代码、包供应链攻击成为常态的 2026 年,”少即是多”可能不再是一个美学选择,而是一个安全策略。

核心观点:marketyour.games 不是一个”复古实验”,而是一个供应链安全宣言。如果你的 Web 产品足够小(单二进制 + SQLite),CGI 模式在 2026 年的 fork 成本已经低到可以忽略,而它带来的”零框架、零容器、零意外依赖”的安全属性,在 AI 代理和包攻击泛滥的时代是真实优势。不是所有产品都需要微服务。

— END —

LC 智趣厅 · 科技与生活的交点

ihygg.cn

Scroll to Top
微信公众号:LC智趣厅

扫码关注微信公众号
LC智趣厅