При перемещении некоторых сайтов на новый сервер я обновил конфигурацию сервера кэша 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-ответа
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>