livingdocs/varnish一个支持配置热重载的Varnish设置,可直接用于Kubernetes和Docker化环境,无需复杂操作即可部署和运行。
SIGHUP信号进行配置重载9131与其他Kubernetes Varnish操作器的区别:
shdocker build -t livingdocs/varnish .
为简单起见,支持最常见的参数。注意,配置文件中的参数始终覆盖这些CLI参数。
--config-source /etc/varnish/source:配置和模板目录
--config-output /etc/varnish:Varnish VCL文件的目标目录
--backend example.com:声明config.clusters[0].addresses: [example.com]
-p default_ttl=60:声明config.parameters.default_ttl: 60或其他任何Varnish参数
--storage default,512m:Varnish存储配置
CONFIG_YAML或CONFIG_JSON环境变量:支持传递整个配置对象
sh# 例如使用请求微缓存,TTL设为1 docker run --rm -it -p 8080:8080 --name varnish livingdocs/varnish --backend host.docker.internal:8081 -p default_ttl=1 -p default_grace=60
shecho ' listenAddress: 0.0.0.0:8080 watchFiles: true watchDns: false clusters: - name: delivery address: host.docker.internal:8081 ' > config.yaml docker run --rm -it -v $PWD:/etc/varnish/source -p 8080:8080 --name varnish livingdocs/varnish
shecho ' { "listenAddress": "0.0.0.0:8080", "watchFiles": true, "watchDns": false, "clusters": [{"name": "delivery", "address": "host.docker.internal:8081"}] } ' > config.json docker run --rm -it -v $PWD:/etc/varnish/source -p 8080:8080 --name varnish livingdocs/varnish
支持YAML和JSON配置文件。选择YAML的原因是它支持多行字符串,便于嵌入配置。
配置文件必须位于Varnish配置源目录中。默认目录为/etc/varnish/source,可通过--config-source CLI选项覆盖。请勿将此目录更改为/etc/varnish,否则文件监视器会陷入无限更新循环。
注意,在Kubernetes中,无法在挂载配置映射的目录中写入任何文件。
配置文件更改会被监视并触发Varnish内的重载。注意,如果文件所有者不是varnish,文件通知可能无法正常工作。
也可通过向主进程发送SIGHUP信号重载配置。
整个配置对象会传递给VCL模板,因此可添加自定义变量并传递给模板渲染器。
yaml# /etc/varnish/source/config.yaml # 静态配置 # # 支持任何Varnish监听选项 listenAddress: 0.0.0.0:8080,HTTP adminListenAddress: 0.0.0.0:2000 prometheusListenAddress: 0.0.0.0:9131 # 直接传递给进程的命令参数 # 例如,要添加次要监听地址,可传递选项 varnishRuntimeParameters: [-a, /path/to/listen.sock] # Varnish存储配置 storage: default,512m # 为管理端口定义自定义密钥 # 默认情况下会生成一个密钥并写入密钥文件 # 如果密钥文件已包含值,则优先使用该值 adminSecret: null adminSecretFile: /etc/varnish/secret # 启用HTTP访问日志输出到stdout varnishAccessLogs: true # 关闭期间,Varnish会在/_health上返回503错误 shutdownDelay: 5s # 动态配置 # # 可显式禁用触发配置重载的文件监视 # 向运行中的进程发送'kill -SIGHUP 1'也会重载配置 watchFiles: true watchDns: true # Varnish通过X-Served-By头响应请求 # 可在此自定义,{{hostname}}会自动替换 xServedBy: "{{hostname}}" # 可声明多个VCL并在加载的顶级VCL配置中引用它们 vcl: - name: default # 配置相对于配置文件的路径 # 即/etc/varnish/source/default.vcl.ejs # 仅监视/etc/varnish/source中的文件变化,建议保持此路径 src: default.vcl.ejs # 最终文件的目标路径默认为 # '/etc/varnish'目录中不带ejs扩展名的模板名 dest: default.vcl # 如有多个VCL,在主VCL上声明此标志,以便知道哪个设为活动状态 top: true - name: secondary src: secondary.vcl.ejs # 可在cluster.probe配置中引用的探针 probes: # 仅name为必填项,其余为默认值 # 在VCL中,探针名称为probe_delivery(Varnish需要唯一名称) - name: probe_delivery url: /status interval: 5s timeout: 4s window: 3 threshold: 2 initial: null acl: # 默认VCL配置中需要清除ACL - name: acl_purge entries: - "# localhost" - localhost - 127.0.0.1 - ::1 - "# 私有网络" - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 clusters: # 为集群命名,名称用于轮询调度器 # 请勿使用'backend'或'default',这些是保留关键字 - name: delivery # 单个主机名 # 自动创建指向A记录后所有IP地址的轮询调度器 # 调度器名称为cluster.name,此处为'delivery' address: host.docker.internal:8081 # 或多个主机名 addresses: [host.docker.internal:8081] # 配置根级声明的探针 probe: probe_delivery # 为集群中的每个后端定义后端参数 # 未声明则使用Varnish默认值 maxConnections: null firstByteTimeout: null betweenBytesTimeout: null connectTimeout: null # 启用请求失败时的后台获取 # 默认启用(值为1) fetchRetries: 1 # 在请求哈希并发送到后端前始终删除所有查询字符串 stripQueryString: false, # 启动和文件更改时加载的任何Varnish参数 # 如未提供parameter对象,则使用以下默认值 parameters: feature: +http2,+esi_disable_xml_check default_grace: 86400 default_keep: 3600 default_ttl: 60 backend_idle_timeout: 65 timeout_idle: 60 syslog_cli_traffic: off # 无需完全自定义镜像内置的VCL # 可使用这些钩子,它们会放置在特定位置 hooks: # 也可使用多行字符串 import: | import accept; global: "" vclInit: "" vclRecvStart: "" vclRecvBackendHint: "" vclRecvEnd: "" vclHash: "" vclDeliverStart: "" vclDeliverEnd: "" vclSynthStart: "" vclSynthEnd: ""
使用EJS模板生成Varnish VCL文件。所有配置应存储在/etc/varnish/source目录中,该目录会被监视并在更改时触发重载。
config.json或config.yaml文件以及VCL模板应位于/etc/varnish/source/目录中。构建时,VCL文件会写入/etc/varnish目录(例如/etc/varnish/varnish.vcl)。
yamlvcl: - name: varnish src: varnish.vcl.ejs
在VCL模板中,可完全访问config对象:
<%= config.something || '' %>
支持以下特定包含文件:
探针:
<% for (const probe of config.probes) { %><%- include('probe', probe) %><% } -%>
后端:
<% for (const cluster of config.clusters) { %><%- include('backend', cluster) %><% } -%>
ACL:
<% for (const acl of config.acl) { %><%- include('acl', {"name": "purge", "entries:}) %><% } -%> // 或 <%- include('acl', {"name": "purge", "entries": ["127.0.0.1"]}) %>
调度器:
<% for (const cluster of config.clusters) { %><%- include('director', cluster) -%><% } %>
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像服务
在 Docker Desktop 配置镜像
Docker Compose 项目配置
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
MacOS OrbStack 容器配置
在宝塔面板一键配置镜像
Synology 群晖 NAS 配置
飞牛 fnOS 系统配置镜像
极空间 NAS 系统配置服务
爱快 iKuai 路由系统配置
绿联 NAS 系统配置镜像
QNAP 威联通 NAS 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
免费版仅支持 Docker Hub 访问,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等;免费版仅支持 docker.io。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
来自真实用户的反馈,见证轩辕镜像的优质服务