nginx js、css多个请求合并为一个请求(concat模块)

凉白开 Nginx747,30615字数 3286阅读10分57秒阅读模式

模块介绍

mod_concat模块由淘宝开发,目前已经包含在tengine中,并且淘宝已经在使用这个nginx模块。不过塔暂时没有包含在nginx中。这个模块类似于apache中的modconcat。如果需要使用它,需要使用两个"?"问号.

来个范例:
http://example.com/??style1.css,style2.css,foo/style3.css
以上将原先3个请求合并为1个请求文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

如果你担心文件被用户的浏览器缓存而没有及时更新,你依旧可以带上一个版本号的参数,如下:
http://example.com/??style1.css,style2.css,foo/style3.css?v=102234文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

1. 安装nginx concat

# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.4.2.tar.gz
# wget https://github.com/alibaba/nginx-http-concat/archive/master.zip -O nginx-http-concat-master.zip
# unzip nginx-http-concat-master.zip
# tar -xzvf nginx-1.4.2.tar.gz
# cd nginx-1.4.2
# ./configure --prefix=/usr/local/nginx-1.4.2 --with-http_stub_status_module \
--add-module=../nginx-http-concat-master
# make
# make install

2. 指令directives

concat on | off
default: concat off
context: http, server, location
开启火关闭concat文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

concat_types MIME types
default: concat_types: text/css application/x-javascript
context: http, server, location
Defines the MIME types which can be concatenated in a given context.
在给定的配置段中可以被合并的MIME文件类型.文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

concat_unique on | off
default: concat_unique on
context: http, server, location
是否只允许同类型文件(相同MIME文件)合并。例如,设置为off,那么js和css文件可以合并。默认情况下,这个值是on,意味着只有相同的类型文件才能合并。文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

如果希望js和css能够合并为一个请求,那么你必须设置concat_unique off,其他类型文件也可以用同样的方式合并.如下为OFF才可以的请求:
http://example.com/static/??foo.css,bar/foobaz.js文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

concat_max_files numberp
default: concat_max_files 10
context: http, server, location
定义一个给定的配置段里面允许合并文件的数量,默认最多10个.不过一定要注意,uri不要超过系统的规定的page size,在linux里面执行getconf PAGESIZE可以获取系统的限制.通常限制是4096字节。文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

concat_delimiter: string
default: NONE
context: http, server, locatione
定义文件分隔符文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

concat_ignore_file_error: on | off
default: off
context: http, server, location
是否忽略文件请求错误,例如404和403等文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

3. 配置nginx

server {

    listen       80;
    server_name  www.ttlsa.com;

    root /data/site/www.ttlsa.com;
    location /static/ {
        concat on;
        concat_max_files 20;
        concat_unique off;
    }
}

4. 测试nginx concat

我的站点有调用到static/ttlsa_concat.css和static/ttlsa_concat.js两个文件,为了提高站点访问速度,我决定使用nginx的concat模块将两个请求合并为一个。
合并前
www.ttlsa.com/static/css/ttsa_concat.css
www.ttlsa.com/static/js/ttsa_concat.js文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

合并后
https://www.ttlsa.com/static??js/ttlsa_concat.js,css/ttlsa_concat.css?ver=123
测试之前,准备一下文件.文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

# cd /data/site/www.ttlsa.com/static
# cat js/ttlsa_concat.js  
// this is js file ttlsa_concat.js
# cat js/a.js             
// this is js file a.js
# cat css/a.css
/** this is css a.css **/
# cat css/ttlsa_concat.css 
/** this is css ttlsa_concat.css **/

4.1 两个css合并文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

# curl https://www.ttlsa.com/static/??css/ttlsa_concat.css,css/a.css
/** this is css ttlsa_concat.css **/
/** this is css a.css *

4.2 两个js合并文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

# curl https://www.ttlsa.com/static/??js/ttlsa_concat.js,js/a.js  
// this is js file ttlsa_concat.js
// this is js file a.js

4.3 js与css合并文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

# curl https://www.ttlsa.com/static/??js/ttlsa_concat.js,css/ttlsa_concat.css
// this is js file ttlsa_concat.js
/** this is css ttlsa_concat.css **/

4.4 带版本号参数文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

# curl https://www.ttlsa.com/static/??css/ttlsa_concat.css,css/a.css?123
/** this is css ttlsa_concat.css **/
/** this is css a.css *

以上仅仅用了两个文件来测试,在具体应用中,大家可以使用多个,具体几个由你的nginx配置来控制. 在具体的环境中,都是以下方式来调用,以下方法摘自官方文档.
js:文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

<script src="??bar1.js,bar22.css,subdir/bar3.js?v=3245" />

以上意思是将ba1.Js,bar22.css和subdir/bar3.js这三个请求合并为一个,并且版本号为3245.文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

css:文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

<link rel="stylesheet" href="??foo1.css,foo2.css,subdir/foo3.css?v=2345" />

这边也是一个道理,只不过只包含css.文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

5. 结束语

减少web请求在一定程度上能减少web服务器的压力,简单的使用nginx concat模块便可以实现这个功能,不过需要前端设计师来使用。如果想减少web请求,又不想让前端设计师来插手的话,大家可以参考下google出的pagespeed模块文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-modules-concat/

6. 参考文章

官方:http://wiki.nginx.org/HttpConcatModule

来源站点:运维生存时间   网址:https://www.ttlsa.com/html/3332.html

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
凉白开
  • 本文由 发表于 09/10/2013 00:29:56
  • 转载请务必保留本文链接:https://www.ttlsa.com/nginx/nginx-modules-concat/
  • concat
  • ngx_http_concat
  • 请求合并
评论  7  访客  6
    • 直播剧
      直播剧 9

      直播剧 http://www.zhiboju.cn

      • liwenjie
        liwenjie 9

        怎么不行,请求不到文件,404

        • 牧童Damian
          牧童Damian 9

          服务端是根据单个文件做缓存的 应该不存在破坏缓存的问题吧

          • 默认
            默认 9

            @Elmar
            可以试试Google的pagespeed模块。

            • Elmar
              Elmar 0

              蛋疼。实用性不高。破坏缓存。比如页面P1应用A,B,C 三个js,而P2引用BCD三个js。在访问P1之后访问P2,本来BC可以直接访问缓存的,合并之后要重新取一遍。如果真的有合并需要的,应该开发者自己合并好了提交到代码库。实在不行,在部署的时候,写个部署脚本,合并一下不是更好?

              • L
                L 9

                貌似不错

              • 来自外部的引用

              评论已关闭!