什么是動靜分離
為了提高網站的響應速度,減輕程序服務器(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