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

推荐订阅源

D
DataBreaches.Net
L
LangChain Blog
博客园_首页
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
WordPress大学
WordPress大学
V
Visual Studio Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
C
Check Point Blog
IT之家
IT之家
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
D
Docker
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
I
InfoQ

Peng's Blog

通过《Resilient AI Supercomputer Networking using MRC and SRv6》理解协议层面的故障检测 经典论文MP-RDMA(多路径RDMA)阅读 Vibe paper不负责指北 SPFC参考文献阅读《CONGA》 读《Uno:数据中心间和数据中心内拥塞控制与可靠连接的一站式解决方案》 Lenovo Legion Y9000P 在 Linux 下只有 30W:从现象、WMI 到驱动补丁 理解《From ATOP to ZCube》中的ZCube网络拓扑 集合通信原语学习 Zotero在Wayland下侧边栏无法拖动的解决办法 再读CAVER 我读的第一篇论文--NSDI_26_CAVER 在archlinux下使用万象拼音实现更智慧的中文输入法 Pengs.top浴火重生!备案、服务器迁移与全站Docker化 严谨与温度并存:北航宋友老师程设课的学习感悟 Android Studio全流程换源指南 解决linux系统下pipewire作为音频服务器持续播放声音中断问题 在ThinkBook 16+ 2025上安装archlinux驯服记录【基本信息与触摸板修复】 「行云流水」在挂载移动硬盘时自动启动Syncthing开始同步的丝滑体验 自建图床和PicGo闹不愉快?干脆自己写个脚本,深度整合到KDE右键菜单! btrfs各压缩等级速率测试脚本,选择最适合你的压缩级别 别当冤大头,Adobe全家桶破解源头方案:修图剪辑不求人,盗版网站也得从你这儿进货! 轻松配置aria2下载器,通过systemd设置开机自启并与浏览器集成 Git Commit 规范指南
Traefik实现单Docker容器托管多个静态网站
Pengbo · 2025-12-30 · via Peng's Blog

在本站全部Docker化后,目前我使用Traefik对Docker容器的公网映射进行统一管理。其标签化配置,自动续签SSL证书,以及原生的QUIC支持都是很好的特性。

唯一的问题是我迁移的时候没有考虑到以后静态站点的增长需求。此前对于每一个子域名我都拉了一个基础的nginx容器,把www文件夹映射进去。这虽然提供了 不必的 安全性,但是增加了服务器负载。最主要的问题是,一旦我希望添加一个静态站点,哪怕只有一个index.html 都需要走以下流程:

  1. www文件夹下新建目录,放入静态资源
  2. 新建nginx的站点配置文件,基本是把之前的抄过来改一下host
  3. docker-compose.yml里新加一个服务,也是把以前的段落复制粘贴改名称
  4. 把以上文件移到服务器上
  5. docker compose up -d
  6. 添加DNS记录

这无疑增加了创意落地为现实耗费的时间精力。

我仔细观察了一下,www的目录被我收拾得还不错,基本上子目录的名称就是子域名,于是就有了想法根据请求头自动切换资源目录的想法。并在AI的帮助下做成了。

申请通配符证书

为了尽可能减少每次新增站点所需的工作量,我配置Traefik为我自动申请*.pengs.toppengs.top的通配符证书,这样一个证书就可以为所有子域名提供SSL支持,缺点是需要你的DNS解析商支持(应该基本上都支持吧)

这一部分可以参看:如何使用Traefik通过Cloudflare DNS验证申请泛域名证书

新建Docker Compose Service

docker-compose.yml内新增服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static-sites:
image: nginx:alpine
container_name: static-sites
restart: unless-stopped
volumes:
- "./base/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
- "./base/nginx/sites-enabled/static-sites.conf:/etc/nginx/conf.d/default.conf:ro"
- "./web:/var/www:ro"


labels:
- "traefik.enable=true"
- "traefik.docker.network=docker-services_proxy"


- "traefik.http.routers.static-sites.rule=HostRegexp(`^[a-z0-9-]+\\.pengs\\.top$$`)"
- "traefik.http.routers.static-sites.priority=1"
- "traefik.http.routers.static-sites.entrypoints=websecure"
- "traefik.http.services.static-sites.loadbalancer.server.port=80"
- "traefik.http.services.static-sites.loadbalancer.server.scheme=http"

这里需要你自行修改域名。

新建nginx配置文件

上面的配置中,我们将static-sites.conf穿透进了Docker容器中,现在来创建它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 80 default_server;
listen [::]:80;
server_name ~^(?<subdomain>[^.]+)\.pengs\.top$;

gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_min_length 256;
gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml;

# 动态根目录:子域名对应文件夹
root /var/www/$subdomain;
index index.html index.htm;

location / {
try_files $uri $uri/ /index.html =404;
add_header Cache-Control private;
}

# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|webp|mp4|mkv)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}

额,看起来这么长,其实主要就是用正则表达式匹配了subdomain然后访问对应目录。多出来的那部分内容,一方面是增加了gzip压缩,利用服务器的cpu资源换取更少的流量流出,如果不需要刻意注释掉。另外的就是增加了一些不会改变的资源的缓存。

拉起!

ssh登陆上服务器使用docker compose up -d拉起服务,然后到你的www目录下新建一个目录,再去dns那里添加记录就能访问到对应资源了。

祝安好!