Статьи

Лак на передней панели виртуальных хостов WordPress + Apache и Plone CMS

При перемещении некоторых сайтов на новый сервер я обновил конфигурацию сервера кэша Varnish, обслуживающую эту настройку. Вот мои заметки о том, как можно использовать Varnish перед виртуальным хостингом.

Настройка следующая

  • Несколько сайтов размещаются на одном сервере. Сайты представляют собой смесь PHP сайтов Plone.
  • Varnish принимает HTTP-запросы через порт 80 и перенаправляет запрос в соответствующий бэкэнд через HTTP-прокси
  • Наши правила виртуального хоста захватывают доменные имена с или без префикса www, или с любым префиксом имени субдомена
  • Apache работает в нестандартном порту localhost: 81, обслуживающем PHP и WordPress. Правила кеширования WordPress определены в конфигурационном файле Apache <virtualhost>.
  • Каждый сайт Plone работает в своем собственном порту и процессе. Plone использует VirtualHostMonster для переписывания общедоступных URL-адресов сайтов. Заголовки HTTP кэширования Plone устанавливаются аддоном plone.app.caching .
  • Мы проводим обширную очистку файлов cookie для PHP (универсального), WordPress и Plone. Файлы cookie Google Analytics и т. Д. Не разрушают кэш, и мы по-прежнему можем войти в WordPress и Plone с правами администратора.
  • В качестве особой хитрости есть убранная хитрость отладки cookie через заголовки HTTP-ответа
1-IMG_2677

Не волнуйтесь, лак выдерживает небольшие нагрузки

Pros

  • Слишком быстро, как лак
  • При использовании plone.app.caching в Plone не нужно трогать файлы конфигурации, но HTTP-заголовки кэширования Plone можно настраивать через Интернет.

Cons

  • Varnish по умолчанию не имеет возможностей файла конфигурации виртуального хоста в стиле Nginx или Apache, и сделать включение немного сложнее: со многими virtualhost файл конфигурации default.vcl увеличивается.
  • Поскольку WordPress не может выполнять статические ресурсы, которые служат так же умно, как Plone, который имеет уникальные URL-адреса для всех версий статических носителей, вам необходимо вручную удалить Varnish из командной строки, если вы обновляете любые статические медиа-файлы, такие как CSS, JS или изображения.

Пример Varnish /etc/varnish/default.vcl для Varnish 3.0:

#
# This backend never responds... we get hit in the case of bad virtualhost name
#
backend default {
    .host = "127.0.0.1";
    .port = "55555";
}

backend myplonesite {
    .host = "127.0.0.1";
    .port = "6699";
}

#
# Apache running on server port 81
#
backend apache {
    .host = "127.0.0.1";
    .port = "81";
}

#
# Gues which site / virtualhost we are diving into.
# Apache, Nginx or Plone directly
#
sub choose_backend {

    # WordPress site
    if (req.http.host ~ "^(.*\.)?opensourcehacker\.com(:[0-9]+)?$") {
        set req.backend = apache;
    }

    # Example Plone site
    if (req.http.host ~ "^(.*\.)?myplonesite\.fi(:[0-9]+)?$") {
        set req.backend = myplonesite;

        # Zope VirtualHostMonster
        set req.url = "/VirtualHostBase/http/" + req.http.host + ":80/Plone/VirtualHostRoot" + req.url;

    }

}

sub vcl_recv {

    #
    # Do Plone cookie sanitization, so cookies do not destroy cacheable anonymous pages.
    # Also, make sure we do not destroy WordPress admin and login cookies in the proces
    #
    if (req.http.Cookie && !(req.url ~ "wp-(login|admin)")) {
        set req.http.Cookie = ";" + req.http.Cookie;
        set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
        set req.http.Cookie = regsuball(req.http.Cookie, ";(statusmessages|__ac|_ZopeId|__cp|php|PHP|wordpress_(.*))=", "; \1=");
        set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");

        if (req.http.Cookie == "") {
            remove req.http.Cookie;
        }
    }

    call choose_backend;

    if (req.request != "GET" &&
      req.request != "HEAD" &&
      req.request != "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
        /* Non-RFC2616 or CONNECT which is weird. */
        return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        /* We only deal with GET and HEAD by default */
        return (pass);
    }
    if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
    return (lookup);
}

sub vcl_fetch {

    /* Use to see what cookies go through our filtering code to the server */
    /* set beresp.http.X-Varnish-Cookie-Debug = "Cleaned request cookie: " + req.http.Cookie; */

    if (beresp.ttl <= 0s ||
        beresp.http.Set-Cookie ||
        beresp.http.Vary == "*") {
        /*
         * Mark as "Hit-For-Pass" for the next 2 minutes
         */
        set beresp.ttl = 120 s;
        return (hit_for_pass);
    }
    return (deliver);
}

#
# Show custom helpful 500 page when the upstream does not respond
#
sub vcl_error {
  // Let's deliver a friendlier error page.
  // You can customize this as you wish.
  set obj.http.Content-Type = "text/html; charset=utf-8";
  synthetic {"
  <?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  <html>
    <head>
      <title>"} + obj.status + " " + obj.response + {"</title>
      <style type="text/css">
      #page {width: 400px; padding: 10px; margin: 20px auto; border: 1px solid black; background-color: #FFF;}
      p {margin-left:20px;}
      body {background-color: #DDD; margin: auto;}
      </style>
    </head>
    <body>
    <div id="page">
    <h1>Sivu ei ole saatavissa</h1>
    <p>Pahoittelemme, mutta palvelua ei ole saatavilla.</p>
    <hr />
    <h4>Debug Info:</h4>
    <pre>Status: "} + obj.status + {"
Response: "} + obj.response + {"
XID: "} + req.xid + {"</pre>
      </div>
    </body>
   </html>
  "};
  return(deliver);
}

WordPress не поддерживает настройку заголовков HTTP-ответов, как Plone. Мы установили их в файле конфигурации виртуального хоста Apache в / etc / apache2 / sites-enabled:

<VirtualHost 127.0.0.1:81>

    ServerName opensourcehacker.com
    ServerAlias www.opensourcehacker.com
    ServerAdmin [email protected]

    LogFormat       combined
    TransferLog     /var/log/apache2/opensourcehacker.com.log

    # Basic WordPress setup

    Options +Indexes FollowSymLinks +ExecCGI

    DocumentRoot /srv/php/opensourcehacker/wordpress

    <Directory /srv/php/opensourcehacker/wordpress>
        Options FollowSymlinks
        AllowOverride All
    </Directory>

    AddType text/css .css
    AddType application/x-httpd-php .php .php3 .php4 .php5
    AddType application/x-httpd-php-source .phps

    #
    # Set expires headers manually
    #
    ExpiresActive On
    ExpiresByType text/html A0
    ExpiresByType image/gif A3600
    ExpiresByType image/png A3600
    ExpiresByType image/image/vnd.microsoft.icon A3600
    ExpiresByType image/jpeg A3600
    ExpiresByType text/css A3600
    ExpiresByType text/javascript A3600
    ExpiresByType application/x-javascript A3600

</VirtualHost>