Nginx动静分离(十四)

1. 回顾知识点

四层负载均衡
	四层  内核空间  转发  传输层(tcp、udp 转发 )  
	七层  用户空间  代理  应用层(域名匹配,路径规则控制、安全、限速、等)

转发:直接修改数据包,把来源的ip,转发是改,请求的地址改写

代理:拆到引用层,做匹配,然后由自己重新向后端发起请求。
会重新的在发起一次请求

这个研究一下拆包,转发的原理,有点不太清楚,如何进行的??? 这对个改端口ip的理解的不太清楚
在这里插入图片描述

在这里插入图片描述

2. Nginx动静分离概述

在这里插入图片描述
在这里插入图片描述

一个是代码层面来实现不同的设备实现调度
一个是nginx的层面上实现不同的设备实现调度
在这里插入图片描述

3. Nginx动静分离实践应用案例

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EIbZiKZh-1675614938673)(79A3986A24E844DA95DE5B27C4C42187)]

环境准备:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuueijDF-1675614938673)(459E6B9FE8B94C43BC26C2299A2CE85A)]

开始实验:

(1)在web01上配合静态资源

[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# cat ds_oldboy.conf 
server {
        listen 80;
        server_name pic.lzy.com;
        root /code;
        index index.html;

        location ~* .*\.(jpg|png|gif)$ {
                root /code/images;
        }
}

#配置一个主页
[root@web01 conf.d]# echo "lzy_test_web01" > /code/index.html

#创建图片目录
[root@web01 conf.d]# mkdir /code/images/

#上传一个静态文件
[root@web01 conf.d]# cd /code/images/
[root@web01 images]# rz test.jpg

[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# nginx -s reload  

打开浏览器访问:http://pic.lzy.com/
打开浏览器访问:http://pic.lzy.com/test.jpg

自己配置的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkfXwZAA-1675614938674)(0F61AED8AD4C43BF8B20B608103B89B9)]

(2)在web02上配置动态资源

[root@web02 ~]# yum install -y tomcat
[root@web02 ~]# mkdir /usr/share/tomcat/webapps/ROOT
[root@web02 ~]# cat /usr/share/tomcat/webapps/ROOT/java_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<HTML>
    <HEAD>
        <TITLE>oldboy JSP Page</TITLE>
    </HEAD>
    <BODY>
        <%
            Random rand = new Random();
            out.println("<h1>oldboy随机数:<h1>");
            out.println(rand.nextInt(99)+100);
        %>
    </BODY>
</HTML>

[root@web02 webapps]# systemctl start tomcat  

打开浏览器,访问:http://10.0.0.8:8080/java_test.jsp

自己配置的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0wPnijSM-1675614938674)(661FC4ED576D46B895BFE2F29B1BE981)]

(3)在负载均衡上配置

[root@lb01 conf.d]# cat proxy_ds.conf 
upstream static {
        server 172.16.1.7:80;
}

upstream java {
        server 172.16.1.8:8080;
}

server {
        listen 80;
        server_name pic.lzy.com;

        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;
        }
}

[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# nginx -s reload

在这里插入图片描述
在这里插入图片描述

小提示: 负载均衡的80端口是对用户的

在这里插入图片描述

(4) 在浏览器中进行测试
在浏览器中输入
请求动态资源:ds.oldboy.com/java_test.jsp
请求静态资源:ds.oldboy.com/1.jpg
实现原理:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qjt82eiN-1675614938677)(3D2D472A2C904C4EADFE9E7245D1B7D0)]

(5)资源整合,在一个index.txt文件(一个页面上显示动态和静态),把动态资源和静态资源进行整合,其中一个服务器的资源没了,不影响另一个资源

#编辑配置文件
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_ds.conf
upstream static {
        server 172.16.1.7:80;
}

upstream java {
        server 172.16.1.8:8080;
}

server {
        listen 80;
        server_name pic.lzy.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;
        }
}

[root@lb01 ~]# mkdir -p /code

#编辑整合后的index.html
[root@lb01 ~]# cat /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.lzy.com/java_test.jsp",
        success: function(data){
                $("#get_data").html(data)
        },
        error: function() {
                alert("哎呦喂,失败了,回去检查你服务去~");
        }
        });
});
</script>
        <body>
                <h1>测试动静分离</h1>
                <img src="http://pic.lzy.com/cjk.gif">
                <div id="get_data"></div>
        </body>
</html>

自己的配置:

在这里插入图片描述
在这里插入图片描述

小提示:

把照片的路径写对:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKrzPaYf-1675614938680)(456759B359E74611A1351C9D860B4369)]

(6)在浏览器中测试

在浏览器中输入ds.oldboy.com 页面直接返回的是静态和动态的页面

小总结:

本次实验的目的:

(1)实现动静分离
(2)在一个网页中同时出现动态资源和静态资源,两种资源互不影响

4. Nginx资源分离场景实践

(1)环境准备
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BNRYD860-1675614938680)(0B0B83A4B01E4C2EBB493C10E76CE0C9)]

(2)配置后端web01的Nginx配置 并创建响应的目录和文件

nginx的配置:

[root@web01 conf.d]# vim sj.conf
server {
        listen 9090;
        location / {
                root /code/android;
                index index.html;
        }
}

server {
        listen 9091;
        location / {
                root /code/iphone;
                index index.html;
        }
}

server {
        listen 9092;
        location / {
                root /code/pc;
                index index.html;
        }
}

创建响应的目录文件:

[root@web1 ~]# mkdir /code/{android,pc,iphone} -p      

[root@web1 ~]# echo "a" > /code/android/index.html    
[root@web1 ~]# echo "pc" > /code/pc/index.html 
[root@web1 ~]# echo "ipone" > /code/ipone/index.html  

重载nginx:

[root@web1 ~]# systemctl reload nginx  
或者  
[root@web1 ~]# ngixn -s reload  

(3) 在负载均衡lb01上的nginx配置,lb01在/etc/nginx/conf.d/sj.conf 下书写配置

[root@lb01 conf.d]# vim /etc/nginx/conf.d/proxy_sj.conf
upstream android {
        server 172.16.1.7:9090;
}

upstream iphone {
        server 172.16.1.7:9091;
}

upstream pc {
        server 172.16.1.7:9092;
}

server {
        listen 80;
        server_name sj.lzy.com;
        charset 'utf-8';

        location / {

                #如果客户端来源是Android则跳转到Android的资源;
                if ($http_user_agent ~* "Android") {
                        proxy_pass http://android;
                }

                #如果客户端来源是Iphone则跳转到Iphone的资源;
                if ($http_user_agent ~* "Iphone") {
                        proxy_pass http://iphone;
                }

                #如果客户端是IE浏览器则返回403错误;
                if ($http_user_agent ~* "MSIE") {
                        return 403;
                }

                #默认跳转pc资源;
                proxy_pass http://pc;
        }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-32X7Nuy5-1675614938681)(2933E8CB626447A69CEA80D00CB901FD)]
在这里插入图片描述

Firefox 火狐的名字
MSIE ie浏览器

(4)用浏览器进行测试

在这里插入图片描述

(5)实现跳转不同的页面(在lb01上修改配置文件)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SCOFvdgf-1675614938683)(06AB50961B65414F9869BA832BAEE9E5)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CGb5A0rZ-1675614938684)(FC3496B295A749FBAE3A224A52EBBE73)]

动静分离,单台服务器实现动静分离

	location / {
		root /code/wordpress;
		index.php;
	}
	location ~* ^.*\.(png|jpg|mp4|)${
		root /code/wordpress/images;
		gzip on;
		.....
	}
	location ~ \.php$ {
		fastcgi_pass 127.0.0.1:9000;
		.....
	}

资源分离实际线上的配置(不同的客户端访问不同的页面)

server {
        listen 80;
        server_name   www.oldboy.com;
        if ($http_user_agent ~* "Android|Iphone") {
                rewrite ^/$ https://sj.oldboy.com redirect;
        }       
}

5. Nginx Rewrite重写

5.1 Rewrite基本概述

伪静态是开发写好的,拿过来直接include引用一下就好了

apache和nginx的rewrite是不一样的,是有区别的,写法不一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ZNGI822-1675614938684)(036EEBB249724F6CA687B376DF681FF2)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KdJ8PXzZ-1675614938685)(19F65D96160840DAA32C301DD1A02AD3)]

5.2 Rewrite 标记Flag

在这里插入图片描述

rewrite指令根据表达式来重定向URL,或者修改字符串。可以应用于server、location、if环境下。每种rewrite指令最后面跟一个flag标记,支持的flag标记有如下表格所示:
flag
last	本条规则匹配完成后,停止匹配,不在匹配后面的规则
break	本条规则匹配完成后,停止匹配,不在匹配后面的规则
redirect	返回302临时重定向, 地址栏会显示跳转后的地址
permanent	返回301永久重定向, 地址栏会显示跳转后的地址

(1)break和last区别:

server {
    listen 80;
    server_name rewrite.oldboy.com;
    root /code;

    location ~ ^/break {
        rewrite ^/break /test/ break;
    }
    location ~ ^/last {
        rewrite ^/last /test/ last;
    }
    location /test/ {
            default_type application/json;
            return 200 "ok";
    }

}

break:

	1.请求rewrite.oldboy.com/break
		首先:会去查找本地的/code/test/index.html;
			如果找到了,则返回/code/test/index.html的内容;
			如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403

last:

	1.请求rewrite.oldboy.com/last
		首先:会对当前server重新的发起一次请求,rewrite.oldbo.com/test/
			如果有location匹配上,则直接返回该location的内容。
			如果没有location匹配,/code/test/index.html;

自我总结:


break  如果在/code/test/找index.html,如果这个路径下有这文件,这个规则成立
然后才从新发起请求rewrite.oldboy.com/test 向后面进行匹配,如果没有匹配到location
则默认返回真实路径下的内容(index.html的内容)

last  如果请求last,重新向server发起一次请求rewirte.oldboy.com/test
然后往下面进行匹配,如果匹配到location则返回结果。如果没有匹配到,
则默认返回真实路径下的内容(/code/test/index)

在这里插入图片描述

(2)redirect和permanent区别【都是一个跳转】 (实现https)

redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。(临时跳转)

permanent:第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。(永久跳转)

[root@web01 conf.d]# vim rewrite.conf
server {
    listen 80;
    server_name rewrite.oldboy.com;
    root /code;

   location /oldboy {
        #rewrite ^(.*)$  https://www.xuliangwei.com redirect;
        rewrite ^(.*)$  https://www.xuliangwei.com permanent;
	}
}
[root@web01 conf.d]# cat rewrite.conf 
server {
        listen 80;
        server_name rewrite.lzy.com;
        root /code;

        location /test {
                rewrite ^(.*)$  http://www.oldboy.com redirect;
                #rewrite ^(.*)$  http://www.oldboy.com permanent;
                #return 301 http://www.oldboy.com;
                #return 302 http://www.oldboy.com;
        }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v7GeEnaS-1675614938687)(FB38F1C906774DE99E65E4D6E099C7D2)]

redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。

permanent: 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。

5.3 Rewrite 规则实践

(1)用户访问/abc/1.html实际上真实访问是/ccc/bbb/2.html

#http://www.lzy.com/abc/1.html  ==>  http://www.lzy.com/ccc/bbb/2.html

#1.准备真实访问路径
[root@web03 ~]# mkdir /code/ccc/bbb -p
[root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html

#2.Nginx跳转配置
[root@web03 ~]# cd /etc/nginx/conf.d/
[root@web03 conf.d]# cat ccbb.conf 
server {
        listen 80;

        location / {
                root /code;
                index index.html;
        }
        location /abc {
                rewrite (.*) /ccc/bbb/2.html redirect;
                #return 302 /ccc/bbb/2.html;
        }
}

#3.重启Nginx服务
[root@web03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web03 conf.d]# nginx -s reload

(2)用户访问/2018/ccc/bbb/2.html实际上访问的是/2014/ccc/bbb/2.html

##http://www.lzy.com/2018/ccc/2.html  ==>  http://www.lzy.com/2014/ccc/bbb/2.html

#1.准备真是的访问路径
[root@web03 conf.c]# mkdir /code/2014/ccc/bbb -p 
[root@web03 conf.c]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html

#2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf 
server {
        listen 80;

        location / {
                root /code;
                index index.html;
        }
        location /2018 {
                rewrite ^/2018/(.*)$ /2014/$1 redirect;
        }
}

#3.重启nginx服务
[root@web03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web03 conf.d]# nginx -s reload

(3)用户访问/test实际上真实访问的是https://www.oldboy.com

#1.Nginx跳转配置
[root@web03 conf.d]# cat test.conf 
server {
        listen 80;

        location /test {
                rewrite (.*) https://www.oldboy.com redirect;
        }
}

#2.重启nginx服务
[root@web03 conf.d]# nginx -s reload

在这里插入图片描述

(4)用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html

#http://www.lzy.com/couese-11-22-33.html  ==>  http://www.lzy.com/course/11/22/33/course_33.html

#1.准备真实的访问路径
[root@web03 ~]# mkdir /code/course/11/22/33 -p
[root@web03 ~]# echo "curl docs.etiantian.org" > /code/course/11/22/33/course_33.html

#2.Nginx跳转配置
[root@web03 conf.d]# cat test.conf 
server {
        listen 80;
        root /code;
        index index.html;
        location / {
                #灵活配法
                rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
                #固定配法
                #rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
        }
}

#3.重启nginx服务
[root@web03 conf.d]# nginx -s reload
#http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html
#http://www.bgx.com/course-44-55-66.html ==> http://www.bgx.com/course/44/55/66/course_66.html	

location ~ ^/course {
        rewrite (.*)-(.*)-(.*)-(.*)\.(.*) /$1/$2/$3/$4/$1_$4.$5 break;

在这里插入图片描述
在这里插入图片描述

(5)将http请求,跳转到https(用的最多的一种)

#Nginx跳转配置
server {
        listen 80;
        server_name www.oldboy.com;
        rewrite ^(.*) https://$server_name$1 redirect;
        #return 302 https://$server_name$request_uri;
}       

server {
        listen 443;
        server_name www.oldboy.com;
        ssl on;
}

在这里插入图片描述

错误页跳转:

server {
        listen 80;
        root /code;
        location /test {
                rewrite (.*) https://www.oldboyedu.com redirect;
        }

        error_page 403 404 500 501 502 @error_test;
        location @error_test {
        rewrite ^(.*)$ /404.html break;
        }
}

知识扩充:rewrite 日志开启调试

在这里插入图片描述

6. 知识点总结

动静分离
rewrite
	rewrite 正则表达式   替换成什么内容    标记
	last
	break
	redirect
	permanent
rewrite怎么开启日志

https单台
proxy
	web01
	web02
	

wordpress如何配置伪静态	
zh怎么配置伪静态
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值