【问题标题】:Varnish and SSL with Pound用磅清漆和 SSL
【发布时间】:2014-03-04 22:43:16
【问题描述】:

我的 Varnish 服务器设置如下:

backend web1 {.host = "XXX.XXX.XXX.XXX"; .port = "80";}
backend web2 {.host = "XXX.XXX.XXX.XXX"; .port = "80";}
backend web3 {.host = "XXX.XXX.XXX.XXX"; .port = "80";}

backend web1_ssl {.host = "XXX.XXX.XXX.XXX"; .port = "443";}
backend web2_ssl {.host = "XXX.XXX.XXX.XXX"; .port = "443";}
backend web3_ssl {.host = "XXX.XXX.XXX.XXX"; .port = "443";}

director default_director round-robin {
  { .backend = web1; }
  { .backend = web2; }
  { .backend = web3; }
}

director ssl_director round-robin {
  { .backend = web1_ssl; }
  { .backend = web2_ssl; }
  { .backend = web3_ssl; }
}

# Respond to incoming requests.
sub vcl_recv {
# Set the director to cycle between web servers.
set req.grace = 120s;

if (req.http.X-Forwarded-Proto == "https" ) {
   set req.http.X-Forwarded-Port = "443";
   set req.backend = ssl_director;
} else {
   set req.http.X-Forwarded-Port = "80";
   set req.http.X-Forwarded-Proto = "http";
   set req.backend = default_director;
 }

 ...
}

如果我在浏览器中点击我的 IP 地址(不带 SSL),这将非常有效,但如果我启用 Pound(如下配置):

ListenHTTPS
    Address XXX.XXX.XXX.XXX #Local IP of the VarnishWebServer
    Port 443
    Cert "/etc/apache2/ssl/apache.pem"
    AddHeader "X-Forwarded-Proto: https"
    HeadRemove "X-Forwarded-Proto"
    Service
            BackEnd
                    Address 127.0.0.1
                    Port 80
            End
    End

结束

我每次尝试访问本地 IP 地址时都会收到 503(来自 varnishlog -0):

   11 RxURL        c /favicon.ico
   11 RxProtocol   c HTTP/1.1
   11 RxHeader     c Host: XXX.XXX.XXX (Varnish Server IP Address)
   11 RxHeader     c Connection: keep-alive
   11 RxHeader     c Accept: */*
   11 RxHeader     c User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
   11 RxHeader     c Accept-Encoding: gzip,deflate,sdch
   11 RxHeader     c Accept-Language: en-US,en;q=0.8
   11 RxHeader     c X-Forwarded-Proto: https
   11 RxHeader     c X-SSL-cipher: DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
   11 RxHeader     c X-Forwarded-For: XXX.XXX.XXX.XXX (My Local machine IP)
   11 VCL_call     c recv lookup
   11 VCL_call     c hash
   11 Hash         c /favicon.ico
   11 Hash         c 198.61.252.81
   11 VCL_return   c hash
   11 VCL_call     c miss fetch
   11 Backend      c 14 ssl_director web2_ssl
   11 FetchError   c http read error: -1 0 (Success)
   11 VCL_call     c error deliver
   11 VCL_call     c deliver deliver
   11 TxProtocol   c HTTP/1.1
   11 TxStatus     c 503
   11 TxResponse   c Service Unavailable
   11 TxHeader     c Server: Varnish
   ...
   11 ReqEnd       c 1175742305 1391779282.930887222 1391779282.934647560 0.000097752 0.003678322 0.000082016
   11 SessionClose c error

我查看了我的 http 侦听器,我看到了这个:

 root@machine:/etc/apache2/ssl# lsof -i -n|grep http
 pound     7947 www-data    5u  IPv4  63264      0t0  TCP XXX.XXX.XXX.XXXX:https (LISTEN)
 pound     7948 www-data    5u  IPv4  63264      0t0  TCP XXX.XXX.XXX.XXXX:https (LISTEN)
 varnishd  8333   nobody    7u  IPv4  64977      0t0  TCP *:http (LISTEN)
 varnishd  8333   nobody    8u  IPv6  64978      0t0  TCP *:http (LISTEN)
 varnishd  8333   nobody   13u  IPv4  65029      0t0  TCP XXX.XXX.XXX.XXXX:37493-   >YYYY.YYYY.YYYY.YYYY3:http (CLOSE_WAIT)
 apache2  19433     root    3u  IPv4  31020      0t0  TCP *:http-alt (LISTEN)
 apache2  19438 www-data    3u  IPv4  31020      0t0  TCP *:http-alt (LISTEN)
 apache2  19439 www-data    3u  IPv4  31020      0t0  TCP *:http-alt (LISTEN)
 pound    19669 www-data    5u  IPv4  31265      0t0  TCP 127.0.0.1:https (LISTEN)
 pound    19670 www-data    5u  IPv4  31265      0t0  TCP 127.0.0.1:https (LISTEN)

其中 XXX.XXX.XXX.XXX 是 varnish 的 WebServer 的内部 IP 地址,YYYY.YYYY.YYYY.YYY 是 VCL 中定义的后端系统之一的 IP 地址。

知道为什么我总是收到 503 吗?

更新

如前所述,Varnish 不支持 SSL,因此使用 Pound 可以将流量从 443 转移到 80,但是当它完成时 - 它不能使用端口 443 (ssl_directector) 来服务流量。删除 ssl_director 并将 default_director 设为主要,效果很好。

【问题讨论】:

  • 看起来您正试图让 varnish 连接到 SSL 后端(web1_ssl 等)。自从我上次使用 Varnish 已经有一年左右的时间了,但我认为它不支持 SSL(这就是为什么你首先在前端使用 Pound)。
  • 是的 - butt Pound,接受 SSL 连接,解密它,传递到端口 80 上的 Varnish。所以基本上 - 你的意思是摆脱 ssl 块并让它正常访问 http?
  • 是的,因为 varnish 不会说 ssl。所以如果你把它指向一个 SSL 后端,它会尝试正常的 http,连接会中断,你会得到一个 503 错误。

标签: apache varnish varnish-vcl


【解决方案1】:

Varnish 的后端请求不支持 HTTPS - Varnish 和 Apache 之间的任何通信都必须是纯 HTTP。

我发现最好的方法是将 Apache 配置为在端口 443 上使用纯 HTTP。这允许 Apache 生成正确的 URL,例如在需要重定向浏览器时。

您可以按照以下方式进行配置:

# Listen on port 443, but speak plain HTTP
Listen X.X.X.X:443 http

# Setting HTTPS=on is helpful for ensuring correct behavior of scripting
# languages such as PHP
SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on

<VirtualHost X.X.X.X:443>
    # Specifying "https://" in the ServerName ensures that whenever
    # Apache generates a URL, it uses "https://your.site.com/" instead
    # of "http://your.site.com:443/"
    ServerName https://your.site.com
</VirtualHost>

您当然需要从 Apache 配置中删除任何 mod_ssl 指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-05
    • 2015-08-01
    • 2019-05-02
    • 2019-01-30
    • 2018-05-11
    • 2012-07-20
    • 2011-07-31
    • 2011-09-28
    相关资源
    最近更新 更多