Day60-Nginx反向代理与负载均衡基于URI及USER_AGENT等跳转讲解

9. 基于uri实现动静分离、业务模块分离调度企业案例(参考书籍)

(12)动静分离,手机PC跳转,注册,登录分离,中文,英文分离,上传、下载、浏览分离。(location和if判断)
在这里插入图片描述

根据url中的目录地址实现代理转发
1)动静分离
2)不同业务分离
3)不同客户端设备

如何让网页中的图片地址和www主域名不一样?

  1. 购买一个和blog.etiantian.org不一样的域名oldboy.com
  2. img1.oldboy.com #作为图片域名
    img2.oldboy.com #china cache
    img3.oldboy.com #阿里云加速
  3. 把图片上传CDN(图片放进去)。
  4. 发文章,嵌入图片的URL地址。
  5. 发布。

blog.etiantian.org
img1.oldboy.com

方法2:企业采纳的方法

  1. 购买一个和blog.etiantian.org不一样的域名oldboy.com

  2. img1.oldboy.com #作为图片域名
    img2.oldboy.com #china cache
    img3.oldboy.com #阿里云加速

  3. 上传服务修改,有一个静态域名列表,从本地上传后,
    img1.oldboy.com/a.jpg
    ​img2.oldboy.com/b.jpg #(wordpress 自己修改上传图片地址为你想要的域名)
    ​http://img2.oldboy.com/wp-content/uploads/2021/07/1920-1080%E8%80%81%E7%94%B7%E5%AD%A9%E6%95%99%E8%82%B2%E8%A7%86%E9%A2%91LOGO-logoQQ%E7%BE%A4-Linux%E8%AF%BE%E7%A8%8B-v1-1024x77.png

  4. 发布。

先进行企业案例需求梳理:
当用户请求www.etiantian.org/upload/xx地址时,实现由上传服务器池(upload_pools)处理请求。
当用户请求www.etiantian.org/static/xx地址时,实现由静态服务器池(static_pools)处理请求。
除此以外,对于其他访问请求,全都由默认的动态服务器池(default_pools)处理请求。

根据URL目录地址转发的应用场景
根据http的URL进行转发的应用情况,被称为第7层(应用层)的负载均衡,而LVS的负载均衡一般用于TCP等的转发,因此被称为第4层(传输层)的负载均衡。
在企业中,有时希望只用一个域名对外提供服务,不希望使用多个域名对应同一个产品业务,此时就需要在代理服务器上通过配置规则,使得匹配不同规则的请求会交给不同的服务器池处理。这类业务有:
1)业务的域名没有拆分或者不希望拆分,但希望实现动静分离、多业务服务分离。
2)不同的客户端设备(例如:手机和PC端)使用同一个域名访问同一个业务网站,就需要根据规则将不同设备的用户请求交给后端不同的服务器处理,以便得到最佳的用户体验。这也是非常重要的,接下来就讲解相关案例。
【动静分离】服务说明列表:

节点IP及端口测试地址字符串为代表业务
web0110.0.0.7:80http://www.etiantian.org/static/index.htmlstatic_pools
web0210.0.0.8:80http://www.etiantian.org/upload/index.htmlupload_pools
web0210.0.0.9:80http://www.etiantian.org/index.html
http://www.etiantian.orgdefault_pools

对应核心配置:

[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]# systemctl restart nginx
[root@lb01 conf.d]# cat 01_www.etiantian.org.conf 
       upstream static_pools {
               server 10.0.0.7:80  weight=1;
        }
        upstream upload_pools {
               server 10.0.0.8:80  weight=1;
        }
        upstream default_pools {
               server 10.0.0.9:80  weight=1;
        }
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / { 
            proxy_pass http://default_pools;
            proxy_set_header Host $http_host;

    }
    location /static/ { 
            proxy_pass http://static_pools;
            proxy_set_header Host $http_host;

    }
    location /upload/ { 
            proxy_pass http://upload_pools;
            proxy_set_header Host $http_host;

    }
}

部署web01

[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# mkdir /data/www/static -p
[root@web01 conf.d]# echo static >/data/www/static/index.html
[root@web01 conf.d]# curl -H "host:www.etiantian.org" 172.16.1.7/static/
static
[root@web01 conf.d]# cat 03_www.etiantian.org.conf 
server{
       listen 172.16.1.7:80;
       server_name www.etiantian.org;
       root /data/www;
       location / {
       root /data/www;
           index index.php index.html;
     }
}

部署web02

[root@web02 conf.d]# cat 03_www.etiantian.org.conf 
server{
      listen 172.16.1.8:80;
      server_name www.etiantian.org;
      root /data/www1;
      location / {
          index index.php index.html;
    }
}
server{
      listen 172.16.1.9:80;
      server_name www.etiantian.org;
      root /data/www2;
      location / {
          index index.php index.html;
    }
}

[root@web02 conf.d]# ifconfig eth1:1 172.16.1.9 up
[root@web02 conf.d]# mkdir /data/{www1,www2}
[root@web02 conf.d]# mkdir /data/www1/upload
[root@web02 conf.d]# mkdir /data/www2/default
[root@web02 conf.d]# echo upload >/data/www1/upload/index.html
[root@web02 conf.d]# echo default >/data/www2/default/index.html
	
[root@web02 conf.d]# nginx -t 
[root@web02 conf.d]# systemctl restart nginx
	
[root@web02 conf.d]# curl -H "host:www.etiantian.org" 172.16.1.8/upload/
upload
[root@web02 conf.d]# curl -H "host:www.etiantian.org" 172.16.1.9/default/
default

LB01:检查

[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5/static/
static
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5/default/
default
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5/upload/
upload

[root@lb01 conf.d]# grep www /etc/hosts
172.16.1.5 lb01 test.etiantian.org www.etiantian.org

[root@lb01 conf.d]# curl http://www.etiantian.org/upload/
upload
[root@lb01 conf.d]# curl http://www.etiantian.org/static/
static
[root@lb01 conf.d]# curl http://www.etiantian.org/default/
default

实践动静分离
部署01:

[root@web01 conf.d]# cat blog.etiantian.org.conf 
server {
    listen 172.16.1.7:80;
    server_name blog.etiantian.org;
    root /data/blog;   #正常站点目录
    access_log  /var/log/nginx/mirrors.etiantian.org.access.log.gz  main gzip=9 buffer=32k flush=5s;
#index index.php;
location / {
    root /data/blog; 
    index index.php index.html;
}
location ~ \.php$ {
    root /data/blog; 
fastcgi_pass 127.0.0.1:9000;										
# 将请求转给9000端口的应用程序处理
    fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;	
# 告诉php我们需要被解析的文件在哪个目录,是哪个文件
include fastcgi_params;	
 }
 }

server{
      listen 172.16.1.9:80;
      server_name blog.etiantian.org;
      root /data/static;
      location / {
          index index.php index.html;
    }
}

#静态和动态如果独立服务器,可以各自挂载各自的
#mount -t nfs 172.16.1.31:/data/blog /data/static

# 此处是静态和动态混杂在一台服务器上
[root@web01 conf.d]# ln -s /data/blog/wp-content/uploads /data/static
[root@web01 conf.d]# ifconfig eth1:1 172.16.1.10 up

后面配置独立服务器了。

location /uploads/ {
         proxy_pass http://static/wp-content;
         proxy_set_header Host $http_host;
  }
1
[root@lb01 conf.d]# curl -H "host:blog.etiantian.org" 10.0.0.5/wp-content/uploads/
1
http://blog.etiantian.org/wp-content/uploads/2021/07/%E6%BD%98%E6%99%93%E5%A9%B7.jpg	

/data/static/wp-content/uploads/2021/07/Origami-1.1.0.zip 
/data/blog/wp-content/uploads/

【业务分离】服务说明列表:

节点IP及端口测试地址字符串为代表业务
web0110.0.0.10:80http://www.etiantian.org/register/index.htmlregister_pools
web0210.0.0.11:80http://www.etiantian.org/login/index.htmllogin_pools
web0210.0.0.9:80http://www.etiantian.org/index.html
http://www.etiantian.orgdefault_pools

www.etiantian.org;
默认访问www首页

location / {
			index index.html;
		}
location /register/ {
	proxy_pass http://register;
     proxy_set_header Host $http_host;
}

location /login/ {
	proxy_pass http://login;
     proxy_set_header Host $http_host;
}	

web01:

[root@web01 ~]# cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
		listen 80;
		server_name www.etiantian.org;
		root /data/www;
location / {
		index index.html;
	}
}
[root@web01 ~]# mkdir /data/www
[root@web01 ~]# echo "register_web01..." > /data/www/index.html  
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx

web02:

[root@web02 ~]# vim /etc/nginx/conf.d/www.etiantian.org.conf
	server {
		listen 80;
		server_name www.etiantian.org;
		root /data/www;
location / {
		index index.html;
	}
}
[root@web02 ~]# mkdir /data/www
[root@web02 ~]# echo "login--web02.." >> /data/www/index.html

[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx

负载均衡:

[root@lb01 conf.d]# cat  /etc/nginx/conf.d/www.etiantian.org.conf
upstream register {
	server 172.16.1.7:80;
}

upstream login {
	server 172.16.1.8:80;
}

server {
	listen 80;
	server_name www.etiantian.org;
location /register {
	proxy_pass http://register/;
            include proxy.conf;
}

location /login {
	proxy_pass http://login/;
            include proxy.conf;
}
}

location /login 添加/ 和不添加/ 有什么区别?

location /register/ {
	proxy_pass http://backup;
                include proxy.conf;
	}
	
#相当于访问:	
http://backup/register/;
#Nginx负载均衡到后端节点:http://backup/register/index.html #区别在这里	

10.基于user_agent及浏览器实现转发(参考书籍)

【基于客户端设备】服务说明列表:

节点IP及端口测试地址字符串为代表业务
web0110.0.0.7:80客户端(PC、谷歌浏览器)pc_pools
web0210.0.0.8:80iphone(谷歌f12模拟或者手机访问)phone_pools

使用相同的域名,根据来源设备调度到不同的服务器集群
web01:pc

[root@web01 ~]# cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/agent;
location / {
	index index.html;
    }
}

[root@web01 ~]# mkdir /data/agent/
[root@web01 ~]# echo "PC....web01" > /data/agent/index.html

web02:

[root@web02 ~]# cat  /etc/nginx/conf.d/www.etiantian.org.conf
server {
	listen 80;
	server_name www.etiantian.org;
	root /data/agent;
location / {
	index index.html;
}
}
[root@web02 ~]# mkdir /data/agent -p
[root@web02 ~]# echo "Phone..web02" > /data/agent/index.html
[root@web02 ~]# nginx -t
[root@web02 ~]# systemctl reload nginx

负载均衡:

[root@lb01 conf.d]# cat 01_www.etiantian.org.conf
upstream pc {
	server 172.16.1.7:80;
}

upstream iphone {
	server 172.16.1.8:80;
}

server {
	listen 80;
	server_name www.etiantian.org;
	location / {
        proxy_set_header Host  $Http_host;
	# 判断如果来源是手机则调度到phone集群组
	if ($http_user_agent ~* "iphone|android|ipad" ) {
		proxy_pass http://iphone;
	}
	if ($http_user_agent ~* "firefox|MSIE|Chrome|Trident") {
	#return 200 'Please Change Browser.....';
	return 302 'http://www.oldboyedu.com';
	}
	# 如果来源不是手机,则调度到pc集群组
	proxy_pass http://pc;
     }
}

提示:可以使用curl的-A功能模拟User_agent。谷歌f12模拟iphone。

[root@lb01 conf]# curl -A "android" http://www.etiantian.org/upload/
upload server
[root@lb01 conf]# curl -A "iphone" http://www.etiantian.org/static/            
static server

[root@lb01 conf.d]# curl -A "iphone" -H "host:www.etiantian.org" 10.0.0.5
iphone or android
[root@lb01 conf.d]# curl -A "android" -H "host:www.etiantian.org" 10.0.0.5
iphone or android
[root@lb01 conf.d]# 
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5
pc电脑或谷歌浏览器

[root@lb01 conf.d]# curl -A "Chrome" -H "host:www.etiantian.org" 10.0.0.5
Please Change Browser.....[root@lb01 conf.d]# 
[root@lb01 conf.d]# curl -A "firefox" -H "host:www.etiantian.org" 10.0.0.5
Please Change Browser.....[root@lb01 conf.d]# 
[root@lb01 conf.d]# curl -A "MSIE" -H "host:www.etiantian.org" 10.0.0.5
Please Change Browser.....[root@lb01 conf.d]# 

11.根据文件扩展名实现代理转发

动静分离时已经实现

12. Nginx负载均衡监测节点状态

扩展作业:使用第三方模块监测 Nginx负载均衡监测节点状态

13.proxy_next_upstream 健康检查参数

当Nginx接收后端服务器返回proxy_next_upstream参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如500、502、503、504,此参数可以提升用户的访问体验,具体配置如下:

server {
       listen       80;
       server_name  www.etiantian.org;
       location / {
        proxy_pass http://static_pools;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        include proxy.conf;
}
  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值