AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1006660
Accepted
Albert
Albert
Asked: 2020-03-13 04:52:07 +0800 CST2020-03-13 04:52:07 +0800 CST 2020-03-13 04:52:07 +0800 CST

使用 SSL 进行 Web 缓存的建议/建议

  • 772

我一直在为几个网站使用 Varnish Cache。但是,我需要有关实施 HTTPS 的建议。我对 Varnish Cache 的替代品持开放态度。Varnish 的配置相对复杂,所以也许一个不太先进的替代方案更适合我的网站。

Cloudflare 看起来是一个可行的选择,但据我所见,需要一个每月 200 美元起的商业计划。我可能弄错了。

有什么建议吗?

varnish https reverse-proxy cloudflare http-caching
  • 1 1 个回答
  • 365 Views

1 个回答

  • Voted
  1. Best Answer
    Thijs Feryn
    2020-03-13T05:35:28+08:002020-03-13T05:35:28+08:00

    在 Varnish 上使用 HTTPS 并不难。尽管 Varnish 本身并不提供 TLS,但它有助于 TLS 终止。

    2015 年,Varnish 发布了Hitch,这是一个非常强大的 TLS 代理,可以处理终止 TLS 并将未加密的 HTTP 流量转发到 Varnish。

    安装挂钩

    您可以从 Hitch 网站下载源代码并在我们的服务器上进行编译。如果您想使用软件包安装 Hitch,您可以在Debian 或 Ubuntu上运行以下命令:

    apt-get install -y hitch
    

    配置挂钩

    安装 Hitch 后,打开/etc/hitch/hitch.conf并确保使用以下配置:

    frontend = {
        host = "*"
        port = "443"
    }
    
    backend = "[localhost]:8443"
    
    write-proxy-protocol-v2 = on
    
    pem-file = "/etc/hitch/certs/example.com"
    
    ciphersuites = "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"
    
    ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
    
    tls-protos = TLSv1.2 TLSv1.3
    
    ecdh-curve = "X25519:prime256v1:secp384r1"
    
    prefer-server-ciphers = false
    

    请将您的证书放入/etc/hitch/certs并调整 中的pem-file指令hitch.conf。

    重新配置清漆

    您的 Varnish 运行时配置可能包含以下监听信息:

    varnish -a :80
    

    这意味着 Varnish 正在侦听端口 80 上的连接。为了确保 HTTPS 正常工作,我们将添加另一个侦听端口,但具有特定配置:

    varnish -a :80 -a :8443,PROXY
    

    确保在更改运行时设置后重新加载 Varnish。

    您会注意到端口8843现在也分配给了 Varnish。它不用于标准 HTTP,而是用于使用PROXY 协议的 HTTP 。Hitch 中还启用了 PROXY 协议支持。

    这样可以确保将原始客户端 IP 地址传递给 Varnish,而不管它必须经过多少额外的跃点。X-Forwarded-ForVarnish会自动将原始客户端 IP 地址存储在标头中。

    端口处理的流量类型是8443源自 Hitch 的 HTTP 流量,实际上是终止的 HTTPS 流量。

    识别 HTTPS 请求

    Hitch 是一个 TLS 代理,它不理解 HTTP。这意味着它不能设置常规X-Forwarded-Proto标头来指示终止了哪种流量。幸运的是,我们可以跟踪使用了哪个端口。

    下面的 VCL 代码检测 HTTP/HTTPS 请求并分配正确的X-Forwarded-Proto标头。

    vcl 4.0;
    import std;
    sub vcl_recv {
        if (std.port(local.ip) == 8443) {
            set req.http.X-Forwarded-Proto = "https";
        } else {
            set req.http.X-Forwarded-Proto = "http";
        }
    }
    

    许多框架和 CMS 系统利用X-Forwarded-Proto标头自动构建正确的 URL 方案。我们在 VCL 中设置此标头这一事实非常有帮助。

    基于协议的缓存变体

    缓存存储 HTTP 响应,而不是 HTTP 请求。因此,当一个对象存储在缓存中时,Varnish 不知道它是来自 HTTP 还是 HTTPS URL。如果我们在没有额外措施的情况下开始缓存它们,如果 Varnish 开始缓存对象的 HTTP 版本,您最终可能会陷入无限重定向循环。

    为了避免这种情况,Varnish 需要每个协议都有一个缓存变化。您可以通过在后端应用程序中返回以下HTTP 响应标头轻松地指示 Varnish 这样做:

    Vary: X-Forwarded-Proto
    

    如果由于某种原因这是不可能的,您还可以vcl_hash在您的 VCL 代码中扩展逻辑。在这种情况下,请添加以下代码段:

    sub vcl_hash {
      hash_data(req.http.X-Forwarded-Proto);
    }
    
    • 2

相关问题

  • 清漆配置仅缓存未登录用户

  • Varnish 缓存如何处理不同的域?

  • 缩放大文件下载?

  • Gzip 与反向代理缓存

  • 在 Windows XP 主机上使用虚拟化 linux 来宾评估 Varnish 的最简单方法是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve