惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
小众软件
小众软件
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
博客园 - 三生石上(FineUI控件)
C
Check Point Blog
S
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
罗磊的独立博客
有赞技术团队
有赞技术团队
V
V2EX
Y
Y Combinator Blog
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Fortinet All Blogs
W
WeLiveSecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
S
Security @ Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
PCI Perspectives
PCI Perspectives
H
Heimdal Security Blog
Schneier on Security
Schneier on Security
Security Latest
Security Latest
AWS News Blog
AWS News Blog
月光博客
月光博客
Security Archives - TechRepublic
Security Archives - TechRepublic
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
博客园 - Franky
Cisco Talos Blog
Cisco Talos Blog
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
N
News and Events Feed by Topic
Cloudbric
Cloudbric
Scott Helme
Scott Helme
云风的 BLOG
云风的 BLOG
Attack and Defense Labs
Attack and Defense Labs

二丫讲梵

学习周刊-总第258期-2026年第15周 学习周刊-总第257期-2026年第14周 学习周刊-总第256期-2026年第13周 学习周刊-总第255期-2026年第12周 学习周刊-总第254期-2026年第11周 学习周刊-总第253期-2026年第10周 临时插播一条羊毛,免费领取450元大模型API代金券 学习周刊-总第252期-2026年第09周 学习周刊-总第251期-2026年第08周 学习周刊-总第250期-2026年第07周 学习周刊-总第249期-2026年第06周 诚邀评论,聊聊你所知欲知的我 学习周刊-总第248期-2026年第05周 我的QQ动态之2015年 我的QQ动态之2014年 我的QQ动态之2013年 我的QQ动态之2012年 我的QQ动态-2010-2011年 我的QQ动态-创栏小叙 学习周刊-总第247期-2026年第04周 Nexus社区版权益阉割--一文告诉你有哪些版本可以选择 学习周刊-总第246期-2026年第03周 学习周刊-总第245期-2026年第02周 学习周刊-总第244期-2026年第01周 学习周刊-总第243期-2025年第52周 学习周刊-总第242期-2025年第51周 开源项目ZenOps:带你领略禅意运维 学习周刊-总第241期-2025年第50周 用京东金融,享负债人生 学习周刊-总第240期-2025年第49周 学习周刊-总第239期-2025年第48周 学习周刊-总第238期-2025年第47周 我们输了,但收获颇多 太多了,太多了 学习周刊-总第237期-2025年第46周 学习周刊-总第236期-2025年第45周 学习周刊-总第235期-2025年第44周 二五年国庆二三事 学习周刊-总第234期-2025年第43周 学习周刊-总第233期-2025年第42周 学习周刊-总第232期-2025年第41周 学习周刊-总第231期-2025年第40周 学习周刊-总第230期-2025年第39周 西湖毅行 2025年开源世界逸闻三则 学习周刊-总第229期-2025年第38周 手抄《与妻书》 CNB开发与构建基于docker-cache缓存复用的配置实践心得 学习周刊-总第228期-2025年第37周 父亲善行录 学习周刊-总第227期-2025年第36周 带你认识我之看看我的高中同学录(其二) 学习周刊-总第226期-2025年第35周 带你认识我之看看我的高中同学录(其一) 认识神级MCP工具系列--用anyquery和数据库交互 学习周刊-总第225期-2025年第34周 学习周刊-总第224期-2025年第33周 学习周刊-总第223期-2025年第32周 学习周刊-总第222期-2025年第31周 学习周刊-总第221期-2025年第30周 CNB云原生开发环境届的瑞士军刀,详解qifei项目 vuepress-vdoing主题配置自建不蒜子统计 学习周刊-总第220期-2025年第29周 写在博客发表文章1000篇的节点 从claude cli的体验聊聊最大的敌人是我们自己的成见 学习周刊-总第219期-2025年第28周 学习周刊-总第218期-2025年第27周 学习周刊-总第217期-2025年第26周 理论正确,事实错误 学习周刊-总第216期-2025年第25周 学习周刊-总第215期-2025年第24周 学习周刊-总第214期-2025年第23周 学习周刊-总第213期-2025年第22周 学习周刊-总第212期-2025年第21周 从赵心童世锦赛夺冠聊聊我的斯诺克情缘 学习周刊-总第211期-2025年第20周 记录二五年五一之短暂回归家庭 学习周刊-总第210期-2025年第19周 学习周刊-总第209期-2025年第18周 学习周刊-总第208期-2025年第17周 Go开发实践之Gin框架将前端的dist目录embed到二进制 学习周刊-总第207期-2025年第16周 近期关于cobra库的一些实践心得总结 学习周刊-总第206期-2025年第15周 我的嗜好--嗑瓜子 记大宝参加幼儿园组织的清明烈士陵园扫墓活动 学习周刊-总第205期-2025年第14周 学习周刊-总第204期-2025年第13周 前端开发小笔记--在数组中给字段添加值与删除字段的操作 学习周刊-总第203期-2025年第12周 人生实苦,何以自渡 学习周刊-总第202期-2025年第11周 近期发现的一些优秀的工具提名(一) 学习周刊-总第201期-2025年第10周 学习周刊-总第200期-2025年第09周 记一次女友喝醉使我忍术破功 爱情风波--一次分手又复合的经历 学习周刊-总第199期-2025年第08周 整理我的信息源 学习周刊-总第198期-2025年第07周
整理我在静态服务透明代理上的极致求索之路,最后一个你绝想不到
二丫讲梵 · 2025-11-26 · via 二丫讲梵

本文来记录一下我个人在前端静态服务透明代理上的求索之路,横跨多年的变迁,最终达到极致的优雅。

# 前言

这里所谓的静态代理,通常是指前端项目的静态透明代理,可能是单个的 index.html,也可能是打包构建后的 dist 目录,通过工具代理之后,可基于端口访问完整功能的一个需求场景。

补充:这里我说明下为啥会有这样的场景,以往在维护前端项目部署的时候,通常我们会老老实实打包构建,然后通过 Nginx 来进行代理转发,认为这是天经地义的,但随着技术迭代发展,我们会把前端项目也作为一个独立的容器放到 k8s 里运行,此时比较理想的做法是让容器服务尽量标准化,暴漏统一的端口到 svc,然后通过 ingress 入口访问对应的服务,这种时候,容器的底层镜像用 Nginx 似乎就不甚合适了。后来在进行一些前端项目或者 demo 开发的时候,自己也会遇到一些封装镜像给别人用的场景,这个时候,追求极致的更小可用镜像就成了我的一个目标。

正式介绍之前,先放一张截图来感受一下,如下截图是我使用的几个工具封装后的镜像:

我的求索之路,正是如上截图中镜像大小的倒序来的,分别是 Nginx --> http-server --> dufs --> static-website。尤其是最后一个,实在是到了一个离谱的程度,看到 92k 的大小,你甚至会怀疑它是否能完成我们需要的前端静态代理需求,不用担心,完全 OK 的。

# Nginx

Nginx 当然是静态服务领域的王者,刚入行的时候,我们都是通过 Nginx 来配置前端项目的入口转发,彼时经常会迷失在 Nginx 的某项配置里,遇到前端代码中路由没有放到根目录的情况,更是要和前端同学一块儿排查半天,于是后来就极力要求前端必须让项目简洁易运维,我们的 Nginx 规则也能简单通用。

这里我用一个简单配置演示功能,下文相同,仅演示一个 index.html,表意为主。

FROM docker.cnb.cool/znb/images/nginx

RUN echo 'this is nginx' > /usr/share/nginx/html/index.html

1
2
3

因为注入的 index.html 文件大小几乎可以忽略,因此最终构建的镜像大小和开头截图大小基本无差。

构建运行测试:

$ docker build -t nginx:demo .

$ docker run -itd --name nginx -p 8080:80 nginx:demo

$ curl localhost:8080
this is nginx

1
2
3
4
5
6

# http-server

此前我曾写过一篇文章记录 http-server (opens new window),详见:认识并使用一个透明代理http-server (opens new window),写于 2022 年,印证了那个时期我正使用这个工具作为前端的静态代理。

http-server 项目官方提供了一个 Dockerfile,但是没有发布官方的镜像,另外基于官方的 Dockerfile 打包后的镜像出来是 127M,于是我将其做了一下封装,构建之后基础镜像时 109M。之所以这么大,是因为该工具基于 nodejs 编写,运行时需要依赖 node 环境。我的封装 Dockerfile 见:http-server (opens new window)

同理,这里也做一个 demo 测试:

FROM docker.cnb.cool/znb/images/http-server

WORKDIR /app

RUN echo 'this is http-server' > index.html

CMD ["http-server", "-d", "false", "-p", "8888"]

1
2
3
4
5
6
7

构建运行测试:

$ docker build -t http-server:demo .

$ docker run -itd --name http-server -p 8081:8888 http-server:demo

$ curl localhost:8081
this is http-server

1
2
3
4
5
6

# dufs

dufs (opens new window) 是一个使用 Rust 编写的静态文件服务器,它继承了 Rust 语言内存占用小、性能高的优点。它的设计哲学就是轻量和快速。

实际上,官方提供的 Docker 镜像有 4.72M,我引用了一个社区主题:dufs-material-assets (opens new window) 封装的二进制,再用 upx 压制之后,重新编写 Dockerfile,最终镜像大小来到了 2.26M,是原来的一半儿大小。

dufs 能力很丰富,这里也用一个 demo 介绍下静态代理能力:

FROM docker.cnb.cool/znb/images/dufs

WORKDIR /app

ADD index.html .

ENTRYPOINT ["/bin/dufs", "--render-index"]

1
2
3
4
5
6
7

因为基础镜像基于scratch构建,里边没有 echo 命令,因此把 index 文件放在本地了。

构建运行测试:

$ docker build -t dufs:demo .

$ docker run -itd --name dufs -p 8082:5000 dufs:demo

$ curl localhost:8082
this is dufs

1
2
3
4
5
6

# static-website

这是一个偶然的机遇中发现的宝藏,我已经记不得是在哪个前端开源项目里挖掘的,但一见倾心,成为我后续前端 demo 项目静态代理的御用基础工具。

项目地址:docker-static-website (opens new window)

关于这个工具的背景故事,作者有详细的记录,这里援引下来:The smallest Docker image to serve static websites (opens new window) 非常值得一读,作者也曾是一位极致静态代理的求索之人。

那么话不多说,直接上 demo:

FROM docker.cnb.cool/znb/images/docker-static-website:2.6.0

WORKDIR /app

ADD index.html .

CMD ["/busybox-httpd", "-f", "-v", "-p", "8686"]

1
2
3
4
5
6
7

构建运行测试:

$ docker build -t static-website:demo .

$ docker run -itd --name static-website -p 8083:8686 static-website:demo

$ curl localhost:8082
this is static website

1
2
3
4
5
6

经过构建后的镜像,仍旧只有 92k 最终仍旧能够正常访问。

如果你想体验该项目在 dist 文件场景中的代理能力,可以见我做的一个预览项目:SnowAdmin (opens new window)

最后:过往的文章标题,通常都是表意为主,从来不会用这种震惊体,但正如标题所言,当我第一次看到这个工具的时候,的确令我惊叹。


以上,便是我个人在这个领域的探索之路,希望对你有所帮助。所有的镜像我都已经放到个人 CNB 仓库中,你可以快速拉取体验。

另外,在 github 上 static-server (opens new window) 这个主题下还有不少相关的开源项目,如果你有兴趣,也可以探索一些其他的工具,至少本文介绍的,已经足够我日常使用了。