如何使用 Varnish 设置 Nginx

如何使用 Varnish 设置 Nginx

我想了解如何配置 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 {’。

否则,就正确了。:)

相关内容