【Nginx系列】基于请求头的分发

在这里插入图片描述

文章目录

    • 一、HTTP请求头和响应头
    • 二、基于请求头的分发
      • 2.1、基于host分发
      • 2.2、基于域名的分发测试:
      • 2.3、基于开发语言分发
      • 2.4、基于浏览器分发
      • 2.5、基于源IP分发

🌈你好呀!我是 山顶风景独好
🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊
🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。
📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟
🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

前置文章:【Nginx系列】分发算法
前面的分发方式都是基于一个集群分发的,nginx是一个基于7层的分发也就是可以实现基于主机头的分发,这种分发一般都是用于多集群环境中。

一、HTTP请求头和响应头

客户端浏览器开发者工具network工具下,获取请求的请求头信息如下所示:

Request URL: http://192.168.0.40	#请求的URL
Request method:GET	#请求的方法,GET是获取数据
Remote address:192.168.0.40:80#远程主机的地址
Status code: 200 OK	#请求代码,200表示正常,如果页面无法打开会显示404,403等
Version: HTTP/1.1#HTTP协议的版本


Response headers (235 B)	#响应头	
Accept-Ranges:bytes#接受范围,如果出现此字段表示,这是一个续传的下载(断点续传),bytes表示服务器可接受范围请求的单位是bytes,none表示不支持
Connection:keep-alive #是否支持长连接,从HTTP1.1开始默认
Content-Length:5	#返回的数据长度,单位为字节
Content-Type:text/html#页面类型,文本、图片、视频、音频
Date:Fri, 29 Feb 2024 01:37:17 GMT#返回的时间
ETag:"5e4e2e62-5"#验证标签,用来帮助控制缓存验证,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值,并通过 ETag 返回给浏览器,浏览器把对应的哈希值和A同时缓存在本地,当下次再次向服务器请求A时,会把这个哈希值发送给服务器,服务器再次计算A的哈希值并和刚刚接收到的哈希值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端
Last-Modified:Fri, 29 Feb 2024 06:59:46 GMT#服务器认定的资源做出修改的日期及时间。 它通常被用作判断接收到的或者存储的资源是否一致。由于精确度比ETag要低,所以这是一个备用机制。
Server:nginx/1.15.12	#服务器的软件类型和版本


Request headers (355 B)	#请求头
Accept:text/html,application/xhtml+xm… #接受的数据类型
Accept-Encoding:gzip, deflate	#是否支持压缩,及类型
Accept-Language:en-US,en;q=0.5	#语言环境
Cache-Control:no-cache#缓存实现的机制。
Connection:keep-alive
Host:192.168.0.40#访问的名称(主机名还是IP地址),虚拟主机就是依靠这个字段来判断返回哪个页面内容
Pragma:no-cache#http1.0使用的字段,如果是no-cache与cache-control功能一致
Upgrade-Insecure-Requests:1 #客户端优先选择加密及带有身份验证的响应
User-Agent:Mozilla/5.0 (X11; Linux x86_64…) Firefox/60.0	#客户端浏览器类型和版本

以上只是对在发者工具中看到的内容进行的说明,有需要的同学,或者是如果以后看到了其它额外字段的内容可以参看 HTTP官网,里面有详细的说明

二、基于请求头的分发

2.1、基于host分发

基于host分发这种分发方式适用于多集群分发。例如:一个公司有多个网站,每个网站就是一个集群。

#nginx分发器设置
http {
    upstream web1 {   # 名为web1的反向代理群组
        server 192.168.0.42;
    }
    upstream web2 {   # 名为web2的反向代理群组
        server 192.168.0.43;
    }
    server {    # web1虚拟主机
        listen 80;
        server_name www.web1.com;    # 基于域名分发必须有域名
        location / {
            proxy_pass http://web1; 
        }
    }
    server {    # web2虚拟主机
        listen 80;
        server_name www.web2.com;    # 基于域名分发必须有域名 
        location / {
            proxy_pass http://web2; 
        }
    }
}

2.2、基于域名的分发测试:

#客户端测试机设置
[root@client ~]# vim /etc/hosts
168.0.40 www.web1.com
192.168.0.40 www.web2.com
[root@client ~]# curl www.web1.com
web1
[root@client ~]# curl www.web2.com
web2

2.3、基于开发语言分发

这种分发方式适用于混合开发的网站,某些大型网站既有php也有jsp,就可以基于开发语言分发。

# 192.168.0.40分发器上nginx配置
http {
    upstream php {
        server 192.168.0.42; 
    }
    upstream html {
        server 192.168.0.43;
    }
    server {
        location ~* \.php$ {    # 以php结尾的
            proxy_pass http://php;
        } 
        location ~* \.html$ {   # 以html结尾的
            proxy_pass http://html;
        }
    }
}

测试验证:

# 在web1这台主机上安装php环境
[root@web1 ~]# dnf -y install php# 安装php
# 启动apache,自带php
[root@web1 ~]# systemctl restart httpd

# 编写php文件
[root@web1 ~]# echo "<?php phpinfo(); ?>" > /var/www/html/index.php

# 访问192.168.0.40/index.php 可以看到php-info信息页面
# 访问192.168.0.40/index.html 可以看到web2

2.4、基于浏览器分发

这种基于浏览器的分发,常应用于PC端和移动端区分或浏览器适配。

部署第三台业务主机

[root@web3 ~]# dnf install httpd -y
[root@web3 ~]# echo web3 > /var/www/html/index.html
[root@web3 ~]# systemctl restart httpd
[root@web3 ~]# curl localhost

配置基于浏览器的分发

upstream curl { server 192.168.0.42; }
upstream firefox { server 192.168.0.43; }
upstream other { server 192.168.0.44; }
server {
    listen 80;
    server_name www.web1.com;
    location / {
        proxy_pass http://other;
        if ( $http_user_agent ~* curl ) {
            proxy_pass http://curl;
        }
        if ( $http_user_agent ~* firefox ) {
            proxy_pass http://firefox;
        }
    }
}

测试

使用不同的浏览器访问分发器会得到不同的页面

2.5、基于源IP分发

像腾讯新闻,网易,58同城,真爱,百合,赶集,智联等等很多网站,这种网站都有一个特性,你一访问,就知道你的位置,然后根据你的位置,给你推荐或者展示相关内容。很多APP也是这样的,只不过,网站是通过你的源IP来确定你的位置,APP的则更为直接一些,通过定位数据获取位置。比如说,你去新闻类的网站,这些网站的本地新版板块显示的都是你所在地的相关信息。也就是说我们可以让服务器对源IP进行判断,根据判断的结果不同,再返回不同的数据给客户端;如果判断不出来,就按照默认去处理。如果想实现基于源IP的分发我们需要一个叫geo的参数,这个参数可以要根据客户端ip访问到不同的server,它是通过一个叫ngx_http_geo_module模块提供的。默认情况下,nginx安装时是会自动加载这个模块,除非安装时人为的手动添加–without-http_geo_module。

配置

upstream bj.server {
    server 192.168.0.42;    # web01
}
upstream sh.server {
    server 192.168.0.43;      # web02
}
upstream default.server {
    server 192.168.0.44;      # web03
}
geo $geo {       # IP库
    default default;
    192.168.0.10/32 bj;    # 北京
    192.168.0.20/32 sh;   # 上海
}
server {
    listen  80;
    server_name   www.web1.com;

    location / {
        proxy_pass http://$geo.server$request_uri;
    }
}

如果客户端地址是0.10 就访问北京,如果是0.20就访问上海,如果不是0.10也不是0.20就按照default处理,线上环境这里面就是个IP库 我现在没有ip库只能写两个IP来代表看下后面的掩码是32表示这一个网段只有这一个IP吧,当然你也可以换成网段。

http后面加上$request_uri的原因就是避免客户 找你拿数据的时候一指定URI你就无法正常代理了,目的就是保证客户在访问类似http://www.a.com/a/b/c/d.jpg这样的网址的时候可以正常访问 也就是说当用户请求的URL当中的URI跟着变化的时候你的代理服务器一样可以正常工作

重启nginx服务器,切换到客户端测试

[root@client ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.10  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::2386:3dbd:531c:7bc1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a6:ad:95  txqueuelen 1000  (Ethernet)
        RX packets 1177  bytes 280850 (274.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1115  bytes 111602 (108.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 7080  bytes 601912 (587.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7080  bytes 601912 (587.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# nmcli connection modify ens33 ipv4.addresses 192.168.0.20/24 ipv4.method manual autoconnect yes
[root@client ~]# nmcli connection down ens33
成功停用连接 "ens33"(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/16)

[root@client ~]# nmcli connection up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/17)
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# nmcli connection modify ens33 ipv4.addresses 192.168.0.30/24 ipv4.method manual autoconnect yes
[root@client ~]# nmcli connection down ens33
成功停用连接 "ens33"(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/17)

[root@client ~]# nmcli connection up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/18)
[root@client ~]# curl 192.168.0.40
web3

✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码签名证书一年的价格是多少?如何申请

代码签名证书的价格因品牌、类型及所提供的服务等因素而有所不同&#xff0c;价格通常在数千元至万余元人民币之间不等。 不同类型代码签名证书价格差异 个人代码签名证书&#xff1a;个人代码签名证书是最基础的类型&#xff0c;适用于个体开发者&#xff0c;其价格较为经济…

【Java】解决Java报错:ArithmeticException during Division

文章目录 引言一、ArithmeticException的定义与概述1. 什么是ArithmeticException&#xff1f;2. ArithmeticException的常见触发场景3. 示例代码 二、解决方案1. 检查除数是否为零2. 使用异常处理3. 使用浮点数除法4. 使用自定义方法进行安全除法 三、最佳实践1. 始终检查除数…

香草看涨期权是什么意思?

香草看涨期权是什么意思&#xff1f; 香草期权&#xff0c;听起来或许有些异国风情&#xff0c;但实际上&#xff0c;它是金融市场中一种极为基础和普遍的交易工具。所谓的“香草”&#xff0c;在金融术语中其实是比喻一种平凡、普通但不可或缺的特质&#xff0c;正如我们日常…

基于PHP+MySQL组合开发的小程序源码系统 附带完整的安装代码包以及搭建教程

系统概述 本小程序源码系统采用PHP作为服务器端脚本语言&#xff0c;MySQL作为数据存储引擎&#xff0c;充分利用两者在Web开发领域的成熟性和灵活性。PHP以其简单、直接的语法和广泛的社区支持&#xff0c;成为快速开发Web应用的首选语言之一&#xff1b;而MySQL作为关系型数…

直到第三次才遇见懂行人,教育信息化深耕者如何选对CRM

如今&#xff0c;与诸多顶尖双一流大学交流时&#xff0c;BDRJ公司的销售们底气十足。作为一家在教育圈内知名度颇高的数字内容智能服务提供商&#xff0c;BDRJ深耕国内教育行业内容管理领域二十余年&#xff0c;是国内双软认证企业&#xff0c;中国高等教育学会教育信息化分会…

计算机组成原理(四)

在同一时刻只能有一对设备使用总线&#xff0c;会发生总线的争用 面向CPU的双总线 如果外部设备和主存之间发生信息传输&#xff0c;因为媒介是CPU&#xff0c;一样会打断CPU执行程序的任务 以存储器为中心 但是存储总线和系统总线依然不能同时使用&#xff0c;都是分时使用 …

20240612每日前端-------vue3实现聊天室(一)

先上效果图 讲讲布局设计 聊天室大致分三块&#xff1a; 左边导航右边聊天界面主界面 单独调整一下样式&#xff1a;外层friend-box先调整布局为flex&#xff0c;这样方便进行自适应布局&#xff0c;增加背景色为白色&#xff0c;设置边框圆角使得外观更加美观&#xff0c;使…

【Python入门与进阶】Jupyter Notebook配置与优化

目录 1.Jupyter Notebook简介 2.Jupyter Notebook的安装 2.1 命令行安装 2.2 可视化界面安装 3.Jupyter Notebook的使用 3.1 启动 Jupyter Notebook 3.2 Jupyter Notebook 界面介绍 3.3 创建新的 Notebook 3.4 编写和运行代码单元 3.5 使用 Markdown 编写文档 3.6 保…

[大模型]GLM-4-9B-Chat WebDemo 部署

环境准备 在autodl平台中租一个4090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.1.0–>3.10(ubuntu22.04)–>12.1 接下来打开刚刚租用服务器的JupyterLab&#xff0c; 图像 并且打开其中的终端开始环境配置、模型下载和运行演示。 pip换源和安装…

Django+Vue.js怎么实现搜索功能

一.前言 类似这样的搜索功能 二.前端代码 <div class"form-container"><div class"form-group"><label for"departure-city">出发城市</label><select v-model"departureCity" id"departure-city&q…

SM3国密算法:优秀的密码散列函数

随着信息技术的飞速发展&#xff0c;信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术&#xff0c;其重要性不言而喻。中国在密码学领域也取得了显著的成就&#xff0c;其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…

H2database 未授权访问 vulhub

参考&#xff1a;H2database-未授权访问漏洞复现_h2 database connection-CSDN博客 1.工具 虚拟机&#xff1a;kalidocker java包&#xff1a;Release JNDI-Injection-Exploit v1.0 welk1n/JNDI-Injection-Exploit GitHub 这个包可能会报木马&#xff0c;如果发现没下载下…

pytest中一个场景测试的demo

注意点1&#xff1a; allure.severity 是一个装饰器&#xff0c;用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一&#xff0c;表示这个测试用例极为重要。allure.severity_level.BLOCKER&#xff1a;阻塞级别的问题&#xff0c…

element-ui将组件默认语言改为中文

在main.js中加入以下代码即可 // 引入 Element Plus 及其样式 import ElementPlus from element-plus import element-plus/dist/index.css// 引入中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn// 使用 Element Plus 并设置语言为中文 app.use(ElementPlus,…

Docker|了解容器镜像层(2)

引言 容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践&#xff0c;最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单&#xff0c;同时又非常强大。在今天的帖子[1]中&#xf…

【画板案例-工具条 Objective-C语言】

一、接下来,我们来说这个工具条啊, 1.我们先说一下刚才那个颜色的问题, 我们首先呢,第一次,在去画的时候,我现在肯定是没有颜色的, 这个时候,是没有颜色的啊,只是一个黑色,是默认的颜色, 那我们现在一上来,希望让ViewDidLoad:时候,让它变成第一个按钮的颜色,…

python使用matplot库绘图颜色表

matlpot的color参数可以是十六进制&#xff0c;也可以是颜色描述的字符串。 下面是字符串描述的颜色表。为了颜色间要有区分度。同时要求颜色比较明显&#xff0c;特意选择一些比较有代表性的颜色&#xff0c;以供使用&#xff08;颜色由于个人需要&#xff0c;除去了红色和绿…

淘宝扭蛋机小程序:扭蛋机带来的幸福感

扭蛋机是一种具有惊喜感的潮玩娱乐方式&#xff0c;它凭借着独特的优势为消费者带来了欢乐&#xff0c;受到了消费者的喜爱。目前&#xff0c;随着互联网时代的发展&#xff0c;在线扭蛋机的热潮也随之而来&#xff01; 当下互联网科技正在不断发展中&#xff0c;为线上扭蛋机…

一文详解PaaS平台:机遇、挑战与新变革

随着信息化发展&#xff0c;数字技术与经济社会各个领域的融合逐渐深入&#xff0c;行业需求不断升级&#xff0c;逐渐呈现多样化、复杂性的态势。传统软件开发模式&#xff0c;耗时耗力&#xff0c;已经难以应对企业新形势下的业务需求。面对挑战&#xff0c;PaaS平台以其天然…