動(dòng)靜分離
Nginx動(dòng)靜分離簡(jiǎn)單來說就是把動(dòng)態(tài)跟靜態(tài)請(qǐng)求分開奉件,不能理解成只是單純的把動(dòng)態(tài)頁面和靜態(tài)頁面物理分離。嚴(yán)格意義上說應(yīng)該是動(dòng)態(tài)請(qǐng)求跟靜態(tài)請(qǐng)求分開痴鳄,可以理解成使用Nginx處理靜態(tài)頁面瘟斜,Tomcat、Resin出來動(dòng)態(tài)頁面痪寻。
動(dòng)靜分離從目前實(shí)現(xiàn)角度來講大致分為兩種螺句,一種是純粹的把靜態(tài)文件獨(dú)立成單獨(dú)的域名,放在獨(dú)立的服務(wù)器上橡类,也是目前主流推崇的方案蛇尚;另外一種方法就是動(dòng)態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過nginx來分開顾画。通過location指定不同的后綴名實(shí)現(xiàn)不同的請(qǐng)求轉(zhuǎn)發(fā)取劫。
通過在server段代碼配置不同的location實(shí)現(xiàn)動(dòng)靜分離
####優(yōu)先級(jí)最小,所有沒匹配到的走根
location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://jvm_web1;
}
####所有php/jsp之類結(jié)尾的動(dòng)態(tài)頁面走后端動(dòng)態(tài)模塊處理,波浪線~表示匹配
location ~ .*\.(php|jsp|cgi|shtml)?$
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://jvm_web1;
}
####所有html/gif結(jié)尾的靜態(tài)頁面nginx本機(jī)直接處理
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /data/webapps/wugk1;
expires 30d;#expires 定義用戶瀏覽器緩存時(shí)間30天,靜態(tài)頁面不經(jīng)常更新的話可以節(jié)省貸款緩解服務(wù)器壓力,第一次訪問下載新文件狀態(tài)200,以后直接訪問本地緩存狀態(tài)304,知道受訪問文件發(fā)生變化或者時(shí)間到期
}
參數(shù)講解
Nginx常用配置參數(shù)有upstream匆笤,主要用于均衡后端多個(gè)實(shí)例:
Nginx 的upstream目前支持5種算法分配方式:
1)輪詢(默認(rèn)rr)
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到后端不同的服務(wù)器,如果后端某臺(tái)服務(wù)器down掉谱邪,自動(dòng)剔除炮捧,待恢復(fù)自動(dòng)添加上。
2)Weight權(quán)重
指定輪詢權(quán)重惦银,權(quán)重越高咆课,處理的請(qǐng)求就越多,weight和訪問比率成正比扯俱,用于后端服務(wù)器性能不均的情況书蚪。
3)ip_hash
每個(gè)請(qǐng)求根據(jù)訪問的IP的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器迅栅,可以解決session的問題善炫,一般用于登錄會(huì)話。
4)fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求库继,響應(yīng)時(shí)間短的優(yōu)先分配箩艺。
5)url_hash(第三方)
upstream的 fail_timeout和max_fails參數(shù)是用來判斷負(fù)載均衡upstream中的某個(gè)server是否失效。
在fail_timeout的時(shí)間內(nèi)宪萄,nignx與upstream中某個(gè)server的連接嘗試失敗了max_fails次艺谆,則nginx會(huì)認(rèn)為該server已經(jīng)失效。在接下來的 fail_timeout時(shí)間內(nèi)拜英,nginx不再將請(qǐng)求分發(fā)給失效的server静汤。
例如在nginx.conf里面配置如下的tdt_app均衡:
upstream tdt_app {
ip_hash; #配置ip_hash算法保證每個(gè)用戶只固定訪問一個(gè)后端服務(wù)器
server 10.10.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.10.1.12:8080 weight=1 max_fails=2 fail_timeout=30s;
}
Tdt_app均衡兩臺(tái)后端JAVA服務(wù),在30秒內(nèi)nginx會(huì)與后端的某個(gè)server通信檢測(cè)居凶,如果檢測(cè)連接失敗2次虫给,則Nginx會(huì)認(rèn)為該server已經(jīng)失效,然后踢出轉(zhuǎn)發(fā)列表侠碧,然后在接下來的30s內(nèi)抹估,nginx不再講請(qǐng)求轉(zhuǎn)發(fā)給失效的server。
另外弄兜,fail_timeout設(shè)置的時(shí)間對(duì)響應(yīng)時(shí)間沒影響药蜻,這個(gè)響應(yīng)時(shí)間是用proxy_connect_timeout和proxy_read_timeout來控制的。
proxy_connect_timeout : Nginx與后端服務(wù)器連接的超時(shí)時(shí)間替饿,發(fā)起握手等候響應(yīng)超時(shí)時(shí)間语泽。
proxy_read_timeout:連接成功后_等候后端服務(wù)器響應(yīng)時(shí)間,其實(shí)已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理(也可以說是后端服務(wù)器處理請(qǐng)求的時(shí)間)视卢。
proxy_send_timeout :后端服務(wù)器數(shù)據(jù)回傳時(shí)間踱卵,在規(guī)定時(shí)間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)。
keepalive_timout:一個(gè)http產(chǎn)生的tcp連接在傳送完最后一個(gè)響應(yīng)后据过,還需要等待多少秒后惋砂,才關(guān)閉這個(gè)連接妒挎。
rewrite規(guī)則
Rewrite規(guī)則含義就是某個(gè)URL重寫成特定的URL,從某種意義上說為了美觀或者對(duì)搜索引擎友好班利,提高收錄量及排名等饥漫。
Rewrite規(guī)則的最后一項(xiàng)參數(shù)為flag標(biāo)記,支持的flag標(biāo)記主要有以下幾種:
1)last :相當(dāng)于Apache里的(L)標(biāo)記罗标,表示完成rewrite庸队;
2)break;本條規(guī)則匹配完成后闯割,終止匹配彻消,不再匹配后面的規(guī)則
3)redirect:返回302臨時(shí)重定向,瀏覽器地址會(huì)顯示跳轉(zhuǎn)后的URL地址
4)permanent:返回301永久重定向宙拉,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址
5)last和break用來實(shí)現(xiàn)URL重寫宾尚,瀏覽器地址欄URL地址不變。
如在sever段代碼的location段上面插入rewrite規(guī)則
rewrite ^/$ /index01.html last;
#將默認(rèn)網(wǎng)站根頁面強(qiáng)制跳轉(zhuǎn)到index01.html并且不現(xiàn)實(shí)跳轉(zhuǎn)后的URL地址
*代表前面0或更多個(gè)字符
+代表前面1或更多個(gè)字符
谢澈?代表前面0或1個(gè)字符
^代表字符串的開始位置
$代表字符串結(jié)束的位置
.為通配符煌贴,代表任何字符
rewrite ^/(.*)$ /index01.html last;
#將網(wǎng)站根后綴的所有頁面都跳轉(zhuǎn)
rewrite ^/test/(.*)$ /index01.html last;
#只針對(duì)test二級(jí)目錄以下的網(wǎng)頁做跳轉(zhuǎn)
#多個(gè)頁面跳轉(zhuǎn)
if ($host != ‘www.wugk.com’ ) {
rewrite ^/(.*)$ http://www.wugk.com/$1 permanent;
}
···
######location匹配優(yōu)先級(jí)
匹配優(yōu)先級(jí)由上到下依次遞減
- location= #location=/test/abc.html
- location完整路徑 #location /test/abc.html
- location^~路徑
- location~*正則
- location路徑