Linux—Tomcat服务器&Varnish代理服务器

Linux 上配置 Varnish 作为 Tomcat 服务器的反向代理

Varnish 是一款高性能的 HTTP 加速器和反向代理缓存服务器,常用于前端缓存动态内容(如 Java Web 应用),减少 Tomcat 的负载。Tomcat 是 Java 应用的容器,通常运行在 8080 端口。Varnish 可以直接代理 Tomcat(通过 HTTP),比通过 Apache + mod_jk 更简单高效,尤其在缓存命中时性能提升显著。

1. 基本架构

  • Varnish:监听公共端口(如 80 或 443 前需 SSL 终止),作为入口。
  • Tomcat:运行在后端端口(如 8080),处理动态内容。
  • 典型部署:Varnish 在前端(端口 80),Tomcat 在本地或远程的 8080 端口。
  • 注意:Varnish 不原生支持 SSL,如果需要 HTTPS,通常在前加 Nginx 或 Pound 处理 SSL 终止,然后转发到 Varnish。

2. 安装步骤(以 Ubuntu/CentOS 示例)

安装 Tomcat(假设单机部署):

  • 下载 Tomcat(例如 apache-tomcat-10.x.tar.gz)。
  • 解压到 /opt/tomcat,启动 ./bin/startup.sh
  • 默认监听 8080 端口,确保应用部署在 webapps 下。

安装 Varnish

  • Ubuntu:添加官方仓库后 apt install varnish
  • CentOS/RHEL:yum install epel-releaseyum install varnish
  • 最新版建议从 varnish-cache.org 下载源代码编译。

3. 配置 Varnish 代理 Tomcat

修改 Varnish 监听端口(让 Varnish 占 80 端口):

  • 编辑 /etc/varnish/varnish.params/etc/default/varnish(旧版):
  VARNISH_LISTEN_PORT=80
  • 或在 systemd 服务中调整:-a :80

配置 VCL 文件/etc/varnish/default.vcl):
基本配置(单后端 Tomcat):

vcl 4.0;  # 或 4.1,视版本而定

import directors;  # 如果需要负载均衡多 Tomcat

backend tomcat {
    .host = "127.0.0.1";  # Tomcat 主机 IP,如果远程改成对应 IP
    .port = "8080";       # Tomcat HTTP 端口
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    .probe = {            # 可选:健康检查
        .url = "/";       # 检查根路径
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

sub vcl_recv {
    set req.backend_hint = tomcat;

    # 不缓存动态内容(如登录、POST),直接 pass 到 Tomcat
    if (req.method == "POST" || req.url ~ "\.(jsp|do|action)$" || req.url ~ "^/admin") {
        return (pass);
    }

    # 处理 Cookie:Java Session 常使用 Cookie,避免缓存带 Session 的页面
    if (req.http.Cookie ~ "JSESSIONID") {
        return (pass);
    }

    # 移除不必要的 Cookie
    unset req.http.Cookie;
}

sub vcl_backend_response {
    # 移除 Set-Cookie 如果不想缓存带 Session 的响应(慎用,根据应用调整)
    # unset beresp.http.Set-Cookie;

    # 设置缓存时间(静态资源长缓存,动态短缓存)
    if (bereq.url ~ "\.(jpg|png|css|js)$") {
        set beresp.ttl = 1d;  # 静态文件缓存 1 天
    } else {
        set beresp.ttl = 10m; # 动态页面短缓存
    }
}

sub vcl_deliver {
    # 添加缓存命中标志(调试用)
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
}
  • 重启 Varnish:systemctl restart varnish

4. Java 应用特定注意事项

  • Session 管理:Tomcat 默认使用 JSESSIONID Cookie。如果页面依赖 Session,Varnish 缓存会造成 Session 丢失。解决方案:
  • 在 VCL 中检测 Cookie 并 return (pass);(不缓存)。
  • 或在应用中设置响应头 Cache-Control: no-cache
  • 静态资源:CSS/JS/图片等可安全长缓存,提升性能。
  • X-Forwarded-For:Varnish 默认添加,Tomcat 可通过 Valve 配置获取真实客户端 IP。
  • 多 Tomcat 负载均衡:使用 directors.round-robin;directors.random; 定义多个 backend。

5. 测试与优化

  • 访问 http://your-server-ip,应看到 Tomcat 应用。
  • curl -I 检查 X-Cache: HIT/MISS
  • 监控:varnishstatvarnishlog
  • 如果应用是动态 Java(如 Spring Boot),缓存命中率取决于静态内容比例,通常 20%+ 即可显著加速。

6. HTTPS 支持

Varnish 不处理 SSL,推荐:

  • Nginx 前置:Nginx 监听 443(SSL),代理到 Varnish 80。
  • 或 Hitch/Pound 作为 SSL 终止器。

这种配置简单高效,许多生产环境直接用 Varnish + Tomcat,而非加 Apache 中间层。如果有具体错误或应用细节,可进一步调整 VCL。

文章已创建 3707

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部