nginx反向代理之缓存 客户端IP透传 负载均衡

一 缓存功能

缓存功能可以加速访问,如果没有缓存关闭后端服务器后,图片将无法访问,缓存功能默认关闭,需要开启。

相关选项:

​
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
 
proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
 
proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
 
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http   必须放在http语句中
 
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存
 
 
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off
#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

实验:为代理服务器开启缓存功能

① 代理服务器主配置文件的http模块中添加配置

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf   #主配置文件
proxy_cache_path /data/nginx/proyxcache   levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
#开启缓存         缓存路径              生成文件夹比例是3级  从内存中借调20M专门存放缓存  有效期120秒    最大存储空间为1g
[root@localhost ~]# mkdir /data/nginx/
[root@localhost ~]# nginx -t 


注意:路径不存在或者错误

② 子配置文件添加配置


[root@mcb-11-9 nginx]#vim /apps/nginx/conf.d/pc.conf 
[root@mcb-11-9 nginx]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@mcb-11-9 nginx]#nginx -s reload
[root@mcb-11-9 nginx]#ls /data/nginx/
proyxcache
[root@mcb-11-9 nginx]#rpm -q tree
未安装软件包 tree 
[root@mcb-11-9 nginx]#yum install tree -y

proxy_cache proxycache;
        proxy_cache_key $request_uri;
        #proxy_cache_key $host$uri$is_args$args;
        proxy_cache_valid 200 302 301 10m;
        proxy_cache_valid any 5m;

③是否有缓存

在另一台配置拖入图片

浏览器检测

去代理服务器查看缓存

只能保留,不能强刷否则,图片小时 

如何清理nginx代理服务器缓存

方法1  rm -rf 缓存目录

方法2: 第三方扩展模块ngx_cache_purge

②自定义添加响应报文头部信息

基于可以实现对后端服务器响应给客户端的报文中添加指定的响应首部字段

Syntax: add_header name value [always];
Default;
Context: http,server,location,if in location
 
#添加响应报文的自定义首部:
add_header name value [always];
 
#脚本:
add_header X-Via  $server_addr; #当前nginx主机的IP
add_header X-Cache $upstream_cache_status; #是否缓存命中
add_header X-Accel $server_name;  #客户访问的FQDN
 
 
add_header X-Via   
add_header X-Cache 
add_header X-Accel



# systemctl start httpd.service 



[root@mcb-11-9 html]#nginx -s reload
[root@mcb-11-9 html]#vim /apps/nginx/conf.d/pc.conf
[root@mcb-11-9 html]#systemctl start nginx
[root@mcb-11-9 html]#cat /apps/nginx/conf.d/pc.conf

①添加子配置文件 

② 查看新增头部字段信息 

[root@mcb11-3 html]# systemctl stop httpd.service 

二 客户端ip透传

一级代理

在Nginx中,代理客户端IP透传是指将客户端的真实IP地址(也称为远程IP地址)传递给后端服务器。这在一些情况下非常有用,例如,当Nginx作为反向代理服务器时,我们希望后端服务器能够获取到客户端的真实IP地址,而不是Nginx服务器的IP地址。

ip透视-------单向透视 11.9代表代理  11.8代表apache (此实验还需要在做一次)

在代理服务器7-1写配置文件

server{ 
        listen 80;       
        root /data/;
       server_name www.mcb.com;
       add_header X-Via   $server_addr;
       add_header X-Cache $upstream_cache_status;
       add_header X-Accel $server_name;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       location  / {
       proxy_pass http://192.168.11.8;
       }
}

当前访问192.168.11.9代理服务器跳转的是192.168.11.8后端真实服务器

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部

② 添加后端服务器11.8web文件,开启httpd服务,关闭防火墙,并实时查看访问日志

客户端(11.3)访问代理服务器

④ 观察后端服务器11.8新增日志信息

实验:ip透视 -------多级代理(三台主机均为nginx服务)

二级代理

实现目标:7-0服务器日志可以查看到客户端ip和反向代理服务器ip。

二 负载均衡策略

在上一个节中Nginx可以将客户端的请求转发至单台后端服务器,但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,

Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能。

官方文档: https://nginx.org/en/docs/http/ngx_http_up

格式

#自定义一组服务器,配置在http块内
upstream   web { 
 server 192.168.91.100    调度算法
 server 192.168.91.101
}
 
location  / {
pass_proxy  http://web/
}
server address [parameters];
#配置一个后端web服务器,配置在upstream内,至少要有一个server服务器配置。
#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number  #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup  #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器 sorry server   自己不能转自己
down    #标记为down状态
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
 
hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使consistent参数,将使用ketama一致性
 
hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一
致性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash
hash $cookie_sessionid  #基于cookie中的sessionid这个key进行hash调度,实现会话绑定
 
 
 
 
ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持
 
 
least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

NFS:网络文件系统,用来存储内容

负载均衡

①后端(两个)服务器开启httpd(apache),关闭防火墙 防护 或iptables

1 调度算法 
①轮询算法(一人一次)

默认算法是轮询算法即反向代理服务器处理用户请求时,每个后端服务器都轮流提供响应。

①代理服务器配置主文件

②apache后端服务器开启httpd服务,关闭防火墙,分别建立web文件

检测

若买一台服务器宕机?

那么只会跳转好的那一台服务器

当其中一台宕机,就不去访问他了,直接跳过

那是因为 nginx 有 健康性检测 机制 就不去坏的服务器了

nginx服务较为只能,通过tcp三次握手可以检查服务器健康性,当无法完成连通性,默认将不会访问从而提示报错。当故障服务器恢复正常后,再次轮巡调度。

② 加权轮询算法

在默认轮询的基础上增加权重,weight=number。如果后端有2个服务器其中一个配置权重为weight=5另外一个不配置默认是1,则有用户访问时分配给给有权重的服务器和不配置权重的服务器的比例为5:1。

①配置代理服务器文件

检测 :客户机访问代理服务器

③ 最小连接数算法

最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC。按照nginx反向代理服务器和后端服务器的连接数分配请求,连接越少的分配处理请求优先级越高。例如最小连接数(least_conn;)是设置是3,1号后端服务器有2个请求在处理,而后2号后端服务器只有1个请求在处理,则新请求交给后端服务器2。

 20     upstream web {
 21     server 192.168.11.8;
 22     server 192.168.11.9 max_conns=10 max_fails=3 fail_timeout=30s;
 23     }
#max_conns=number  #给当前后端server设置最大活动链接数,默认为0表示没有限制
#max_fails=number   后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
#fail_timeout=time 后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒。这样避免服务器刚上线不稳定再次导致业务失败
④备份服务器

当所有后端服务器不可用时,才会启用此备用服务器sorry server,自己不能转自己。

2 ip调度操作

(1) ip_hash算法

基于客户端IP地址的负载均衡算法。它会根据客户端的IP地址,将该客户端的所有请求都发送到同一个后端服务器上。这样可以保证同一个客户端的所有请求都被发送到同一个后端服务器,从而保证了会话的一致性。

upstream web {
    hash $remote_addr;
   server 192.168.246.8;
   server 192.168.246.9;
   }

① 修改代理服务器配置

② 客户端访问

hash算法会将Web页面访问的缓存定在某一个代理服务器;但是hash算法有一个缺点就是hash还要除以权重,下次重载配置会更换Web服务的代理服务器

(2) url hash
 20     upstream web { 
 21     hash $request_uri;         #发送请求的地址,一旦确定不会轻易改变
 22     server 192.168.246.8;
 23     server 192.168.246.9;
 24     }

① 修改代理服务器配置

② 客户端访问

(3)cookie  
upstream web {
   hash $cookie_hello;
   server 192.168.246.8;
   server 192.168.246.9;
   }

① 修改代理服务器配置

② 客户端模拟加上cookie访问

(4) fair算法

基于后端服务器的负载均衡算法。它会根据后端服务器的响应时间,将请求发送到响应时间最短的服务器上。这样可以保证请求被发送到处理能力最强的服务器上,从而提高系统的性能。

(5)least_conn
upstream web_test { 
      least_conn;  --把请求转发给连接数较少的后端服务器
      server 10.10.2.100:80; weight=1;
      server 10.10.3.100:80; weight=2;
}

三 stream 服务模块

http://nginx.org/en/docs/stream/ngx_stream_core_module_html

stream  实现反向代理功能, 是四层模块,只能控制tcp、udp

(实现反向代理功能,包括TCP协议代理)

 stream和http模块是同级

四层代理和七层代理的区别:

4层是指传输层的 TCP/UDP 协议

7层是指应用层的 HTTP 协议

代理原理:

     4层代理:使用 NAT(Network Address Translation)技术,即网络地址转换。即请求进来的时候,nginx 只修改数据包里面的目标IP、源IP、端口,然后就直接把数据包发给目标服务器(即nginx不知道请求的具体内容),目标服务器处理完成后,发给 nginx,nginx 数据包再做一次类似的修改,就返回给请求的客户端了。
     7层代理:nginx 读取并解析 Http 请求内容,然后将具体内容(请求行、请求头、空行、请求数据)转发到相应的服务器,转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

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

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

相关文章

【C++初阶】第四站:类和对象(下)(理解+详解)

前言: 本篇知识点:初始化列表、explicit关键字、static成员、友元、内部类、匿名对象、编译器的优化 专栏:C初阶 目录 再谈构造函数 1️⃣构造函数体赋值 2️⃣初始化列表 explicit关键字 static成员 1.static概念 2.static特性 面试…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论(4) Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

NC65 零预算控制规则 数据库表关系

NC65 零预算控制规则 数据库表关系 SELECT t1.createdby, t1.objname, t2.ctrlname, t2.pk_parent, t3.billtype, t3.nameidx, t3.pk_obj FROM tb_rule_formula t1 left join tb_ctrlformula t2 on t1.pk_obj t2.pk_parent left join tb_ctrlscheme t3 on t3.pk_ctrlformula …

Mysql安装教程

一、下载 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包,将其解压,我们就可以得到MySQL 8.0.31 的软件本体了(就是一个文件夹…

Tomcat布署及优化-----JDK和Tomcat

1.Tomcat简介 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说&…

Vivado Vitis 2023.2 环境配置 Git TCL工程管理 MicroBlaze和HLS点灯测试

文章目录 本篇概要Vivado Vitis 环境搭建Vivado 免费标准版 vs 企业版Vivado Windows 安装Vivado 安装更新 Vivado 工程操作GUI 创建工程打开已有工程从已有工程创建, 重命名工程GUI导出TCL, TCL复原工程TCL命令 Vivado 版本控制BlinkTcl脚本新建导出重建工程纯Verilog BlinkTc…

抖音视频批量下载软件说明|视频采集挖掘工具

操作步骤如下: 打开抖音批量下载工具,进入软件界面的第一个选项卡页面。在搜索框中输入需要搜索的视频关键词,例如"汽车配件",然后点击"开启抓取"按钮开始搜索。软件将开始搜索并显示与关键词相关的视频内容…

祖传代码:历史的宝藏与现代的挑战

程序员是如何看待“祖传代码”的? 程序员眼中的“祖传代码”,就像一本古老而神秘的魔法书,藏着无穷的智慧和技巧,有些代码像家传宝贝,有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 一、祖传代码的历史与文…

算法------(13)KMP

例题:(1)AcWing 831. KMP字符串 。。其实写完也不太理解。。随便写点吧 KMP就是求next数组和运用next的数组的过程。相比传统匹配模式一次更新一单位距离的慢速方法,next数组可以让下表字符串一次更新n - next【n】个距离&#x…

三天学会阿里分布式事务框架Seata-seata事务日志mysql持久化配置

锋哥原创的分布式事务框架Seata视频教程: 实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)共计10条视频&…

虚拟机中Linux的安装与初始化配置(更新时间24/3/1)

先问三个问题 vm虚拟机安装了吗?点击此处跳转虚拟机安装教程Linux镜像下载了吗?点击此处跳转Linux镜像下载教程新建Linux虚拟机配置了吗?点击此处跳转新建虚拟机的配置教程 顺序是:下载虚拟机–>下载Linux镜像–>新建Linux配…

python63-Python的循环之循环使用else

Python的循环都可以定义else代码块&#xff0c;当循环条件为False 时&#xff0c;程序会执行else代码块。如下代码示范了为while循环定义else代码块。 # !/usr/bin/env python# -*- coding: utf-8 -*-# Time : 2024/01# Author : Laopicount_i 0while count_i < 5:print(c…

Verilog(未完待续)

Verilog教程 这个教程写的很好&#xff0c;可以多看看。本篇还没整理完。 一、Verilog简介 什么是FPGA&#xff1f;一种可通过编程来修改其逻辑功能的数字集成电路&#xff08;芯片&#xff09; 与单片机的区别&#xff1f;对单片机编程并不改变其地电路的内部结构&#xff0…

YOLOv9大幅度按比例减小模型计算量!加快训练!

一、代码及论文链接&#xff1a; 代码链接&#xff1a;GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 论文链接&#xff1a;https://github.com/WongKinYiu/yolov9/tree/main 二…

Docker容器与虚拟化技术:OpenEuler 使用 docker-compose 部署 LNMP

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose 3.docker-compose 部署 LNMP 二、问题 1.ntpdate未找到命令 2.timedatectl 如何设置时区与时间同步 3.php网页显示时区不对 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注Lin…

Visual Studio:指针和固定大小缓冲区只能在不安全的上下文中使用、 设置允许使用不安全代码(unsafe)

问题描述: 指针和固定大小缓冲区只能在不安全的上下文中使用 解决方案&#xff1a; 1、解决方案资源管理器-》选择项目-》右键-》属性 2、在生成窗口中&#xff0c;勾选“允许不安全代码” 3、再次“生成解决方案”即可

C语言基础17 判断

断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面是…

免费百度快速收录软件

在网站SEO的过程中&#xff0c;不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说&#xff0c;频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题&#xff0c;百度自动更新文章SEO工具应运而生&#xff0c;它能够帮助网站管…

Maven面试题

以下是一些关于Maven的经典面试题以及它们的答案&#xff1a; 1、什么是Maven&#xff1f; Maven是一个项目管理工具&#xff0c;用于构建、管理、发布Java项目。 2、为什么要使用Maven而不是手动管理项目依赖&#xff1f; Maven提供了依赖管理、统一的构建、打包、文档生…

Unity(第二十四部)UI

在游戏开发中&#xff0c;用户界面&#xff08;UI&#xff09;是至关重要的一部分。它负责与玩家进行交互&#xff0c;提供信息&#xff0c;并增强游戏的整体体验。Unity 提供了强大的工具和功能来创建和管理 UI。 ui的底层就是画布&#xff0c;创建画布的时候会同时创建一个事…