Varnish for Wordpress

22 September 2010 #wordpress #varnish

Я уже описывал в статье WordPress Speed Up, что использование кеширующего веб-сервера Varnish позволяет существенно увеличить количество обрабатываемых запросов в секунду. Что позволяет справляться с наплывом посетителей даже слабому серверу.

Однако приходилось использовать конфиг, который был пригоден только для wordpress. И использовать Varnish для другого движка уже не представлялось возможным. При этом использование страниц из кеша составляло примерно 70% от общего числа всех запросов. Что в целом не плохо, но создавалось впечатление, что могло быть и лучше.

Сегодня разговаривал с Дмитрием aka Snupt, он перешел на использование конфигурации Varnish, при которой производится кеширование только статичных файлов (различные медиа файлы, файлы стилей и т.п.), а вся динамика передавалась непосредственно apache для обработки. Я решил попробовать данный вариант.

Файл /etc/varnish/default.vcl изменил на следующий:

 backend default {
     .host = "127.0.0.1";
     .port = "8080";
 }

sub vcl_recv {
# Normalize Content-Encoding
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|lzma|tbz)(\?.*|)$") {
            remove req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            remove req.http.Accept-Encoding;
        }
    }
# Remove cookies and query string for real static files
    if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.*|)$") {
       unset req.http.cookie;
       set req.url = regsub(req.url, "\?.*$", "");
    }
}

Перезапустил Varnish и провел повторный тест с помощью

ab -n 10000 -c 500 http://www.juev.ru/index.php

Число обрабатываемых запросов выросло, незначительно, но все же. При этом нагрузка на процессор почти не ощущается.

Server Software:        nginx/0.7.65
Server Hostname:        www.juev.ru
Server Port:            80

Document Path:          /index.php
Document Length:        0 bytes

Concurrency Level:      500
Time taken for tests:   3.341 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10001
Total transferred:      3850374 bytes
HTML transferred:       0 bytes
Requests per second:    2993.06 [#/sec] (mean)
Time per request:       167.053 [ms] (mean)
Time per request:       0.334 [ms] (mean, across all concurrent requests)
Transfer rate:          1125.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2  30.7      0    3000
Processing:     1   50  59.8     34     650
Waiting:        1   50  59.7     34     650
Total:         28   52  72.3     34    3001

Увеличил число работающих процессов nginx до 4 и получил результат еще лучше:

Server Software:        nginx/0.7.65
Server Hostname:        www.juev.ru
Server Port:            80

Document Path:          /index.php
Document Length:        0 bytes

Concurrency Level:      500
Time taken for tests:   2.226 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10000
Total transferred:      3829990 bytes
HTML transferred:       0 bytes
Requests per second:    4492.28 [#/sec] (mean)
Time per request:       111.302 [ms] (mean)
Time per request:       0.223 [ms] (mean, across all concurrent requests)
Transfer rate:          1680.22 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    7   7.1      6      45
Processing:     2   38  67.6     22     381
Waiting:        2   36  67.3     20     375
Total:          7   46  72.5     28     412

И самое главное! Изменился процент использования кеша:

     10029         0.00        97.37 Client connections accepted
     10029         0.00        97.37 Client requests received
     10005         0.00        97.14 Cache hits
         6         0.00         0.06 Cache misses

О такой эффективности можно было только мечтать. Только 6 запросов было направлено к apache, все остальное бралось из кеша.

Спасибо Дмитрию aka Snupt за столь бесценный опыт!