2015-07-01 3 views
3

Я размещаю общедоступные статические ресурсы в ковше хранилища google, и я хочу использовать команду gsutil rsync для синхронизации нашей локальной версии с ведром, экономя пропускную способность и время. Часть нашего процесса сборки состоит в том, чтобы предварительно загрузить эти ресурсы, но gsutil rsync не имеет возможности установить заголовок Content-Encoding. Это означает, что мы должны запустить gsutil rsync, а затем сразу запустите gsutil setmeta, чтобы установить заголовки для всех типов файлов gzipped. Это оставляет ведро в состоянии BAD до тех пор, пока этот заголовок не будет установлен. Другой вариант - использовать gsutil cp, передавая параметр -z, но это требует от нас повторной загрузки всей структуры каталога каждый раз, и это включает в себя множество файлов изображений и других ресурсов без gzip, которые теряют время и пропускную способность.gsutil rsync с сжатием gzip

Есть ли атомный способ выполнить rsync и установить правильные заголовки Content-Encoding?

ответ

4

Предполагая, что вы начинаете с сжат GZIP исходных файлов в исходном-каталог вы можете сделать:

gsutil -h content-encoding:gzip rsync -r source-dir gs://your-bucket 

Примечание: Если вы сделаете это, а затем запустить Rsync в обратном направлении он будет распаковывать и копировать все объекты назад:

gsutil rsync -r gs://your-bucket source-dir 

, который может и не быть тем, что вы хотите. В принципе, самый безопасный способ использования rsync - просто синхронизировать объекты как есть между источником и получателем, а не пытаться устанавливать кодировки содержимого на объекты.

+0

Проблемы есть только текст на основе файлы сжаты, как CSS, JS, HTML и т.д. – regretoverflow

+0

Есть атомный способ сделать это на основе на расширение файла? Я действительно не вижу возможности. Что было бы хорошим дополнением к gsutil rsync, так это передать список расширений файлов, к которым может применяться заголовок во время rsync. Например, единственными файлами, которые обычно кодируются gzip, являются html, css, js, json, xml, svg, txt. Это из конфигурации apache для дефляции: https://httpd.apache.org/docs/current/mod/mod_deflate.html – regretoverflow

+2

Мы решили не поддерживать сжатие «на лету» с помощью команды rsync, потому что для правильного выполнения этого потребовалось бы отслеживание предварительно сжатого размера и контрольной суммы (ов) в метаданных объекта и может привести к запутанным ситуациям, если клиенты попытаются выполнить синхронизацию с несколькими источниками. В принципе, если вы хотите сжимать «на лету», вам нужно использовать команду gsutil cp. –

1

Я не полностью ответить на вопрос, но я пришел сюда, как мне было интересно, то же самое, пытаясь достичь следующего:

как эффективно развернуть статический сайт на Google Облако хранения

я смог найти оптимизированный способ для развертывания мой статический веб-сайт из локальной папки в Gs ведро

  • Разделить мою локальную папку, в 2 папки с той же иерархии, один, содержащий содержимое, чтобы быть GZIP (HTML, CSS, JS ...), другие остальные файлы
  • Gzip каждый файл в моей папке GZIP (на месте)
  • Вызов GSUtil RSync в течение каждая папка с тем же Gs назначения

конечно, это только один способ синхронизации и удаленные локальные файлы не удаляются удаленно

для папки GZIP команда

gsutil -m -h Content-Encoding:gzip rsync -c -r src/gzip gs://dst 

заставляя кодировку содержимого быть gzippped

Для другой папки команда

gsutil -m rsync -c -r src/none gs://dst 

опция -m используется для параллельной оптимизации. Опция -c необходима для принудительного использования проверки контрольной суммы (Why is gsutil rsync re-downloading all our files?), поскольку я касался каждого локального файла в моем процессе сборки. параметр -r используется для рекурсии.

Я даже написал сценарий для него (в дротике): http://tekhoow.blogspot.fr/2016/10/deploying-static-website-efficiently-on.html

Смежные вопросы