Есть ли способ сделать предварительное сжатие с распаковкой на лету в nginx?

Модуль предварительного сжатия легко использовать для поиска предварительно сжатой версии страницы в формате.gz и предоставления ее браузерам, которые принимают gzip, чтобы избежать накладных расходов на сжатие на лету, но я хотел бы сделать следующее: удалите несжатую версию с диска и сохраните только сжатую версию, которая, очевидно, будет обслуживаться аналогичным образом, но затем, если пользовательский агент, который не поддерживает gzip, запрашивает страницу, которую я хотел бы, чтобы nginx распаковал, на лету перед передачей Это.

Кто-нибудь делал это или есть другие высокопроизводительные веб-серверы, которые предоставляют эту функциональность?

2 ответа

Лучший способ отправлять статические предварительно сжатые сжатые файлы на Nginx - использовать http_gzip_static_module. Более конкретно в конфигурации вам понадобится:

gzip_static всегда;

http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html

Чтобы иметь возможность обслуживать разархивированную версию файла, т.е. у вас есть только файл.gz на вашем сервере для сохранения на IO, вам нужно использовать http_gunzip_module. В вашем конфиге это выглядит так:

Gunzip на;

http://nginx.org/en/docs/http/ngx_http_gunzip_module.html

Вы также можете быть заинтересованы в ссылках внизу страницы gunzip_module.

PS При предварительном сжатии файлов я бы предложил использовать алгоритм сжатия Google Zopfli, это увеличит время сборки (а не время распаковки), но уменьшит размер файла примерно на 5%. https://code.google.com/p/zopfli/

Одним из вариантов является резервный сервер обратного потока для распаковки файла, например:

gzip_static on;
...
upstream decompresser {
    server localhost:8080; // script which will decompress the file
}

location / {
    try_files $uri @decompress;
}

location @decompress {
    proxy_pass http://decompresser;
}

Другой вариант - использовать встроенный модуль Perl в качестве запасного, а не обратного потока, однако это может привести к блокировке nginx, а длительность операции может снизить производительность.

С вышестоящей моделью вы можете воспользоваться модулем XSendfile от nginx, используя системные настройки по умолчанию. gzip программа для распаковки в файл в каталоге / tmp. Это может сэкономить на издержках распаковки для каждого запроса, позволяя файлу некоторое время зависать.

Другие вопросы по тегам