網頁性能優化相關資料:php
https://developer.yahoo.com/performance/rules.html#page-navcss
前端技術的逐漸成熟,還衍生了domain hash, cookie free, css sprites, js/css combine, max expires time, loading images on demand等等技術。這些技術的出現和大量使用都和併發資源數有關。html
當瀏覽器加載 HTML 文件中引用的靜態資源 —— 如圖片、外部 CSS、外部 JS 等 —— 時,若該資源所屬域與當前頁面相同,則會在 HTTP 頭請求中加載當前域的 cookie 信息。前端
下面須要舉個例子:node
好吧,不是這個意思,認真的舉個栗子例子:ios
你的網站爲 http://www.whatever.com,啓用了 Google Analytics 或百度統計或任意第三方統計代碼。用戶訪問你的網站首頁,首頁 html 代碼引用了 10 個圖片文件,圖片地址是 http://www.whatever.com/images/[0-9].jpg (此處有正則)。nginx
由於 Google Analytics 在 http://www.whatever.com 這個域下設置了 cookie,瀏覽器在加載這些圖片時,會把 Google Analytics 設置的 cookie 放在頭信息裏發過去。瀏覽器
原本一個 cookie 也沒多大,頂多 1KB,可是若是你要加載 50 個圖片(或其它靜態文件),這樣發送的 cookie 總量就多達 50KB 了。對於靜態資源來講,發送這些 cookie 徹底沒有意義,因此咱們不想讓瀏覽器請求這些靜態資源時發送 cookie。緩存
下圖是蘋果教程網未設置 cookie-free 域名前請求某靜態資源時 HTTP 請求頭中包含 cookie 內容的慘狀:性能優化
其實單獨把 cookie-free 域名這個事兒單獨拎出來講是一件很傷感的事情,由於有錢淫通常都會同時選擇 VIP 套餐:CDN。使用 CDN,將靜態資源分發在多臺服務器上,用戶在請求資源時智能判斷哪一個節點速度最快並返回,同時再啓用一個 cookie-free 域名用來指向靜態資源。
對於沒有能力搞 CDN 的人,只能單獨配置一下 cookie-free 域名了。不要緊,等咱有了錢,服務器買 20 個,什麼聯通、電信、鐵通、長寬、移動、電信通,統統給接上,帶寬怎麼着也得 20M,還得上下行速率對等。
好了不廢話了,下面使用專業的語言描述一下要乾的事:
前提條件:一臺本身的服務器(VPS),安裝了 nginx,已經有可用的 nginx 配置文件(假定 server_name 爲 www.whatever.com),網站運轉正常。
待辦事項:修改 nginx 的配置文件,讓 nginx 監聽 cdn.whatever.com,並修改部分對靜態文件的處理規則。
首先你要增長一個子域名(cdn.whatever.com)指向你的服務器,這個不用多說了吧……
而後須要編輯你的 nginx 配置文件,它原來大概可能長這樣
server { listen 80; server_name www.whatever.com whatever.com; root /root/to/your/site; location / { index index.html index.php; } location ~* \.(gif|jpg|png)$ { expires 30d; } /*此處略去若干*/ }
你須要作的是首先修改 server_name 字段,讓 nginx 同時監聽 cdn.whatever.com。
server_name www.whatever.com whatever.com cdn.whatever.com;
而後新增一個 location 塊,寫以下內容,並確保這個 location 塊處於全部已存在的 location 塊以前,即 nginx 須要優先處理這個 location 中的內容。
location ~* \.(?:js|css|png|jpg|jpeg|gif|ico)$ { expires max; add_header Pragma public; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; access_log off; log_not_found off; tcp_nodelay off; break; }
搞定後保存 nginx 配置文件,而後重啓 nginx。
最後一步,將網頁中引用的全部 www.whatver.com 域下的靜態文件統統改成 cdn.whatever.com。以上文所說的那個首頁爲例,新的圖片地址爲 http://cdn.whatver.com/images/[0-9].jpg。
下圖爲蘋果教程網啓用了 cookie-free 域名來發送靜態資源後的 HTTP 頭請求截圖,是否清爽了不少。最重要的是,由於沒有 cookie 的發送,用戶的流量節省了不少,且網頁的加載速度也節省了不少,我開心的笑了。(畫外音:別傻了,能省幾 KB 啊)
其實要實現 cookie-free,只須要換一個域名並保證當前頁面沒有給根域名設置 cookie 便可。好比咱們雖然啓用了 cdn.whatever.com,可是因爲 Google Analytics(如下簡稱 GA) 設置 cookie 的域爲 .whatever.com 而不是 .www.ppios.com,會致使請求 cdn.whatever.com 中的內容時依然會發送 cookie。具體 cookie 的設置狀況請自行打開開發者工具查看。
這裏再提一下關於限制 GA 設置 cookie 的內容,原則上 GA 應該是默認只設置當前域名的,好比你的頁面 URL 是 http://www.whatever.com,則 GA 設置 cookie 的域就是 www.whatever.com;同理若是你的 URL 是 http://whatever.com,則 GA 會把 cookie 設置爲 .whatever.com,這樣你全部的子域名都會被這個 cookie 影響了。
解決方法就是修改 GA 統計代碼,在
_gaq.push(['_setAccount', 'UA-123456788-1']); _gaq.push(['_trackPageview']);
這兩行以前新增一行
_gaq.push(['_setDomainName', 'www.whatever.com']);
這樣就是告訴 GA 只准在 www.whatever.com 域下設置 cookie,關於這個設置順序折騰了小半個晚上,你們必定要注意啊。