Google Pagespeed,自动压缩优化JS/CSS/Image

浏览:3923 发布日期:2015/07/05 分类:技术分享 关键字: Nginx Appache Pagespeed 自动压缩优化JS/CSS/Image
这个周末,把服务器的Nginx升级了下,并加入了Google Pagespeed模块
效果很明显:
页面加载的多个JS、CSS会自动合并压缩处理
发现新版本的Pagespeed能很好的发现处理用户加载的第三方JS库,如jQuery
发现新版本的lazyload_images处理的很好

注意:CSS代码里含有背景图片这类的,要注意下图片的路径改为绝对路径,否则会导致图片引用部分404错误

具体请参考:https://developers.google.com/speed/pagespeed/

我的安装体验过程记录如下给大家分享:

(1)检查下NGINX是否有modules目录,没有则创建下
# mkdir /usr/local/nginx/modules

(2) 下载和解压缩
# cd /usr/local/src

# NPS_VERSION=1.9.32.4

# wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${NPS_VERSION}-beta.zip
# unzip release-${NPS_VERSION}-beta.zip
# cp -a ngx_pagespeed-release-${NPS_VERSION}-beta /usr/local/nginx/modules/
# rm -rf release-${NPS_VERSION}-beta.zip
# rm -rf ngx_pagespeed-release-${NPS_VERSION}-beta

# cd /usr/local/nginx/modules/ngx_pagespeed-release-${NPS_VERSION}-beta/
# wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz
# tar -xzvf ${NPS_VERSION}.tar.gz # extracts to psol/

(3)重新编译 Nginx with support for pagespeed
http://nginx.org/en/download.html
注意:如果已安装Nginx请使用升级脚本(修改增加配置选项)来重新升级编译NGINX

# cd /usr/local/src
# NGINX_VERSION=1.8.0

# wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
# tar -xvzf nginx-${NGINX_VERSION}.tar.gz
# cd nginx-${NGINX_VERSION}/
# ./configure --add-module=/usr/local/nginx/modules/ngx_pagespeed-release-${NPS_VERSION}-beta
# make
# make install

确认下ngx_pagespeed模块已添加到安装的Nginx系统上
# /usr/local/nginx/sbin/nginx -V

(4)创建将由Nginx写入的一个文件缓存目录

$ mkdir /tmp/ngx_pagespeed_cache
$ chown www:www /tmp/ngx_pagespeed_cache
注意:可以将缓存目录的创建及清除工作交个启动任务脚本

(5)修改配置Nginx中的ngx_pagespeed模块
想启用并配置ngx_pagespeed,就要编辑Nginx配置的server部分。


下面是我网站的配置,请参考
common_pagespeed.conf文件是独立文件,在需要开启pagespeed服务的虚拟主机文件中加载此文件(请加载在php rewrite配置之前)
------------------------------------
conf/common_pagespeed.conf;
------------------------------------
# 启用ngx_pagespeed
pagespeed on;
pagespeed FileCachePath /tmp/ngx_pagespeed_cache;
# 禁用CoreFilters
pagespeed RewriteLevel PassThrough;
# 启用压缩空白过滤器
pagespeed EnableFilters collapse_whitespace;
# 启用javascript库卸载
pagespeed EnableFilters canonicalize_javascript_libraries;
# 把多个CSS文件合并成一个CSS文件
pagespeed EnableFilters combine_css;
# 把多个javascript文件合并成一个javascript文件
pagespeed EnableFilters combine_javascript;
# 删除带默认属性的标签
pagespeed EnableFilters elide_attributes;
# 改善资源的可缓存性
#pagespeed EnableFilters extend_cache;
# 更换被导入文件的@import,精简CSS文件
pagespeed EnableFilters flatten_css_imports;
pagespeed CssFlattenMaxBytes 5120;
# 延时加载客户端看不见的图片
pagespeed EnableFilters lazyload_images;
# 启用javascript缩小机制
pagespeed EnableFilters rewrite_javascript;
# 启用图片优化机制
#pagespeed EnableFilters rewrite_images;
# 预解析DNS查询
pagespeed EnableFilters insert_dns_prefetch;
# 重写CSS,首先加载渲染页面的CSS规则
pagespeed EnableFilters prioritize_critical_css;

# And no extraneous headers get set.
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" "";}
location ~ "^/pagespeed_static/" {}
location ~ "^/ngx_pagespeed_beacon$" {}
location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; }
location /ngx_pagespeed_message { allow 127.0.0.1; deny all; }
location /pagespeed_console { allow 127.0.0.1; deny all; }
location ~ ^/pagespeed_admin { allow 127.0.0.1; deny all; }
location ~ ^/pagespeed_global_admin { allow 127.0.0.1; deny all; }
# Add no rewrite if you site set rewrite
if ($request_uri ~ "(pagespeed_([^.]+)/(.*)?)") { break; }
if ($request_uri ~ "(ngx_pagespeed_([^.]+)/(.*)?)") { break; }


注意:ThinkPHP如果启用了rewrite,需要排除下Google Pagespeed 特殊的请求路径
我在测试时,发现开启图片延时加载时,有很多图区启用延迟加载后请求会报404错误,发现请求都被转发交给ThinkPHP处理啦,
解决方式如下在server{rewrite}脚本转发之前添加如下代码,我的一并放入conf/common_pagespeed.conf文件;

if ($request_uri ~ "(pagespeed_([^.]+)/(.*)?)") { break; }
if ($request_uri ~ "(ngx_pagespeed_([^.]+)/(.*)?)") { break; }

注意:如果使用了TP官方麦当苗儿Thinkbox这个JQ插件
你会发现,JS报错,请前端工程师排查了下发现是经过pagespeed自动压缩合并后,includeCss这个机制的问题,前端适当重写了下就OK啦
前端还同时改写了他base.js库,注意js中的命名污染及变量范围,我们网站有几个专题页面,启用后发现JS报错,未启用前OK,最后基本都是这个原因



优化效果如下
自动处理页面加载的CSS文件,这个机制很赞,多个重用度高的外联CSS文件都被合并压缩了,重用度很低的文件直接添加到了html的header头


最佳答案
评论( 相关
后面还有条评论,点击查看>>