nginx+tomcat實現動靜分離


本文設計的動靜分離結構

 

在本文中,我們將靜態資源放在 A 主機的一個目錄上,將動態程序放在 B 主機上,同時在 A 上安裝 Nginx 並且在 B 上安裝 Tomcat。配置 Nginx,當請求的是 html、jpg 等靜態資源時,就訪問 A 主機上的靜態資源目錄;當用戶提出動態資源的請求時,則將請求轉發到后端的 B 服務器上,交由 Tomcat 處理,再由 Nginx 將結果返回給請求端。

 

提到這,可能有您會有疑問,動態請求要先訪問 A,A 轉發訪問 B,再由 B 返回結果給 A,A 最后又將結果返回給客戶端,這是不是有點多余。初看的確多余,但是這樣做至少有 2 點好處。第一,為負載均衡做准備,因為隨着系統的發展壯大,只用一台 B 來處理動態請求顯然是是不夠的,要有 B1,B2 等等才行。那么基於圖 2 的結構,就可以直接擴展 B1,B2,再修改 Nginx 的配置就可以實現 B1 和 B2 的負載均衡。第二,對於程序開發而言,這種結構的程序撰寫和單台主機沒有區別。我們假設只用一台 Tomcat 作為服務器,那么凡是靜態資源,如圖片、CSS 代碼,就需要編寫類似這樣的訪問代碼:<img src=”{address of A}/a.jpg”>,當靜態資源過多,需要擴展出其他的服務器來安放靜態資源時,訪問這些資源就可能要編寫這樣的代碼:<img src=”{address of C}/a.jpg”>、<img src=”{address of D}/a.jpg”>。可以看到,當服務器進行變更或擴展時,代碼也要隨之做出修改,對於程序開發和維護來說非常困難。而基於上面的結構,程序都只 要 <img src=”a.jpg”>,無需關心具體放置資源的服務器地址,因為具體的地址 Nginx 為幫您綁定和選擇。

 

動靜分離的 Nginx 配置

 # 轉發的服務器,upstream 為負載均衡做准備
 upstream tomcat_server{
        server 192.168.8.23:8099;
 }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
       # 靜態資源存放目錄
        root  /im;

        location / {
            root   html;
            index  ak47.html index.html index.htm;
        }
       # 動態請求的轉發
        location ~ .*.jsp$ {
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
        }
 # 靜態請求直接讀取
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
          expires      30d;
 }

新建了一個im文件夾用來存放靜態圖片資源

其目的和我們預期的一樣,動態的請求(以 .jsp 結尾)發到 B(192.168.8.23:8099,即 tomcat_server)上,而靜態的請求(gif|jpg 等)則直接訪問定義的im目錄

 

接下來在 Tomcat 中新建 Web 項目,很簡單,我們只為其添加一個 test.jsp 文件,目錄結構如圖

 

注意目錄,很簡單,在webapps下新建了一個簡單的jsp,代碼如下,

<!DOCTYPE html>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page import="java.util.Date" %>
 <%@ page import="java.text.SimpleDateFormat" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/
 html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>動靜分離的測試</title>
 </head>
 <body>

    <div>result</div><br><img src="up3.png">
 </body>
 </html>

測試一下,啟動tomcat,確定是可以訪問到的  http://localhost:8099/xs/index.jsp

一個非常簡單的 JSP 頁面,主要是使用 img 標簽來訪問 up3.png,我們知道 index.jsp 在 B 服務器上,而 up3.png 在 A 服務器上。用於訪問 up3.png 的代碼里不需要指定 A 的地址,而是直接使用相對路徑即可,就好像該圖片也在 B 上一樣,這就是本結構的一個優點了。我們在 A 上訪問 index.jsp 文件。(這里假設一下,我的測試環境其實是在一台電腦上,服務器分開效果也是一樣的)

非常順利,完全按照我們的想法實現了動靜分離!

 

我們將 Tomcat 的端口設置為 8099,Nginx 的端口依然是 80。現在訪問 http://localhost:80/xs/index.jsp(未使用動靜分離)和訪問 http://localhost:8099/xs/index.jsp(使用了動靜分離)的效果是一樣的了。只是 8099端口的靜態資源由 Tomcat 處理,而 80 則是由 Nginx 處理。下圖未使用動靜分離:

 

這里只是測試環境在win下,實際生產環境下,應該部署在Linux下,部署方式相差不多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM