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

推荐订阅源

Latest news
Latest news
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
博客园 - 司徒正美
B
Blog RSS Feed
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
NISL@THU
NISL@THU
博客园 - Franky
P
Proofpoint News Feed
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
S
Schneier on Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
WordPress大学
WordPress大学
The Hacker News
The Hacker News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
罗磊的独立博客
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
SecWiki News
SecWiki News
云风的 BLOG
云风的 BLOG
美团技术团队
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
S
Security Affairs

Peng's Blog

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那里添加记录就能访问到对应资源了。

祝安好!