前言:
我們在訪問淘寶的時候,會看到代碼中的js和css文件是通過一次請求或得的,我們知道瀏覽器一次請求只能並發訪問數個資源,這樣的處理錯輸在網絡傳輸層面可以大大節省時間,這里使用的技術就是把css、js等靜態資源合並為一個資源。淘寶使用的tengine是基於nginx的web服務器,從11年底開源。所使用的是mod_concat模塊,合並多個文件在一個響應報文中。
http1.1下瀏覽器的並發訪問資源數
IE6 2
IE7 2
IE8 6
Firefox2 2
Firefox3 6
Safari 3,4 4
Chrome 1,2 6
Opera 9.63,10.00alpha 4
一、 CENTOS下安裝使用
安裝nginx concat,由於此模塊只能在linux環境中使用,在開發過程中如何在windows環境下使用在本文下面重點介紹。下面先介紹如何在CentOS中使用,由於此模塊和nginx配合使用,而nginx一般都是由我們自己編譯使用的,所以這里介紹自行編譯方法,關於concat模塊的具體使用技巧,網上很多文章介紹,反而在centos尤其在windows環境下如何搭建環境,至今沒有一篇非常詳細的文章,這也是自己匯總整理的初衷,如果網上有現成的教程,我們自己真的就懶得寫了(我們都是懶人一枚)
1.安裝nginx concat
1 # cd /usr/local/src/ 2 # wget http://nginx.org/download/nginx-1.4.2.tar.gz 3 #wget https://github.com/alibaba/nginx-http-concat/archive/master.zip -O nginx-http-concat-master.zip 4 # unzip nginx-http-concat-master.zip 5 # tar -xzvf nginx-1.4.2.tar.gz 6 # cd nginx-1.4.2 7 vi auto/cc/gcc
#將這句注釋掉 取消Debug編譯模式 大概在174行
#CFLAGS="$CFLAGS -g"
我們再配置下nginx編譯參數
1 ./configure --prefix=/usr/local/app/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --add-module=../nginx-http-concat-master 2 make 3 make install
當然別忘記增加用戶和用戶組
1 #/usr/sbin/groupadd -f www 2 #/usr/sbin/useradd -g www www
至此組件和nginx編譯完成
2.nginx conf調整
Nginx的控制文件有不同的寫法,我的配置文件使用了vhost所以在location段增加如下即可。
1 concat on; 2 concat_max_files 20; 3 concat_unique off; 4 concat_types text/css application/javascript;
例子如下:
1 ## Try the requested URI as files before handling it to PHP. 2 location / { 3 4 ## Regular PHP processing. 5 location ~ \.php$ { 6 root /home/webroot; 7 try_files $uri =404; 8 fastcgi_pass 127.0.0.1:9000; 9 fastcgi_index index.php; 10 fastcgi_split_path_info ^(.+\.php)(.*)$; 11 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 12 include fastcgi_params; 13 #added by james for test 14 fastcgi_buffer_size 128k; 15 fastcgi_buffers 2 256k; # up to 1k + 128 * 1k 16 fastcgi_busy_buffers_size 256k; 17 fastcgi_temp_file_write_size 256k; 18 fastcgi_max_temp_file_size 0; 19 proxy_buffering off; 20 gzip off; 21 22 23 fastcgi_connect_timeout 75; 24 fastcgi_read_timeout 600; 25 fastcgi_send_timeout 600; 26 } 27 28 if ($request_uri ~* "system/dict"){ 29 rewrite ^/(.*)/(.*)/(.*)/(.*)$ /$1/index.php last; break; 30 } 31 if ($request_uri ~* "system/menu"){ 32 rewrite ^/(.*)/(.*)/(.*)/(.*)$ /$1/index.php last; break; 33 } 34 if (!-e $request_filename) { 35 rewrite ^/(.*)/(.*)/(.*)$ /$1/index.php last; break; 36 } 37 38 concat on; 39 concat_max_files 20; 40 concat_unique off; 41 concat_types text/css application/javascript; 42 } # / location
重啟ninx應用即可生效。
#Killall nginx
#nginx
3.頁面寫法
Concat需要使用兩個?來標明作用域,具體的使用細節網上很多文章已經介紹的很詳細了,這也不是本文的重點,這里只是給出一個示例。注意啊,css要在上面啊,不清楚的自己搜索下http請求優化。
1 <link rel="stylesheet" type="text/css" href="/??ui/easyui/themes/icon.css,ui/easyui/themes/default/easyui.css,console/portal/resources/css/style.css"> 2 <script type="text/javascript" src="/ui/easyui/??jquery.min.js,jquery.easyui.min.js"></script>
二、 在windows 下的使用
是不是覺得上面很簡單啊,我也覺得,但是在windows下就悲催了,concat只能在linux環境下,但是現在一般我們的開發環境就是在windows下,調試起來非常不方便,這就需要我們有一個可以在windows 下編譯進去concat模塊的nginx.exe,怎么辦,只能自己編譯了,因為大家實際項目中采用的nginx中的編譯參數千差萬別,不可能從網上下載一個別人編譯好的就能用的。
在windows下我們需要使用cygwin,具體這個軟件如何使用,教程一大把,我們就用它來作為一個linux通向windows的橋梁。
1. 安裝cygwin
從網上可以下載已經集成了一部分組件的軟件或者是自己下載的都行,這里需要注意的是,因為我們在實際使用中,在不同的時候需要不同的組件,因此迫切需要一個類似在CENTOS中的yum中的東西,在cygwin中還真有,叫做apt-cyg
1 lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg 2 install apt-cyg /bin 3 Example use of apt-cyg: 4 apt-cyg install nano
當然apt-cyg還有很多功能,自己apt-cyg –help
2. 在cygwin中編譯nginx
搭建好cygwin環境中,我們看到大部分的操作和linux中操作不大,但是我們一旦用上,會發現很多地方有一些小的差異,比如vi我們的上下鍵和退回鍵完全不生效,產生了一堆莫名其妙的ABCD,我也是嘗試了半天不起作用,沒辦法用了vim,哎還真還用,別糾結vi了用vim,難怪linux中很多人也說vim更好用。
在編譯nginx之前我們需要下載一些包,這些當然是用apt-cyg install了,但是注意一些不能一起安裝,那就一個一個安裝好。
- openssl、pcre、zlib、automake 、bison 、curl-devel 、flex 、libiconv 、libmcrypt-devel 、libtool 、libxml2 、libxml2-devel 、patchutils 、pcre-devel 、jpeg 、libmcrypt 、libpcre-devel、openssl-devel
在安裝的時候如果還提示缺少包,那按照提示安裝對應的包即可。
2.1 下載安裝nginx
1 # cd /usr/local/src/ 2 # wget http://nginx.org/download/nginx-1.4.2.tar.gz 3 #wget https://github.com/alibaba/nginx-http-concat/archive/master.zip -O nginx-http-concat-master.zip 4 # unzip nginx-http-concat-master.zip 5 # tar -xzvf nginx-1.4.2.tar.gz 6 # cd nginx-1.4.2 7 vi auto/cc/gcc 8 #將這句注釋掉 取消Debug編譯模式 大概在174行 9 #CFLAGS="$CFLAGS -g" 10 #我們再配置下nginx編譯參數
以上我們和在centos中完全一樣,但是注意接下來我們在編譯的時候—prefix參數不能指定死,因為如果我們在這里指定類似/usr/local的路徑,那我們只能在cygwin環境中使用了,但是我們是要在windows中使用,這里就必須使用相對地址,也也是為什么后面我們的程序文件不能隨便在windows下的盤符的原因。這里給出我的編譯參數
1 ./configure \ 2 --prefix=. \ 3 --user=www \ 4 --group=www1 \ 5 --with-http_stub_status_module \ 6 --with-http_ssl_module \ 7 --add-module=../nginx-http-concat-master
2.2 用戶和組處理
先不要執行,這里我們使用的用戶www和組www1還沒有建立,但是在cygwin中沒有useadd和groupadd找了很多資料,中文的基本沒有才搞清楚,cygwin是使用的windows的用戶和組,這里我們先在windows中建立用戶www和組www1,為什么組是www1,萬惡的windows竟然不讓組和用戶一個名,不過沒關系
然后在cygwin中執行,就是把windows中的用戶和組同步到cygwin中
1 mkpasswd -l > /etc/passwd 2 mkgroup -l > /etc/group
執行完畢后cat下passwd和group看用戶和組導入進去沒有
2.3 編譯make錯誤處理
這里大家可能會遇到各種問題,我的編譯沒問題在make階段報錯提示ngx_user.c文件中的crypt錯誤,找了很多資料沒有發現大家和我一樣的問題,既然是crypt肯定是加密,檢查了crypt包也安裝了(apt-cyg install crypt),最后直接修改了源碼的c文件把加密的這步省略了,就過去了。
1 原始文件: 2 value = crypt((char *) key, (char *) salt); 3 直接修改為: 4 value = (char *) salt);
3. 使用nginx.exe
我們把編譯好的nginx.exe直接copy到我們的wnmp環境中,替換nginx文件后是不能直接使用的會提示缺少很多dll的,按照提示把這些dll拷貝到和nginx同級的目錄即可,我們的是這些dll
啟動后雖然沒有報錯,但是頁面報404,我們運行nginx.exe –t發現提示連接數錯誤,這里有很多修改辦法,由於開發環境沒有那么多連接數,直接修改nginx.conf修改為64
worker_connections 64;
啟動,OK,運行info.php沒問題,一切正常。但是別高興,后面還有問題,因為我們在windows的開發環境下,我們的配置參數一般都是d:\work\類似的路徑,info.php能運行起來,我們的項目不一定能運行起來,因為我們之前編譯使用的相對路徑,因為../d:\abc實際上是不能運行的。因為我們需要將我們的工程文件放入到html文件中,同時我們對應的配置nginx.conf文件修改對應的工程路徑即可。