Среди заявленных нововведений (по сревнению с предыдущей stable веткой):
- кэширование проксированных и FastCGI-серверов;
- директива try_files;
- поддержка выделений в регулярных выражениях в директивах location и server_name и ссылок на эти выделения во всех директивах, поддерживающих переменные, например, в директиве alias;
- два фильтра — XSLT и преобразования изображений;
- предварительная поддержка IPv6;
- nginx/Windows.
Собственно эти двум нововведением и их совместном использовании и будет посвящен дальнейший текст.
Чего хочется? Хочется сследующего:
- ресайзинг изображений не на application-level, а на server-level (в любой момент можно сгенерировать тумбнайл необходимого размера, причем это будет сделано "по запросу")
- контролированое (в разумных по времени пределах) кэширование полученных тумбнайлов на frontend-серверах
- backend-сервер изображений (ресайзит оригинальны)
- frontend-сервер thumbnail'ов (сохраняет у себя в кэше)
http {
proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=thumbnail:10m;
...
# backend dynamic resizing
server {
listen *:80;
server_name i175d.site.domain;
root /var/www/site.domain/public_html/images;
location / {
image_filter_jpeg_quality 95;
image_filter crop 175 120;
}
}
# сервер thumbnail'ов
server {
listen *:80;
server_name i175.site.domain;
location / {
proxy_cache thumbnail;
proxy_cache_valid 60m;
proxy_pass http://i175d.site.domain;
}
}
}
Отдача статического изображения напрямую:#ab -n 1000 -c 100 http://i.site.domain/image_static.jpg
Concurrency Level: 100
Time taken for tests: 0.144 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 13765478 bytes
HTML transferred: 13544630 bytes
Requests per second: 6942.18 [#/sec] (mean)
Time per request: 14.405 [ms] (mean)
Time per request: 0.144 [ms] (mean, across all concurrent requests)
Transfer rate: 93322.66 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 4 1.5 3 8
Processing: 3 10 4.0 9 20
Waiting: 2 7 3.5 6 15
Total: 5 14 4.6 13 25
Ресайзинг без кэширования (закоментированы proxy_cache_valid и proxy_cache):#ab -n 1000 -c 100 http://i175.site.domain/image.jpg
Concurrency Level: 100
Time taken for tests: 13.863 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 13389000 bytes
HTML transferred: 13175000 bytes
Requests per second: 72.13 [#/sec] (mean)
Time per request: 1386.347 [ms] (mean)
Time per request: 13.863 [ms] (mean, across all concurrent requests)
Transfer rate: 943.14 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 8.5 0 32
Processing: 58 1275 602.5 1187 3303
Waiting: 39 1274 602.5 1187 3302
Total: 71 1277 603.2 1189 3303
С вкюченным кэшированием (1-й запуск)#ab -n 1000 -c 100 http://i175.site.domain/image.jpg
Concurrency Level: 100
Time taken for tests: 1.617 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 13367000 bytes
HTML transferred: 13175000 bytes
Requests per second: 618.55 [#/sec] (mean)
Time per request: 161.670 [ms] (mean)
Time per request: 1.617 [ms] (mean, across all concurrent requests)
Transfer rate: 8074.31 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.9 0 8
Processing: 8 160 335.3 20 1502
Waiting: 8 160 335.3 20 1502
Total: 8 160 336.5 20 1506
С включенным кэшироваием (2-й запуск):#ab -n 1000 -c 100 http://i175.site.domain/image.jpg
Concurrency Level: 100
Time taken for tests: 0.151 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 13367000 bytes
HTML transferred: 13175000 bytes
Requests per second: 6601.23 [#/sec] (mean)
Time per request: 15.149 [ms] (mean)
Time per request: 0.151 [ms] (mean, across all concurrent requests)
Transfer rate: 86170.50 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 4 4.0 3 17
Processing: 2 10 4.6 9 21
Waiting: 1 7 3.9 7 19
Total: 5 14 6.3 11 34
Как видно по результатам отдача закэшированного изображения происходит практически с такой же скоростью как и отдача статического файла напрямую. Большим плюсом в такой схеме является то, что nginx сам следит за устареванием кэша и чистит его по истечении заданного в конфиге времени.