1.什麼是動靜分離/php
將動態的請求和靜態的請求區分訪問,靜態由Nginx處理,動態由php,tomcat處理html
2.爲何要作動靜分離?java
由於tomcat程序自己是用來處理jsp代碼的,但tomcat也能處理靜態資源。tomcat自己處理靜態效率不高,還會帶來資源開銷android
3.如何實現動靜分離nginx
Nginx根據客戶端請求的url來判斷請求的是不是靜態資源,若是請求的url包含jpg、png,則由Nginx處理。
若是請求的url是.php或者.jsp等等,這個時候這個請求是動態的,將轉發給tomcat處理。git
總結來講,Nginx是經過url來區分請求的類型,並轉發給不一樣的服務端。web
4.單機實現動靜分離實戰後端
安裝程序瀏覽器
[root@web01 ~]# yum install java tomcat -y [root@web01 ~]# mkdir /usr/share/tomcat/webapps/ROOT ----主要站點根目錄 [root@web01 ~]# vi /usr/share/tomcat/webapps/ROOT/index.jsp 實驗程序 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>Nginx+Tomcat</title> </head> <body> <% Random rand = new Random(); out.println("<h2>動態資源</h2>"); out.println(rand.nextInt(99)+100); %> <h2>靜態圖片</h2> <img src="nginx.png" /> </body> </html>
[root@web01 ~]# wget -O /usr/share/tomcat/webapps/ROOT/nginx.png http://nginx.org/nginx.png ---下載靜態圖片
[root@web01 ~]# systemctl start tomcattomcat
注:tomcat監聽在8080端口
配置nginx
[root@web01 conf.d]# cat ds.oldxu.com.conf server { listen 80; server_name ds.oldxu.com; location / { proxy_pass http://127.0.0.1:8080; } location ~* \.(png|gif|jpg|mp4)$ { root /images; expires 1d; } }
劫持域名
5.集羣實現,動靜分離實戰(有負載均衡,後端節點)
root@lb01 conf.d]# cat proxy_ds.oldxu.com.conf -- upstream java { server 172.16.1.7:8080; } upstream static { server 172.16.1.8:80; } server { listen 80; server_name ds.oldxu.com; location / { proxy_pass http://java; include proxy_params; } location ~* \.(png|gif|jpeg)$ { proxy_pass http://static; expires 2d; include proxy_params; } }
靜態資源
server { listen 80; server_name ds.oldyang.com; location / { root /images; expires 1d; } }
二.Rewrite
1.什麼是rewrite
Rewrite主要是實現url地址重寫,以及url地址跳轉
就是將用戶請求的web服務器的url地址從新修改成其餘url地址的過程
2.rewrite使用場景
1.地址跳轉
2.協議跳轉。
3.URL靜態化
3.rewrite實現原理
3.Rewrite重寫相關模塊
1.set自定義變量
set語法
示例:set結合if實現變量的需求
mkdir -p /data/zh
mkdir -p /data/jp
mkdir -p /data/en
ehco "zh">/data/zh/index.html
ehco "jp">/data/jp/index.html
ehco "en">/data/en/index.html
server { listen 80; server_name url.oldyang.com.cn url.oldyang.com.jp; if ($http_host ~* cn){ set $language zh; } if ($http_host ~* jp){ set $language jp; } rewrite ^/$ http://url.oldyang.com/$language/; } server { listen 80; server_name url.oldyang.com; location / { root /data; } }
2.if指令場景示例
需求:根據用戶瀏覽器使用的語言,自動判斷並跳轉到不一樣的語言界面
中國 url.oldxu.com ---> url.oldxu.com --->中文 english url.oldxu.com ---> url.oldxu.com --->english server { listen 80; server_name url.oldxu.com; location / { if ( $http_accept_language ~* "en" ) { set $language en; } if ( $http_accept_language ~* "zh|zh-CN" ) { set $language zh; } root /data/$language; } }
需求:Nginx過濾請求中包含a1=3526的http請求到10.0.3.05的8080端口處理
server { listen 80; server_name url.oldxu.com; location / { default_type text/html; if ($request_uri ~* "a1=3526") { return 200 "https://www.jd.com"; } if ($request_uri ~* "git"){ return 403; } if ($request_uri ~* "^/test") { return 302 "https://www.jd.com"; } if ( $http_accept_language ~* "en" ) { set $language en; } if ( $http_accept_language ~* "zh|zh-CN" ) { set $language zh; } root /data/$language; }
return 返回數據
1.return 指令語法
中止一切處理,返回結果給客戶端,若是返回的狀態碼是 444,則斷開 TCP 鏈接,不發送任何東西。
若是不帶狀態碼直接返回 URL 則被視爲 302
2.return的三種使用場景
erver { listen 80; server_name url.oldxu.com; location / { default_type text/html; if ($request_uri ~* "a1=3526") { return 200 "https://www.jd.com"; } if ($request_uri ~* "git"){ return 403; } if ($request_uri ~* "^/test") { return 302 "https://www.jd.com"; } if ( $http_accept_language ~* "en" ) { set $language en; } if ( $http_accept_language ~* "zh|zh-CN" ) { set $language zh; } root /data/$language; }
break 表示要中止後續的操做
server { listen 80; server_name url.oldxu.com; root /code; location / { rewrite /1.html /2.html break; rewrite /2.html /3.html; } location /2.html { rewrite /2.html /a.html; } location /3.html { rewrite /3.html /b.html; } }
[root@web01]# echo "1.html" >/code/1.html
[root@web01]# echo "2.html" >/code/2.html
[root@web01]# echo "3.html" >/code/3.html
[root@web01]# echo "a.html" >/code/a.html
[root@web01]# echo "b.html" >/code/b.html
rewrite
參數 | 說明 |
---|---|
last | 中止全部 rewrite 相關指令,而後使用新的 URI 進行 location 匹配。 |
break | |
redirect | URI 中不包含協議如 https://,但依然但願它返回 30x,讓瀏覽器二次請求而後獲取到結果就須要 redirect。 |
permanent | 和 redirect 相似,可是直接返回 301 永久重定向。 |
根據不一樣的語言
server { listen 80; server_name url.oldxu.com; root /data; set $language /default; if ( $http_accept_language ~* zh ) { set $language /zh; } if ( $http_accept_language ~* en ) { set $language /en; } if ( $http_accept_language ~* ja ) { set $language /jp; } rewrite ^/$ $language; location / { index index.html; } }
跳轉永久維護頁面
erver { listen 80; server_name url.oldxu.com; root /data; rewrite ^(.*)$ /wh.png break; set $language /default; if ( $http_accept_language ~* zh ) { set $language /zh; } if ( $http_accept_language ~* en ) { set $language /en; } if ( $http_accept_language ~* ja ) { set $language /jp; } rewrite ^/$ $language; location / { index index.html; } }
臨時維護
#error_page 403 404 500 502 /wh.png; #error_page 403 404 500 502 http://$http_host; error_page 403 404 500 502 @temperror; location @temperror { rewrite ^(.*)$ http://$http_host; }
需求: 用戶經過手機設備訪問url.oldxu.com,跳轉至url.oldxu.com/m
server { listen 80; server_name url.oldxu.com; root /data; if ($http_user_agent ~* "android|iphone|ipad") { rewrite ^/$ /m; } }
需求: 用戶經過手機設備訪問url.oldxu.com,跳轉至m.oldxu.com
listen 80; server_name url.oldxu.com; root /data; if ($http_user_agent ~* "android|iphone|ipad") { rewrite ^/$ http://m.oldxu.com; } } server { listen 80; server_name m.oldxu.com; root /data/m; location / { index index.html; } }
#需求: 用戶訪問oldxu.com/test,跳轉至https://xuliangwei.com
兩種方式匹配test
1.location
location /test { #rewrite ^(.*)$ https://www.xuliangwei.com/; return 302 https://www.xuliangwei.com/; }
2.if
server { listen 80; server_name url.oldxu.com; root /data; if ($request_uri ~* "^/test") { #rewrite ^(.*)$ https://www.xuliangwei.com/; return 302 https://www.xuliangwei.com/; } location / { index index.html; } }
3.rewrite場景示例: 開發
需求: 用戶訪問course-11-22-33.html實際上真實訪問是/course/11/22/33/course_33.html
root@web01 conf.d]# cat url.oldxu.com.conf server { listen 80; server_name url.oldxu.com; root /data; location / { index index.html; #用戶訪問的url #文件真實位置 rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html; } }