動態資源與靜態資源的區別
微微的概括一下
- 靜態資源: 當用戶多次訪問這個資源,資源的源代碼永遠不會改變的資源。
- 動態資源:當用戶多次訪問這個資源,資源的源代碼可能會發送改變。
什么是動靜分離
動靜分離是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以后,我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路。
為什么要用動靜分離
在我們的軟件開發中,有些請求是需要后台處理的(如:.jsp,.do等等),有些請求是不需要經過后台處理的(如:css、html、jpg、js等等文件),這些不需要經過后台處理的文件稱為靜態文件,否則動態文件。因此我們后台處理忽略靜態文件。這會有人又說那我后台忽略靜態文件不就完了嗎。當然這是可以的,但是這樣后台的請求次數就明顯增多了。在我們對資源的響應速度有要求的時候,我們應該使用這種動靜分離的策略去解決。動靜分離將網站靜態資源(HTML,JavaScript,css,img等文件)與后台應用分開部署,提高用戶訪問靜態代碼的速度,降低對后台應用訪問。這里我們將靜態資源放到nginx中,動態資源轉發到tomcat服務器中。因此,動態資源轉發到tomcat服務器我們就使用到了前面講到的反向代理了。
在nginx中的配置
###靜態資源訪問
server {
listen 80;
server_name static.itmayiedu.com;
location /static/imgs {
root D:/; #會直接匹配D:下的static/imgs目錄的 D:/static/imgs
index index.html index.htm;
}
}
###動態資源訪問
server {
listen 80;
server_name www.kingstone.com; // 去hosts文件中配置
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
tip
圖片這種靜態資源,再次訪問的話,會出現304狀態碼。這不是一種錯誤,而是對客戶端有緩存情況下服務端的一種響應。
不明覺厲的解釋:
客戶端在請求一個文件的時候,發現自己緩存的文件有 Last Modified ,那么在請求中會包含 If Modified Since ,這個時間就是緩存文件的 Last Modified 。因此,如果請求中包含 If Modified Since,就說明已經有緩存在客戶端。服務端只要判斷這個時間和當前請求的文件的修改時間就可以確定是返回 304 還是 200 。
對於靜態文件,例如:CSS、圖片,服務器會自動完成 Last
Modified 和 If Modified Since 的比較,完成緩存或者更新。但是對於動態頁面,就是動態產生的頁面,往往沒有包含 Last Modified 信息,這樣瀏覽器、網關等都不會做緩存,也就是在每次請求的時候都完成一個 200 的請求。
因此,對於動態頁面做緩存加速,首先要在 Response 的
HTTP Header 中增加 Last Modified 定義,其次根據 Request 中的 If Modified Since 和被請求內容的更新時間來返回 200 或者 304 。雖然在返回
304 的時候已經做了一次數據庫查詢,但是可以避免接下來更多的數據庫查詢,並且沒有返回頁面內容而只是一個
HTTP Header,從而大大的降低帶寬的消耗,對於用戶的感覺也是提高