Назад | Перейти на главную страницу

Как настроить Nginx с Varnish

Я бы хотел посмотреть, как настроить Nginx и Varnish.

Я использую несколько сайтов PHP и сайтов Rack-Sinatra в качестве виртуальных хостов на двух IP. Я бы хотел, чтобы Nginx не обслуживал статические файлы, так как я замечаю некоторые задержки.

редактировать: Я перешел на Nginx, но полученный ответ довольно легко перенести на nginx.

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;
  }
}

Теперь в вашем Apache httpd.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>

Надеюсь, это поможет.

Для удобства будущих читателей, для примера VCL, предоставленный rjk:

  • Я бы использовал «remove» вместо «unset» для переменной HTTP cookie.
  • Объявление подпрограммы 'vcl_fetch {' также должно быть записано как 'sub vcl_fetch {'.

В противном случае - на место. :)