Nginx + Tomcat動靜分離 (轉)


什么是動靜分離

  為了提高網站的響應速度,減輕程序服務器(Tomcat,Jboss等)的負載,對於靜態資源比如圖片,js,css等文件,我們可以在反向代理服務器中進行緩存,這樣瀏覽器在請求一個靜態資源時,代理服務器就可以直接處理,而不用將請求轉發給后端服務器。用戶請求的動態文件比如servlet,jsp則轉發給Tomcat,Jboss服務器處理,這就是動靜分離。這也是反向代理服務器的一個重要的作用。

  本文的動靜分離主要是通過nginx+tomcat來實現,其中nginx處理圖片、html、JS、CSS等靜態文件,tomcat處理jsp、servlet等動態請求。

  基礎知識了解完后,咱們來具體實踐一下動靜分離的感覺。負載均衡在這篇博客就不在介紹了,但是同樣會配置出來,實現動靜分離和負載均衡的效果。

動靜分離結構

         

 

服務器 

     

 

 Nginx服務器做負載均衡和動靜分離,服務器A,B做集群。

 

建立JSP動態頁面

<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Nginx動靜分離測試</title>
</head>
    <body>
        <h1>您正在訪問:192.168.32.229</h1>
        <img src="/testweb/img/girl.jpg"  alt="美女" />
    </body>
</html>

 jsp放到testweb目錄中,添加一個圖片標簽,加載Tomcat根目錄下 webapps/testweb/img/girl.jpg圖片文件。啟動Tomcat測試是否能夠訪問。

 瀏覽器輸入網址:http://192.168.32.229:8080/testweb/index.jsp


 在228服務器上同樣建立上述文件和目錄.

對Nginx進行配置

 通過配置location,對訪問的請求進行攔截,①②都需要配置。

 ① 全部的請求均轉發給Tomcat進行處理

location / {
    proxy_next_upstream http_502 http_504 error timeout invalid_header;
    proxy_pass http://mycluster;
    # 真實的客戶端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;
}

 ② 個別的請求比如:html,js,css等靜態資源請求,由Nginx進行處理

#靜態文件交給nginx處理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
    root /usr/local/webapps;
    expires 30d;
}
#靜態文件交給nginx處理
location ~ .*\.(js|css)?$
{
    root /usr/local/webapps;
    expires 1h;
}

  root /usr/local/webapps; 這段代碼的意思是指定Nginx訪問的目錄,即靜態資源所在的目錄。

  expires 30d; 指定這些資源文件在客戶端瀏覽器的緩存時間。30d指的是30天,1h指的是1小時。

 

完整的Nginx配置文件

user nobody;
 
    worker_processes 2;
 
    events{
            worker_connections 1024; 
    }
 
    http{
    #設置默認類型為二進制流
            default_type    application/octet-stream;
 
            server_names_hash_bucket_size   128;
            #指定來自客戶端請求頭的headerbuffer大小,設置為32KB
            client_header_buffer_size   32k;
            #指定客戶端請求中較大的消息頭的緩存最大數量和大小,這里是4個32KB
            large_client_header_buffers 4 32k;
            #上傳文件大小
            client_max_body_size 356m;
            #nginx的HttpLog模塊指定,指定nginx日志的輸出格式,輸出格式為access
            log_format access '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
            #access日志存在未知
            access_log  /var/log/nginx/access.log   access;
            #開啟高效模式文件傳輸模式,將tcp_nopush和tcp_nodelay兩個指另設置為on,用於防止網絡阻塞。
            sendfile    on;
            tcp_nopush  on;
            tcp_nodelay on;
            #設置客戶端連接保持活動的超時時間
            keepalive_timeout   65;
            server_tokens   off;
            #客戶端請求主體讀取緩存
            client_body_buffer_size 512k;
            proxy_connect_timeout   5;
            proxy_send_timeout      60;
            proxy_read_timeout      5;
            proxy_buffer_size       16k;
            proxy_buffers           4 64k;
            proxy_busy_buffers_size 128k;
            proxy_temp_file_write_size 128k;
 
            #開啟gzip
            gzip    on;
            #允許壓縮的最小字節數
            gzip_min_length 1k;
            #4個單位為16k的內存作為壓縮結果流緩存
            gzip_buffers 4 16k;
            #設置識別HTTP協議版本,默認是1.1
            gzip_http_version 1.1;
            #gzip壓縮比,可在1~9中設置,1壓縮比最小,速度最快,9壓縮比最大,速度最慢,消耗CPU
            gzip_comp_level 2;
            #壓縮的類型
            gzip_types text/plain application/x-javascript text/css application/xml;
            #讓前端的緩存服務器混村經過的gzip壓縮的頁面
            gzip_vary   on;
 
            upstream mycluster{
                     server 192.168.32.229:8080 weight=1;
                     server 192.168.32.230:8080 weight=1;
                    }
 
            server{
                    listen 8080;
                    server_name 192.168.32.228;
                    charset    utf-8; #設置編碼為utf-8;
 
            #location / {
            #    root   html;
            #    index  index.html index.htm;
            #}
 
            #location ~ .*\.(jsp|do|action)$
            location / {
                    proxy_next_upstream http_502 http_504 error timeout invalid_header;
                    proxy_pass http://mycluster;
                    # 真實的客戶端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  /usr/local/webapps;
                    expires 30d;
            }
            #靜態文件交給nginx處理
            location ~ .*\.(js|css)?$
            {
                    root /usr/local/webapps;
                    expires 1h;
            }
            error_page   500 502 503 504  /50x.html;  
 
            location = /50x.html {
                root   html;
            }
        }
    }

測試Nginx動靜分離

  根據上述配置文件,完成動靜分離和負載均衡的配置,然后啟動Nginx。
  訪問網址:http://192.168.32.228:8080/testweb/index.jsp


  可以看到圖片沒有加載出來。這是因為靜態資源訪問請求已經被Nginx攔截,由Nginx進行處理。但是Nginx服務器的 /usr/local/webapps 目錄下並沒有圖片資源,所以圖片沒有加載出來。index.jsp頁面能夠顯示,說明動態的請求已經轉發到了Tomcat,Tomcat對index.jsp進行了解析。

  在Nginx服務器 /usr/local/webapps 目錄下放置圖片文件,將tomcat上testweb整個目錄拷貝到其中。


  然后再次刷新瀏覽器,圖片能夠正常顯示。

小結

  從上述的實例可以看到已經初步實現了Nginx動靜分離的功能,在配置動靜分離后,用戶請求你定義的靜態資源,默認會去nginx的發布目錄請求,而不會到后端請求,這樣可以提高網站響應速度,減輕真實Web服務器的負載壓力。

  不過在開發環境下,為了便於開發,咱們的靜態資源和代碼還是放在一起的,等開發測試完成,才會將完成的完整程序部署到生成環境上,然而程序代碼和靜態資源是分別放置到不同的服務器上的。

出處:https://blog.csdn.net/zsj777/article/details/80241558


免責聲明!

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



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