前言
之前項目中需要用到百度地圖,由于項目的特殊環境,是以需要下載下傳百度的離線地圖。我們知道,地圖的展示其實就是一張張地圖的圖檔展示,我們在網頁上浏覽查找位置的時候,其實都是在發送圖檔請求。這些圖檔請求相對于jsp,servlet來說就是所謂的靜态資源,當然服務中的靜态資源不僅僅隻是圖檔,像頁面樣式css檔案,js腳本檔案這些都可以看着是靜态資源。tomcat既可以靜态資源也可以處理動态資源。但是單節點的tomcat本身處理請求的資源是有限的,如果項目中的tomcat既處理動态請求有要處理大量的靜态資源。顯然是不合理的,也就是會遇到tomcat的性能瓶頸問題,對于靜态資源的處理我們有更好的伺服器像Nginx,Apache.他們處理靜态資源的能力比Tomcat強很多,那麼我們能不能對請求進行分工呢?靜态資源的請求由Nginx來處理,像jsp我們交給tomcat來處理。這樣也能減輕tomcat的處理壓力。
如何實作
對于上面的動靜分離想必大家都已經了解了,那麼具體nginx是如何實作動靜分離的呢?這裡簡單的搭建個小例子。
這裡先是在本地tomcat中啟動一個小demo,服務中就是一個簡單的jsp頁面,頁面中包含一張圖檔。我們再啟動Nginx作為反向代理,在nginx的配置檔案中,配置代理的tomcat服務ip以及端口,還是靜态資源的root路徑,具體Nginx配置檔案關鍵配置如下
server {
listen 80;
server_name localhost;
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://localhost:8082;
# 真實的用戶端IP
proxy_set_header X-Real-IP $remote_addr;
# 請求頭中Host資訊
proxy_set_header Host $host;
# 代理路由資訊,此處取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真實的使用者通路協定
proxy_set_header X-Forwarded-Proto $scheme;
}
#靜态檔案交給nginx處理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|
zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
root /static;
expires 30d;
}
#靜态檔案交給nginx處理
location ~ .*\.(js|css)?$
{
root /static;
expires 1h;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
頁面中的圖檔是放在了和Nginx同級目錄的static檔案夾下面,static檔案夾在Nginx目錄下沒有,需建立,和conf檔案夾同級,也可以自定義。如果我們直接通路tomcat下面的index頁面,輸入 http://localhost:8082/tomcattest/由于tomcat服務中并沒有頁面的中mingren.jpg。是以圖檔是沒有展示的,如下圖
接着我們通路Nginx監聽的80端口,http://localhost/tomcattest,圖檔展示
我們也可以在浏覽器中看到,圖檔中的緩存時間和Nginx中配置的緩存時間也是一緻的
總結
上面簡單的介紹了如何利用Nginx實作請求的動靜分離。以及具體為什麼要動靜分離。其實實作動靜分離是在Nginx反向代理的基礎上實作。對于Nginx,我們後面再繼續深入學習。