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

news2024/9/21 12:30:14

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

  • 9. 基于uri实现动静分离、业务模块分离调度企业案例(参考书籍)
  • 10.基于user_agent及浏览器实现转发(参考书籍)
  • 11.根据文件扩展名实现代理转发
  • 12. Nginx负载均衡监测节点状态
  • 13.proxy_next_upstream 健康检查参数

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1553086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA高端项目:解码索尼IMX327 MIPI相机转HDMI输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 6、工程源码…

C/C++ ③ —— C++11新特性

1. 类型推导 1.1 auto auto可以让编译器在编译期就推导出变量的类型 auto的使⽤必须⻢上初始化,否则⽆法推导出类型auto在⼀⾏定义多个变量时,各个变量的推导不能产⽣⼆义性,否则编译失败auto不能⽤作函数参数在类中auto不能⽤作⾮静态成员…

构建智能未来:探索AI人工智能产品业务架构的创新之路

随着人工智能技术的快速发展,AI人工智能产品在各行各业中扮演着越来越重要的角色。本文将深入探讨AI人工智能产品业务架构的创新之路,探讨如何构建智能未来的商业生态。 ### AI人工智能产品业务架构的重要性 AI人工智能产品的业务架构是支撑产品成功的…

Zookeeper的选主流程

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后&#xff…

学习vue3第十二节(组件的使用与类型)

1、组件的作用用途 目的: 提高代码的复用度,和便于维护,通过封装将复杂的功能代码拆分为更小的模块,方便管理, 当我们需要实现相同的功能时,我们只需要复用已经封装好的组件,而不需要重新编写相…

信息系统项目管理师——第10章项目进度管理(重要)

本章节内容属于10大管理知识领域中的重中之重,选择、案例、论文都会考,需要完全掌握。 选择题,大概考3分左右,有的时候会考一点理论大多数都是考计算。 案例题,必考内容,各种类型的计算题,网络图…

基于SpringBoot的“招聘信息管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“招聘信息管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 企业招聘界面…

免费软件“蓝莓投屏”:支持多个Airplay同时镜像的投屏软件。

引言: 由于定制盒子(3288)不支持投屏功能(有些5.1不支持,安卓4.X本身也不支持),需要借助第三方的投屏软件来实现这一需求。所以,研究半天,蓝莓投屏以其简便易用的特性脱颖而出,只需…

《QT实用小工具·二》图片文字转base64编码

1、概述 源码放在文章末尾 base64编码转换类 图片转base64字符串。base64字符串转图片。字符转base64字符串。base64字符串转字符。后期增加数据压缩。Qt6对base64编码转换进行了重写效率提升至少200%。 下面是demo演示: 项目部分代码如下所示: #ifn…

【漏洞复现】浙大恩特客户资源管理系统 Quotegask_editAction-sql接口处存在SQL注入漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深,制药行业作为国民经济的重要支柱之一,也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来,制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

FPGA 图像边缘检测(Canny算子)

1 顶层代码 timescale 1ns / 1ps //边缘检测二阶微分算子:canny算子module image_canny_edge_detect (input clk,input reset, //复位高电平有效input [10:0] img_width,input [ 9:0] img_height,input [ 7:0] low_threshold,input [ 7:0] high_threshold,input va…

【漏洞复现】chatgpt pictureproxy.php SSRF漏洞(CVE-2024-27564)

0x01 漏洞概述 ChatGPT pictureproxy.php接口存在服务器端请求伪造 漏洞(SSRF) ,未授权的攻击者可以通过将构建的 URL 注入 url参数来强制应用程序发出任意请求。 0x02 测绘语句 fofa: icon_hash"-1999760920" 0x03 漏洞复现 G…

element-ui 自定义点击图标/文本/按钮触发el-date-picker时间组件,不使用插槽

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1. 图片预览 2.上代码 2.1html <el-button class"hide_input" size"small"><svg t"1711608996149" class"icon" viewBox"0 0 1024 1024" version"1.1"…

中国象棋AI在线对弈游戏源码

源码介绍 这是一款html5小游戏&#xff0c;主要功能在于js&#xff0c;带一套皮肤、内置ai算法&#xff0c;有能力的可以自行修改。 源码截图 下载地址 链接&#xff1a;https://pan.baidu.com/s/1fYp1HWsd91nJOdX1M8RFtQ?pwdh2iz 提取码&#xff1a;h2iz

最近Sentinel-2下载网站好像有点问题

最近Sentinel-2下载网站好像有点点问题&#xff0c;基本属于打不开的状态&#xff01; 这也难怪&#xff0c;Sentinel提供了全世界最好的免费遥感资源。其受欢迎程度可以想象的到&#xff01;这么多人访问网站&#xff0c;网站压力可以说是巨大的。这可是全世界的并发访问&…

快速上手Spring Cloud五:Spring Cloud与持续集成/持续部署(CI/CD)

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

力扣 718. 最长重复子数组

题目来源&#xff1a;https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/ C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义。dp[i][j] &#xff1a;以下标i - …

22.计算机中的数据存储

文章目录 一、计算机中的数据存储二、十进制1、十进制加法2、十进制减法 三、什么是二进制&#xff1f;二进制的运算过程 四、常见的进制五、计算机为什么要用二进制存储数据&#xff1f;六、进制之间的转换1、任意进制转十进制1&#xff09;二进制101转十进制8421快速转换法 2…

自动发卡平台源码优化版配套免签个人支付宝微信插件

这款免签个人支付宝微信插件&#xff0c;配套的是 自动发卡平台源码优化版&#xff0c;支持个人免签支付 其他系统的不支持&#xff01;