我有一个 Apache 反向代理,它通过 Internet 提供来自另一个站点的内容。用户和代理之间以及代理和原始服务器之间都有一个 SSL 证书。
Apache 基准测试显示,从代理服务器检索网站所花的时间始终是直接从源服务器检索网站的两倍。我想知道可以设置什么缓存来加快速度。
我尝试使用 varnish,但无法解决这个问题。我的代理设置如下:
SSLProxyEngine On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /.well-known !
ProxyPreserveHost On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://freakingips.wpengine.com/
ProxyPassReverse / https://freakingips.wpengine.com/
您可以看到这里的问题是 proxyPass 已经用于指向原始服务器,但是该配置需要用于 varnish 缓存,如下所示:
ProxyPass / http://127.0.0.1:80
所以我想知道如何在这个配置上设置 varnish,或者在这种情况下哪种其他缓存服务可能会更好。
答案1
我喜欢思考请求如何从客户端流经设置的每个部分到最终目的地。
Varnish 不会与后端(代理网站)或客户端通信 HTTPS,因此我认为您应该按照以下方式对每个请求进行设置:
客户端请求https://yours.example.com-> Apache SSL(这是 Varnish 支持 SSL 所必需的)-> Varnish(缓存层)-> Apache http 代理(这将负责从远程服务器获取数据并“剥离” SSL,以便 Varnish 理解数据)
因此,您最终会得到一个具有两个虚拟主机的 Apache 实例,组成上面的“三明治”设置。
1. Apache SSL 终止
这是 Apache 虚拟主机,本质上将代理请求到 Varnish。假设 Varnish 保持在默认端口上(这完全没问题),这里的关键部分是:
ProxyPass / http://127.0.0.1:6081
该虚拟主机监听 SSL 端口 443,因此您将在这里拥有诸如SSLProxyEngine On
证书等内容。
2. 清漆
在你的 VCL 中,你需要设置端口为 80 的后端
3. Apache 远程代理
最后一点很有趣。这是你保存现有指令的地方:
ProxyPass / https://freakingips.wpengine.com/
ProxyPassReverse / https://freakingips.wpengine.com/
但是您不仅需要通过 HTTPS 发送 Apache 代理请求以删除服务器,还需要通过 HTTP 发送该请求。此虚拟主机必须仅支持 http(其中没有 SSL 指令)。
我不是 Apache 专家,所以 Google 可能是你更好的朋友:)这线程似乎表明该ProxyRequests off
指令对于 https 到 http 代理至关重要。
答案2
- 启用“proxy_http”和“headers”模块
sudo a2enmod proxy_http sudo a2enmod headers sudo service apache2 restart
- 设置反向代理虚拟主机配置
ProxyPreserveHost On ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:6081/ RequestHeader set X-Forwarded-Port "443" RequestHeader set X-Forwarded-Proto "https"
- 如果要获取远程 IP 地址,请向虚拟主机添加“RemoteIPHeader”和“RemoteIPInternalProxy”指令。
sudo a2enmod remoteip sudo service apache2 restart
虚拟主机配置:
<VirtualHost *:80> ServerAlias www.sitename.com RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 127.0.0.1/32 ... </VirtualHost>