Есть ли способ сделать предварительное сжатие с распаковкой на лету в 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. Это может сэкономить на издержках распаковки для каждого запроса, позволяя файлу некоторое время зависать.