2015-07-01 176 views
3

我在Google存储桶中托管公开可用的静态资源,并且我想使用gsutil rsync命令将我们的本地版本同步到存储桶,从而节省了带宽和时间。我们的构建过程的一部分是预先gzip这些资源,但gsutil rsync无法设置Content-Encoding标头。这意味着我们必须运行gsutil rsync,然后立即运行gsutil setmeta以在所有压缩的文件类型上设置标题。这会使存储桶处于不良状态,直到该标题被设置。另一种选择是使用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。这是来自deflate的apache配置:https://httpd.apache.org/docs/current/mod/mod_deflate.html – regretoverflow

+2

我们选择不支持使用rsync命令进行动态压缩,因为正确执行它需要跟踪对象元数据中的预压缩大小和校验和,如果客户端尝试执行多源同步,则可能会导致混淆。基本上,如果你想进行压缩,你需要使用gsutil cp命令。 –

1

我不能完全回答这个问题,但我来到这里,因为我想知道同样的事情,努力实现以下目标:

如何有效地部署一个静态的网站,谷歌云存储

我能找到一个优化的方式从本地文件夹部署我的静态网站向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选项用于递归。

我甚至写了一个脚本,它(在DART):http://tekhoow.blogspot.fr/2016/10/deploying-static-website-efficiently-on.html