文章目录
1. 回顾知识点
四层负载均衡
四层 内核空间 转发 传输层(tcp、udp 转发 )
七层 用户空间 代理 应用层(域名匹配,路径规则控制、安全、限速、等)
转发:直接修改数据包,把来源的ip,转发是改,请求的地址改写
代理:拆到引用层,做匹配,然后由自己重新向后端发起请求。
会重新的在发起一次请求
这个研究一下拆包,转发的原理,有点不太清楚,如何进行的??? 这对个改端口ip的理解的不太清楚
2. Nginx动静分离概述
一个是代码层面来实现不同的设备实现调度
一个是nginx的层面上实现不同的设备实现调度
3. Nginx动静分离实践应用案例
环境准备:
开始实验:
(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
自己配置的:
(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
自己配置的:
(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
实现原理:
(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>
自己的配置:
小提示:
把照片的路径写对:
(6)在浏览器中测试
在浏览器中输入ds.oldboy.com 页面直接返回的是静态和动态的页面
小总结:
本次实验的目的:
(1)实现动静分离
(2)在一个网页中同时出现动态资源和静态资源,两种资源互不影响
4. Nginx资源分离场景实践
(1)环境准备
(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;
}
}
Firefox 火狐的名字
MSIE ie浏览器
(4)用浏览器进行测试
(5)实现跳转不同的页面(在lb01上修改配置文件)
动静分离,单台服务器实现动静分离
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是不一样的,是有区别的,写法不一样
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;
}
}
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怎么配置伪静态