1.為什么要實現動靜分離
1)nginx的處理靜態資源能力超強
主要是nginx處理靜態頁面的效率遠高于tomcat的處理能力,如果tomcat的請求量為1000次,則nginx的請求量為6000次,tomcat每秒的吞吐量為0.6m,nginx的每秒吞吐量為3.6m,可以說,nginx處理靜態資源的能力是tomcat處理能力的6倍,優勢可見一斑。
2)動態資源和靜態資源分開,使服務器結構更清晰。
2.動靜分離原理
服務端接收來自客戶端的請求中,有一部分是靜態資源的請求,例如html,css,js和圖片資源等等,有一部分是動態數據的請求。因為tomcat處理靜態資源的速度比較慢,所以我們可以考慮把所有靜態資源獨立開來,交給處理靜態資源更快的服務器例如nginx處理,而把動態請求交給tomcat處理。
如下圖所示,我們在機器上同時安裝了nginx和tomcat,把所有的靜態資源都放置在nginx的webroot目錄下面,把動態請求的程序都放在tomcat的webroot目錄下面,當客戶端訪問服務端的時候,如果是靜態資源的請求,就直接到nginx的webroot目錄下面獲取資源,如果是動態資源的請求,nginx利用反向代理的原理,把請求轉發給tomcat進行處理,這樣就實現了動靜分離,提高了服務器處理請求的性能。
3.動靜分離的詳細配置
1)首先熟悉下nginx的重要配置文件nginx.conf
user?nginx;? worker_processes?1;? error_log?logs/error.log;? pid????logs/nginx.pid;? events?{? ??worker_connections?1024;? }? http?{? ??include????mime.types;? ??default_type?application/octet-stream;? ??#日志格式定義? ??log_format?main?'$remote_addr?-?$remote_user[$time_local]?"$request"?'? ???????????'$status?$body_bytes_sent"$http_referer"?'? ???????????'"$http_user_agent"?"$http_x_forwarded_for"';? ??access_log?logs/access.log?main;? ??sendfile????on;? ??keepalive_timeout?65;? ??#gzip壓縮功能設置? ??gzip?on;? ??gzip_min_length?1k;? ??gzip_buffers??4?16k;? ??gzip_http_version?1.0;? ??gzip_comp_level?2;? ??gzip_types?text/plain?application/x-javascripttext/css?application/xml;? ??gzip_vary?on;? ??server?{? ????listen????80;? ????server_name?www.test.com;? ????location?/?{? ??#jsp網站程序根目錄,一般nginx與tomcat在同一個目錄? ??????root?/usr/local/tomcat/webapps/root;? ??????index?index.html?index.jsp?index.html;? ????}? ????location?~?.*.jsp$?{? ????index?index.jsp;? ????proxy_pass?http://127.0.0.1:8080;??#來自jsp請求交給tomcat處理? ????proxy_redirect?off;? ????proxy_set_header?host?$host;??#后端的web服務器可以通過x-forwarded-for獲取用戶真實ip? ????proxy_set_header?x-real-ip?$remote_addr;? ????proxy_set_header?x-forwarded-for?$proxy_add_x_forwarded_for;? ????client_max_body_size?10m;??#允許客戶端請求的最大單文件字節數? ????client_body_buffer_size?128k;?#緩沖區代理緩沖用戶端請求的最大字節數? ????proxy_connect_timeout?90;??#nginx跟后端服務器連接超時時間(代理連接超時)? ????proxy_read_timeout?90;???#連接成功后,后端服務器響應時間(代理接收超時)? ????proxy_buffer_size?4k;????#設置代理服務器(nginx)保存用戶頭信息的緩沖區大小? ????proxy_buffers?6?32k;????#proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置? ????proxy_busy_buffers_size?64k;#高負荷下緩沖大小(proxy_buffers*2)? ????proxy_temp_file_write_size?64k;?#設定緩存文件夾大小,大于這個值,將從upstream服務器傳? ????}? ????location?~?.*.(gif|jpg|png|bmp|swf)$??#由nginx處理靜態頁面? ????{? ????expires?30d;??#使用expires緩存模塊,緩存到客戶端30天? ????}? ????location?~?.*.(?jsp|js|css)?$? ????{? ????expires?1d;? ????}? ????error_page?404???????/404.html;??#錯誤頁面? ????error_page??500?502?503?504?/50x.html;? ????location?=?/50x.html?{? ??????root??html;? ????}? ??}
2)配置動靜分離
#配置nginx動靜分離,定義的靜態頁面直接從nginx發布目錄讀取。? location?~?.*.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$?{? ??root?/webapps/myproject/code/static-resource;? ??????#expires定義用戶瀏覽器緩存的時間為7天,如果靜態頁面不常更新,可以設置更長,這樣可以節省帶寬和緩解服務器的壓力? ??expires?1d;? }? location?~?^/(web-inf)/?{#這個很重要,不然用戶就可以訪問了? ??????deny?all;?? ????}
這里需要注意,外部靜態文件的存放路徑,應當與請求中路徑一致,以免nginx拼接路徑后,由于路徑不存在而找不到文件。如果出現js、css等不加載的情況,可以查看nginx的errorlog進行調試修正,日志位于nginx目錄下的logs目錄內,如下截取一段錯誤的日志:
復制代碼?代碼如下:
[error] 7195#0: *1693 open() “/home/cms/include/dedeajax2.js” failed (2: no such file or directory), client: 101.226.35.225, server: localhost, request: “get /cms/include/dedeajax2.js http/1.1”???
可以看到,get請求是 “ /cms/include/dedeajax2.js ”,這時nginx就會在配置中的 /home 下,尋找這一路徑的文件,完整路徑為:
/home/cms/include/dedeajax2.js
報錯為 no such file or directory ,就可以在對應的 /home 目錄下看文件路徑的問題。
配置成功后,就可以發現靜態文件通過nginx處理了,靜態文件的請求不再進入tomcat服務器,從而可以打包時,靜態文件的目錄如js、css等不再打進war包。