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

推荐订阅源

云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
L
LangChain Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
博客园 - 司徒正美

二丫讲梵

学习周刊-总第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周
整理我在静态服务透明代理上的极致求索之路,最后一个你绝想不到
二丫讲梵 · 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) 这个主题下还有不少相关的开源项目,如果你有兴趣,也可以探索一些其他的工具,至少本文介绍的,已经足够我日常使用了。