我想了解如何配置 Nginx 和 Varnish。
我在两个 IP 上以虚拟主机的形式运行多个 PHP 站点和 Rack-Sinatra 站点。我想防止 Nginx 提供静态文件,因为我注意到了一些延迟。
编辑:我已经改用Nginx了,但是提供的答案很容易移植到nginx。
答案1
Apache 仍将提供静态文件,但仅提供静态文件一次。也许最简单的方法是配置 varnish 监听所有 IP 地址的 80 端口,并配置 Apache 监听localhost:8000
。然后配置 varnish 转发它收到的所有请求,localhost:8000
以便 Apache 处理。
我将采用以下清漆配置:
# have varnish listen on port 80 (all addresses)
varnishd -a 0.0.0.0:80
现在在您的vcl
文件中:
backend default {
.host = "localhost";
.port = "8000";
}
sub vcl_recv {
# add a unique header containing the client IP address
set req.http.X-Orig-Forwarded-For = client.ip;
# we're only handling static content for now so remove any
# Cookie that was sent in the request as that makes caching
# impossible.
if (req.url ~ "\.(jpe?g|png|gif|ico|js|css)(\?.*|)$") {
unset req.http.cookie;
}
}
vcl_fetch {
# if the backend server adds a cookie to all responses,
# remove it from static content so that it can be cached.
if (req.url ~ "\.(jpe?g|png|gif|ico|js|css)(\?.*|)$") {
unset obj.http.set-cookie;
}
}
现在,在您的 Apachehttpd.conf
配置中,您希望 Apache 监听localhost:8000
并在相同的地址:端口上定义您的虚拟主机
Listen 127.0.0.1:8000
NameVirtualHost 127.0.0.1:8000
为每个网站创建一个<VirtualHost>
节。在该节中,您需要告诉 Apache 在所有静态内容上设置Expires
和缓存控制标头,以便 Varnish 知道缓存它。
<VirtualHost 127.0.0.1:8000>
ServerName www.our-example-domain.com
# Set expires and cache-control headers on static content and
# tell caches that the static content is valid for two years
ExpiresActive on
<FilesMatch "\.(js|css|ico|gif|png|jpe?g)$">
ExpiresDefault "access plus 2 year"
Header append Cache-Control "public"
</FilesMatch>
# ... the rest of your web site configuration ...
</VirtualHost>
我希望这有帮助。
答案2
为了未来读者的利益,对于 rjk 提供的 VCL 示例:
- 对于 HTTP cookie 变量,我会使用“remove”而不是“unset”。
- 子程序声明‘vcl_fetch {’也应该写为‘sub vcl_fetch {’。
否则,就正确了。:)