我正在尝试优化 Nginx 服务器。我已启用 Gzip_Static_Module 来提供预压缩的 gzip 静态文件,例如 CSS、JS、HTML。
Nginx Wiki 表示压缩文件和未压缩文件的时间戳是匹配的。所以,我试图在 Gzip 压缩之前触摸这些文件。
我正在尝试*.gz
使用以下命令触摸并生成这些静态文件:
$ su -c "find . -type f -name "*.css" -size +1024b -exec sh -c "touch {} \
&& gzip -9v < {} > {}.gz" \;"
$ su -c "find . -type f -name "*.js" -size +1024b -exec sh -c "touch {} \
&& gzip -9v < {} > {}.gz" \;"
$ su -c "find . -type f -name "*.html" -size +1024b -exec sh -c "touch {} \
&& gzip -9v < {} > {}.gz" \;"
但我收到“未找到用户 {}”错误。
谁能帮我看看上面的命令有什么问题吗?每当任何未压缩文件的时间戳发生变化时(可能是 Cronjob),是否有更好的方法自动生成 *.gz?
答案1
su -c ...
我认为您遇到了引用问题,因为您尝试执行的命令中包含双引号。您可能想尝试将整个内容括在单引号内。
$ su -c 'find . -type f -name "*.css" -size +1024b -exec sh -c "touch {} && \
gzip -9v < {} > {}.gz" \;'
您还可以转义这些包含的双引号,但这通常会使调试变得混乱,因此我会避免这种情况,但根据您的风格/品味偏好也是另一种选择。
答案2
为什么要在调用之前“触摸”文件gzip
?
来自gzip
的手册页:
Gzip 使用 Lempel-Ziv 编码 (LZ77) 减小指定文件的大小。只要有可能,每个文件都会被扩展名为 .gz 的文件替换,同时保持相同的所有权模式、访问和修改时间。
您根本不必触摸该文件,只需运行:
$ su -c "find . -type f -name \"*.css\" -size +1024b -exec gzip -9vk '{}' \;
我使用了压缩后保留原始文件-k
的选项。gzip
该选项已在 1.6 版本中引入gzip
。
答案3
更简洁的方式:
DIR=/var/www
gzip -rk9 $DIR &&\
find $DIR -not -name '*.gz' -type f -exec touch -r {} {}.gz \;
这会对您的 www 目录中的所有内容(在“最佳”级别)进行 gzip 压缩,然后使用 touch 将 gzip 的 mtime 和 atime 设置为相应源文件的 mtime 和 atime(如Nginx 文档建议)。
答案4
find dist -type f -exec sh -c "gzip < '{}' > '{}'.gz" \;