【发布时间】:2022-01-03 04:00:40
【问题描述】:
我一直在尝试使用 Caddy 和 varnish 设置自定义 CDN。这个想法是按需生成 SSL 证书,然后将其传递给清漆,清漆进一步将其发送到后端服务器,这是一个 nodejs 应用程序。如果请求匹配,则 varnish 返回缓存结果,否则获取新数据。 工作在图中描述 flow diagram
以下是相应的文件: docker-compose.yml
version: '3.7'
networks:
web:
external: true
internal:
external: false
driver: bridge
services:
caddy:
image: caddy
container_name: caddy
restart: unless-stopped
ports:
- "8080:8080"
- "80:80"
- "443:443"
volumes:
- $PWD/Caddyfile:/etc/caddy/Caddyfile
- $PWD/site:/srv
- caddy_data:/data
- caddy_config:/config
networks:
- web
varnish:
container_name: varnish
image: varnish:stable
restart: unless-stopped
volumes:
- $PWD/data/varnish/default.vcl:/etc/varnish/default.vcl
networks:
- web
- internal
volumes:
caddy_data:
external: true
caddy_config:
球童文件
{
on_demand_tls {
ask https://check-domain-URL
}
}
https:// {
tls {
on_demand
}
reverse_proxy varnish:80 {
header_up Host {host} # Won't work with another value or transparent preset
header_up X-Forwarded-Host {host}
header_up X-Real-IP {remote}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Proto {scheme}
header_up X-Caddy-Forwarded 1
header_down Cache-Control "public, max-age=31536000"
}
header /_next/static/* {
Cache-Control "public, max-age=31536000, immutable"
}
}
:8080 {
reverse_proxy backend-address:3000
}
default.vcl
vcl 4.0;
backend default {
.host = "caddy";
.port = "8080";
}
sub vcl_deliver
{
# Insert Diagnostic header to show Hit or Miss
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
}
else {
set resp.http.X-Cache = "MISS";
}
}
sub vcl_backend_response {
set beresp.ttl = 10s;
set beresp.grace = 1h;
}
一切正常
- 正在生成 SSL 证书
- 代理正在工作
- Varnish 正在返回结果
- 代理正在获取后端
唯一的问题是 Varnish Cache 总是miss,这是它应该做的一件事
我已经尝试了所有方法,但看起来清漆将每个请求都视为一个新请求。
有什么想法吗?
【问题讨论】:
标签: docker caching cdn varnish caddy