强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Varnish Cache 运维教程 / 第02章:安装与初始配置

第02章:安装与初始配置

2.1 安装前准备

2.1.1 系统要求

资源最低要求推荐配置
CPU2 核8 核及以上
内存1 GB16 GB 及以上(缓存存储用)
磁盘1 GB 可用空间SSD(日志存储)
操作系统Linux(主流发行版)Ubuntu 22.04 / Debian 12 / RHEL 9
架构x86_64x86_64 / ARM64

2.1.2 端口规划

在安装前,规划好端口使用:

端口用途说明
6081HTTP 代理端口客户端访问端口(默认)
6082管理端口varnishadm 管理接口
80标准 HTTP 端口生产环境通常通过 iptables 转发
443HTTPS 端口由 Hitch 或 Nginx 监听

2.2 Ubuntu / Debian 安装

2.2.1 使用官方仓库安装

# 更新系统包
sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg

# 添加 Varnish 官方 GPG 密钥
curl -fsSL https://packagecloud.io/varnishcache/varnish70/gpgkey | \
    sudo gpg --dearmor -o /usr/share/keyrings/varnish-archive-keyring.gpg

# 添加 Varnish 7.x 仓库(以 Ubuntu 22.04 Jammy 为例)
echo "deb [signed-by=/usr/share/keyrings/varnish-archive-keyring.gpg] \
    https://packagecloud.io/varnishcache/varnish70/ubuntu/ jammy main" | \
    sudo tee /etc/apt/sources.list.d/varnish.list

# 更新并安装
sudo apt-get update
sudo apt-get install -y varnish

# 验证安装
varnishd -V

2.2.2 使用系统默认仓库

# Ubuntu/Debian 默认仓库通常包含较旧但稳定的版本
sudo apt-get update
sudo apt-get install -y varnish

# 检查版本
varnishd -V

2.2.3 安装相关工具

# 安装 TLS 终结代理(推荐)
sudo apt-get install -y hitch

# 安装日志轮转
sudo apt-get install -y logrotate

2.3 RHEL / CentOS / Fedora 安装

2.3.1 使用官方仓库

# 添加 Varnish 7.x 仓库(以 RHEL 9 为例)
sudo cat > /etc/yum.repos.d/varnish.repo << 'EOF'
[varnish70]
name=Varnish Cache 7.0 for Enterprise Linux 9
baseurl=https://packagecloud.io/varnishcache/varnish70/el/9/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/varnishcache/varnish70/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOF

# 安装 Varnish
sudo dnf install -y varnish

# 验证安装
varnishd -V

2.3.2 使用 EPEL 仓库

# 安装 EPEL 仓库
sudo dnf install -y epel-release

# 安装 Varnish
sudo dnf install -y varnish

# 验证
varnishd -V

2.4 源码编译安装

2.4.1 安装编译依赖

# Ubuntu/Debian
sudo apt-get install -y \
    build-essential \
    libpcre3-dev \
    libedit-dev \
    libncurses-dev \
    libjemalloc-dev \
    python3 \
    python3-sphinx \
    automake \
    autoconf \
    libtool \
    pkg-config \
    git

# RHEL/CentOS
sudo dnf install -y \
    gcc \
    make \
    pcre-devel \
    libedit-devel \
    ncurses-devel \
    jemalloc-devel \
    python3 \
    python3-sphinx \
    automake \
    autoconf \
    libtool \
    pkgconfig \
    git

2.4.2 编译安装

# 克隆源码
git clone https://github.com/varnishcache/varnish-cache.git
cd varnish-cache

# 查看可用标签并切换到稳定版
git tag -l | grep "varnish-7"
git checkout varnish-7.5.1

# 生成配置脚本
./autogen.sh

# 配置编译选项
./configure \
    --prefix=/usr/local/varnish \
    --enable-jemalloc \
    --with-jemalloc=/usr/lib/x86_64-linux-gnu/libjemalloc.so

# 编译(使用多核加速)
make -j$(nproc)

# 安装
sudo make install

# 验证
/usr/local/varnish/sbin/varnishd -V

2.4.3 创建系统服务

# 创建软链接
sudo ln -s /usr/local/varnish/sbin/varnishd /usr/local/bin/varnishd
sudo ln -s /usr/local/varnish/bin/* /usr/local/bin/

# 创建 varnish 用户
sudo useradd -r -s /sbin/nologin varnish

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/varnish.service << 'EOF'
[Unit]
Description=Varnish HTTP Accelerator
Documentation=https://varnish-cache.org/docs/
After=network-online.target

[Service]
Type=forking
User=varnish
Group=varnish
LimitNOFILE=131072
LimitMEMLOCK=85983232
ExecStartPre=/usr/local/bin/varnishd -C -f /etc/varnish/default.vcl
ExecStart=/usr/local/bin/varnishd \
    -a :6081 \
    -T localhost:6082 \
    -f /etc/varnish/default.vcl \
    -s malloc,256m \
    -p thread_pool_min=5 \
    -p thread_pool_max=500 \
    -p thread_pool_timeout=120
ExecReload=/usr/local/bin/varnishadm vcl.load reload /etc/varnish/default.vcl
ExecReload=/usr/local/bin/varnishadm vcl.use reload
ExecStop=/usr/local/bin/varnishadm stop
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload

2.5 初始配置

2.5.1 默认配置文件

Varnish 的主配置文件位于 /etc/varnish/default.vcl

# 备份原始配置
sudo cp /etc/varnish/default.vcl /etc/varnish/default.vcl.bak

# 查看默认配置
cat /etc/varnish/default.vcl

2.5.2 最小化配置

创建一个最基础可用的 VCL 配置:

# /etc/varnish/default.vcl - 最小化配置

vcl 4.1;

# 后端服务器定义
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

# 请求接收处理
sub vcl_recv {
    # 默认使用缓存查找
    # 不缓存 POST/PUT/DELETE 等方法
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);
    }

    # 不缓存管理后台
    if (req.url ~ "^/admin") {
        return (pass);
    }

    return (hash);
}

# 缓存命中处理
sub vcl_hit {
    return (deliver);
}

# 缓存未命中处理
sub vcl_miss {
    return (fetch);
}

# 后端响应处理
sub vcl_backend_response {
    # 设置默认缓存时间
    if (beresp.ttl <= 0s) {
        set beresp.ttl = 300s;
    }

    # 启用 Grace 机制
    set beresp.grace = 1h;
}

# 响应发送前处理
sub vcl_deliver {
    # 添加缓存状态头部
    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";
    }
}

2.5.3 配置后端服务器

单后端配置

vcl 4.1;

backend web01 {
    .host = "192.168.1.10";
    .port = "80";
    .connect_timeout = 5s;
    .first_byte_timeout = 30s;
    .between_bytes_timeout = 10s;
    .max_connections = 300;
    .probe = {
        .url = "/health";
        .timeout = 3s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

多后端配置

vcl 4.1;

backend web01 {
    .host = "192.168.1.10";
    .port = "80";
    .probe = {
        .url = "/health";
        .timeout = 3s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

backend web02 {
    .host = "192.168.1.11";
    .port = "80";
    .probe = {
        .url = "/health";
        .timeout = 3s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

sub vcl_recv {
    # 根据 URL 选择后端
    if (req.url ~ "^/api/") {
        set req.backend_hint = web02;
    } else {
        set req.backend_hint = web01;
    }
}

2.6 启动参数详解

2.6.1 varnishd 命令行参数

varnishd \
    -a :6081 \                    # 监听地址和端口
    -T localhost:6082 \           # 管理接口地址和端口
    -f /etc/varnish/default.vcl \ # VCL 配置文件
    -s malloc,256m \              # 存储引擎和大小
    -p thread_pool_min=5 \        # 最小线程数
    -p thread_pool_max=500 \      # 最大线程数
    -p thread_pool_timeout=120 \  # 线程超时时间
    -n /var/lib/varnish \         # 工作目录
    -P /var/run/varnishd.pid      # PID 文件

2.6.2 关键启动参数

参数说明默认值
-a address:portHTTP 监听地址:6081
-T address:port管理接口地址localhost:6082
-f fileVCL 配置文件路径
-s kind,size存储引擎配置malloc,256m
-n dir工作目录/var/lib/varnish/[hostname]
-p param=value设置运行参数
-P filePID 文件路径
-j jail沙箱机制unix,user=varnish
-l bytes共享内存日志大小80m
-w min,max线程池大小(旧语法)

2.6.3 重要运行参数

# 查看当前所有参数
varnishadm param.show

# 查看特定参数
varnishadm param.show thread_pool_min

# 设置参数(临时,重启失效)
varnishadm param.set thread_pool_min 10

# 在启动时设置参数
varnishd -p thread_pool_min=10 -p thread_pool_max=500

线程相关参数

参数说明推荐值
thread_pool_min每个线程池最小线程数5-10
thread_pool_max每个线程池最大线程数500
thread_pool_timeout空闲线程回收超时120s
thread_pools线程池数量2(通常等于 CPU 核数的一半)
thread_queue_limit线程队列限制20

缓存相关参数

参数说明默认值
default_ttl默认 TTL120s
max_restarts最大重试次数4
max_retries最大后端重试4
workspace_client客户端工作空间64k
workspace_backend后端工作空间64k

2.6.4 存储引擎配置

# 内存存储(推荐)
-s malloc,256m          # 256MB 内存
-s malloc,1G            # 1GB 内存

# 文件存储
-s file,/var/lib/varnish/varnish_storage.bin,1G

# 使用持久存储(实验性)
-s stevedore_name=/path/to/storage,1G

2.7 启动与管理

2.7.1 systemd 服务管理

# 启动 Varnish
sudo systemctl start varnish

# 停止 Varnish
sudo systemctl stop varnish

# 重启 Varnish
sudo systemctl restart varnish

# 重载配置(不中断服务)
sudo systemctl reload varnish

# 查看状态
sudo systemctl status varnish

# 设置开机启动
sudo systemctl enable varnish

# 查看日志
sudo journalctl -u varnish -f

2.7.2 验证安装

# 检查 Varnish 进程
ps aux | grep varnishd

# 检查端口监听
ss -tlnp | grep 6081

# 发送测试请求
curl -I http://localhost:6081/

# 查看缓存状态
curl -sI http://localhost:6081/ | grep -i "x-cache"

# 使用 varnishadm 连接管理接口
varnishadm

2.7.3 常见问题

端口被占用

# 查找占用 6081 端口的进程
sudo lsof -i :6081
sudo fuser -k 6081/tcp

# 或者更改 Varnish 监听端口
# 修改 /etc/default/varnish(Debian)或 /etc/varnish/varnish.params(RHEL)

权限问题

# 确保 Varnish 用户有权访问配置文件
sudo chown -R varnish:varnish /etc/varnish/
sudo chown -R varnish:varnish /var/lib/varnish/

# 检查 SELinux 策略(RHEL/CentOS)
sudo setsebool -P httpd_can_network_connect on

配置语法错误

# 在启动前验证 VCL 配置
sudo varnishd -C -f /etc/varnish/default.vcl

# 通过 varnishadm 测试新配置
varnishadm vcl.load test /etc/varnish/default.vcl
varnishadm vcl.use test

2.8 防火墙配置

2.8.1 iptables

# 允许 Varnish HTTP 端口
sudo iptables -A INPUT -p tcp --dport 6081 -j ACCEPT

# 允许管理端口(仅限本机)
sudo iptables -A INPUT -p tcp --dport 6082 -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6082 -j DROP

# 生产环境:将 80 端口转发到 6081
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 6081

2.8.2 firewalld(RHEL/CentOS)

# 允许 Varnish 端口
sudo firewall-cmd --permanent --add-port=6081/tcp
sudo firewall-cmd --reload

2.8.3 ufw(Ubuntu)

# 允许 Varnish 端口
sudo ufw allow 6081/tcp
sudo ufw reload

2.9 生产环境部署清单

# 部署检查清单
# [ ] 系统更新完成
# [ ] Varnish 版本确认
# [ ] 后端服务器配置正确
# [ ] VCL 配置语法验证通过
# [ ] 端口规划确认
# [ ] 防火墙规则配置
# [ ] TLS 代理(Hitch/Nginx)配置
# [ ] 日志轮转配置
# [ ] 监控脚本部署
# [ ] 系统服务设置开机启动
# [ ] 压力测试通过
# [ ] 缓存预热计划准备

2.10 注意事项

重要

  1. 生产环境中不要将管理端口(6082)暴露给外部网络
  2. 存储大小应根据可用内存合理设置,预留系统所需内存
  3. 建议使用 -j unix,user=varnish 启用沙箱安全机制
  4. 配置变更后建议先使用 varnishd -C -f 验证语法再重启
  5. 日志共享内存大小(-l 参数)根据日志量调整

2.11 扩展阅读