学习b记 · 第二阶段
七、动静分离、Rewrite
①动静分离
Nginx动静分离基本概述:
动静分离,通过中间件将动静分离和静态请求进行分离;
通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时。
通过中间件将动态请求和静态请求分离,逻辑图如下:
动态请求需要通过三层逻辑才能返回结果,如果再加上静态资源就会很消耗资源,将静态资源独立出来就能减少消耗
下面做一个小例子,通过负载均衡单独将两种请求分开相应
系统 作用 服务 地址
Centos7.5 负载均衡 nginx proxy 192.168.17.232
Centos7.5 静态资源 nginx static 192.168.17.202
Centos7.5 动态资源 tomcat server 192.168.17.204
安装前面的文章有,这里直接粘配置文件了
#web01
1、cat jt.conf
server {
listen 80;
server_name pic.qxl.com;
root /code;
index index.html;
location ~* .*\.(jpg|png|gif)$ {
root /code/images;
}
}
#弄一个html
2、mkdir /code
[root@web01 conf.d]# echo "lzy_test_web01" > /code/index.html
#创建图片目录
3、[root@web01 conf.d]# mkdir /code/images/
#上传一个图片
4、 cd /code/images/
rz test.jpg
#重启验证
5、systemctl restart nginx
#浏览器直接输出
http://pic.qxl.com/ http://pic.qxl.com/test.jpg
#web02 这个配置动态
#安服务
1、yum install -y tomcat
#创建目录
2、mkdir /usr/share/tomcat/webapps/ROOT
#建一个jsp网页
3、vim /usr/share/tomcat/webapps/ROOT/java_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<HTML>
<HEAD>
<TITLE>JSP Page</TITLE>
</HEAD>
<BODY>
<%
Random rand = new Random();
out.println("<h1>oldboy随机数:<h1>");
out.println(rand.nextInt(99)+100);
%>
</BODY>
</HTML>
#重启服务测试
4、systemctl restart tocmat
#tomcat的默认端口是8080
http://10.0.0.8:8080/java_test.jsp
#加一个负载均衡,可以同时访问web01 web02
1、cd /etc/nginx.conf.d
vim proxy_ds.conf
upstream static {
server 172.16.1.202:80;
}
upstream java {
server 172.16.1.204:8080;
}
server {
listen 80;
server_name pic.qxl.com;
location / {
root /code;
index index.html;
}
location ~* \.(jpg|png|gif)$ {
proxy_pass http://static;
proxy_set_header Host $http_host;
}
location ~ \.jsp {
proxy_pass http://java;
proxy_set_header Host $http_host;
}
}
#这里把那两个web整合到一个页面上
2、mkdir -p /code
vim /code/index.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>测试ajax和跨域访问</title>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://pic.qxl.com/java_test.jsp",
success: function(data){
$("#get_data").html(data)
},
error: function() {
alert("失败了");
}
});
});
</script>
<body>
<h1>测试动静分离</h1>
<img src="http://pic.qxl.com/cjk.gif">
<div id="get_data"></div>
</body>
</html>
#测试 windows做一下hosts解析直接访问
3、pic.qxl.com
②Rewrite
1、什么是rewrite
Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。
2、Rewrite使用场景
地址跳转,用户访问www.qxl.com这个URL时,将其定向至一个新的域名mobile.qxl.com
协议跳转,用户通过http协议请求网站时,将其重新跳转至htt ps协议方式
伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
搜索引擎,SEO优化依赖于url路径,好记的url便于支持搜索引擎录入
3、Rewrite标记Flag
rewrite指令根据表达式来重定向URL,或者修改字符串,可以应用于server,location,if环境下,每行rewrite指令最后跟一个flag标记,支持的flag标记有如下表格所示:
flag 作用
last 本条规则匹配完成后,停止匹配,不再匹配后面的规则
break 本条规则匹配完成后,停止匹配,不再匹配后面的规则
redirect 返回302临时重定向,地址栏会显示跳转后的地址
permanent 返回301永久重定向,地址栏会显示跳转后的地址
4、last与break区别对比示例
[root@web01 conf.d]# cat nginx.conf
server {
listen 80;
server_name test.qxl.com;
root /code/test/;
location / {
rewrite /1.html /2.html;
rewrite /2.html /3.html;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html {
rewrite /3.html /b.html;
}
}
5、redirect与permanent区别对比示例
[root@web01 conf.d]# cat rewrite.conf
server {
listen 80;
server_name rewrite.qxl.com;
root /code;
location /test {
rewrite ^(.*)$ http://www.baidu.com redirect;
#rewrite ^(.*)$ http://www.baidu.com permanent;
#return 301 http://www.baidu.com;
#return 302 http://www.baidu.com;
}
}