今日内容
1.什么是动静分离?
将动态请求和静态请求区分访问
2.为什么要做动静分离
静态由nginx处理,动态由php或Tomcat处理
因为tomcat本身是用来处理jsp代码的,但是tomcat也能处理静态资源。
tomcat本身处理静态效率不高,还会带来资源开销。
3.如何实现
Nginx根据客户端的请求url来判断请求的是否是静态资源,如果请求的包含url包含jpg,png则由nginx处理
如果请求的url是.php或者jsp这个时候的请求是动态的,则会发给tomcat处理。
总结:nginx是通过url区分请求的类型。并转发给不同的服务端。
单机实现静态分离
[root@web02 ~]# yum install java tomcat -y
[root@web02 ~]# mkdir /usr/share/tomcat/webapps/ROOT #创建主要站点目录
[root@web02 ~]# cat /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@web02 ~]# wget -O /usr/share/tomcat/webapps/ROOT/nginx.png http://nginx.org/nginx.png
[root@web02 ~]# systemctl start tomcat
tomcat监听在8080端口上:
tcp6 0 0 :::8080 :::* LISTEN 27923/java
Ip:8080直接访问web站点测试
#配置Nginx
[root@web02 ~]# cd /etc/nginx/conf.d/
[root@web02 conf.d]# cat ds.oldxu.com.conf
server {
listen 80;
server_name ds.lsc.com;
location / {
root /images;
}
}
做host劫持,并访问网站
![](https://img.haomeiwen.com/i18917578/ac5a7fb24992fb0e.png)
image.png
![](https://img.haomeiwen.com/i18917578/13f766e3cb8242d3.png)
image.png
![](https://img.haomeiwen.com/i18917578/2efa2998f882c294.png)
image.png
集群实现动静态分离
1.停止本机的nginx
2.测试访问tomcat是否正常
3.配置lb负载均衡
实现动态请求调度至动态集群
实现静态请求调度至静态资源
4.准备一台另一台提供静态资源访问
1.停止本机的nginx
[root@web02 images]# systemctl stop nginx
2.ip+端口访问,静态和动态都正常
3.配置代理 可以配置缓存日期
[root@lb01 conf.d]# cat /etc/nginx/conf.d/proxy_ds.lsc.com.conf
upstream java {
server 172.16.1.8:8080;
}
upstream static {
server 172.16.1.7:80;
}
server {
listen 80;
server_name ds.lsc.com;
location / {
proxy_pass http://java;
include proxy_params;
}
location ~* \.(png|gif|jpeg)$ {
proxy_pass http://static;
include proxy_params;
}
}
java端:
[root@web02 conf.d]# cat /etc/nginx/conf.d/ds.lsc.com.conf
server {
listen 80;
server_name ds.lsc.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
location ~* \.(png|gif|jpg|mp4)$ {
root /images;
expires 1d; #缓存时间 1天
}
}
static端:
[root@web01 ~]# cat /etc/nginx/conf.d/ds.lsc.com.conf
server {
listen 80;
server_name ds.lsc.com;
location / {
root /images;
}
}
[root@web01 ~]# ll /images/nginx.png
-rw-r--r-- 1 root root 118296 Sep 23 00:36 /images/nginx.png
Rewrite跳转
1.什么是Rewrite?
将用户请求web服务器的url地址重新修改为其他的url地址的过程 360buy.com --> jd.com
2.Rewrite使用场景?
1.地址跳转
2.协议跳转,将http协议重新跳转到https协议
3.url静态化,将动态url地址显示为静态url的一种技术
3.Rewrite实现原理?(图一)
4.Rewrite URL重写配置场景?
set设置变量
if负责语句中的判断
return返回返回值或url
break终止后相比的rewrite规则
rewrite重定向url
10案例
5.Rewrite URL重写falg标记?
6.Rewrite URL重写生产实践?
![](https://img.haomeiwen.com/i18917578/cf472b0722ae2eb1.png)
image.png
2.url重写实例
1.set自定义变量
1.语法指令
Syntax: set $variable value;
Default: -
Context:server, location ,if
2.将用户请求的url.lsc.com.cn重新定向到url.lsc,com/zh
[root@web02 conf.d]# cat /etc/nginx/conf.d/url.lsc.com.conf
server {
listen 80;
server_name url.oldxu.com.cn;
set $language zh; #设定变量
rewrite ^/$ http://url.lsc.com/$language/; #默认以'/'结尾的
}
server {
listen 80;
server_name url.lsc.com;
location / {
root /data;
}
}
[root@web02 conf.d]# mkdir /data/zh -p
[root@web02 conf.d]# mkdir /data/jp -p
[root@web02 conf.d]# mkdir /data/en -p
[root@web02 conf.d]# echo 'zh' /data/zh/index.htm^C
[root@web02 conf.d]# echo 'zh' >/data/zh/index.html
[root@web02 conf.d]# echo 'en' >/data/en/index.html
[root@web02 conf.d]# echo 'jp' >/data/jp/index.html
host劫持 ip url.lsc.com url.lsc.com.cn
请求url.lsc.com.cn
![](https://img.haomeiwen.com/i18917578/8d50681bd06faee8.png)
image.png
2.if指令
需求一:将用户请求的url.lsc.com.cn跳转至url.lsc.com/zh
需求二:将用户请求的url.lsc.com.jp跳转至url.lsc.com/jp
及不同的域名访问到的wen主站不同
synctax:if (condition) {…}
Default: -
Context:server,location
# ~ 模糊匹配
# ~* 不区分大小写的匹配
# !~ 不匹配
#= 精确匹配
[root@web02 conf.d]# cat url.lsc.com.conf
server {
listen 80;
server_name url.oldxu.com.cn url.oldxu.com.jp;
#判断来自不同国家的url请求,cn来自中国,匹配
if ($http_host ~* cn) {
set $language zh; #设定变量
}
#判断jp,来自日本,匹配
if ($http_host ~* jp) {
set $language zh;
}
rewrite ^/$ http://url.lsc.com/$language/;
}
server {
listen 80;
server_name url.lsc.com;
location / {
root /data;
}
}
![](https://img.haomeiwen.com/i18917578/ee61104079c489e9.png)
image.png
![](https://img.haomeiwen.com/i18917578/b03ee1018606809c.png)
image.png
需求三:根据用户请求浏览器的语言,自动判断并跳转不同的语言界面。
中国 url.oldxu.com ---> url.oldxu.com --->中文
english url.oldxu.com ---> url.oldxu.com --->english
需求四:Nginx过滤请求中包含a1=3526的http请求到10.16.3.5的8080端口处理。
server {
listen 80;
server_name url.oldxu.com;
location / {
default_type text/html;
if ($request_uri ~* "a1=3526"){
return 200 "ok";
}
if ( $http_accept_language ~* "en" ) {
set $language en;
}
if ( $http_accept_language ~* "zh|zh-CN" ) {
set $language zh;
}
root /data/$language;
}
}
![](https://img.haomeiwen.com/i18917578/a76419a97ec8a2d3.png)
image.png
return 返回数据
Syntax: return code [text];
return code URL;
return URL;
Default:-
Context:server.location,if
1.返回状态码
if ($request_uri ~* "a1=3526"){
return 403;
}
2.返回一个字符串
if ($request_uri ~* "a1=3526"){
return 200 “anything”;
}
3.返回一个URL
if ($request_uri ~* "a1=3526"){
return 302 "http://www.jd.com";
} #302 跳转到某个url
if ($request_uri ~* "^/test") {
return 302 "http://www.jd.com";
} #请求网站的一个test目录,跳转到jd
break跳出本次的循环
前提:需要pcre-devel库
Syntax: break;
Default: —
Context: server, location, if
server {
listen 80;
server_name url.lsc.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@web02]# echo "1.html" >/code/1.html
[root@web02]# echo "2.html" >/code/2.html
[root@web02]# echo "3.html" >/code/3.html
[root@web02]# echo "a.html" >/code/a.html
[root@web02]# echo "b.html" >/code/b.html
break结束,会看到2.html
last 结束当前的匹配,假设在2.html结束,结束当前,重新请求url,到location /2.html下
rewrite
# 关键字 正则 替代内容 flag标记
Syntax: rewrite regex replacement [flag];
#flag
last #本条规则匹配完成后,继续向下匹配新的location URI规则 (开发| 伪静态)
break #本条规则匹配完成即终止,不再匹配后面的任何规则 (挂维护页)
redirect #返回302临时重定向, 地址栏会显示跳转后的地址
permanent #返回301永久重定向, 地址栏会显示跳转后的地址
实现场景
中国 url.oldxu.com ---> url.oldxu.com/zh --->中文
english url.oldxu.com ---> url.oldxu.com/cn --->english
[root@web02 data]# echo "123456" >/data/default/index.html
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;
}
}
在网站不改变的情况下进入到一个维护页面(永久维护)
server {
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;
}
}
访问lsc.com/test 跳转到https://www.jd.com
location------------------------------------------------------------------
location /test {
#rewrite ^(.*)$ https://www.xuliangwei.com/;
return 302 https://www.xuliangwei.com/;
}
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;
}
}
网友评论