nginx 反向代理 与缓存功能

一  理论说明

(一)反向代理简介

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

即 代理服务机

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能

(二)相关模块

ngx_http_proxy_module#将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module#用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组     (负载均衡
ngx_stream_proxy_module#将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module#将客户端对php的请求以fastcgi协议转发至指定服务器助理       (语言不同 接口不同)
ngx_http_uwsgi_module#将客户端对Python的请求以uwsgi协议转发至指定服务器处理   (语言不同 接口不同)

(三)架构图

1,反向代理

2,同构代理 异构代理

同构协议:客户机  服务机协议一样

异构: 不一样

二  单台代理

(一)具体步骤

实验环境:66是代理服务器   77 是真实服务器

66 配置文件:

表示开启代理  真服务机是77

访问 66  也能看到77 真服务器    的内容

(二)出现504

1,出现504  的情况

在真实服务器上 做防火墙规则
iptables -A INPUT  -s 192.168.91.66 -j DROP
客户端再次访问  会出现504网关超时(有可能只是处理时间久,服务器不一定挂了),时间较长1分钟,没有定义代理超时时间

2, 504 解释

drop  丢弃    真实服务机一直丢弃代理服务机

代理服务机会以为   真实服务机没收到  会一直发

大概持续一分钟  超时   然后返回504

(三)出现502

1,出现502  的情况

在真实服务器上 做防火墙规则

iptables -A INPUT  -s 192.168.91.66 -j REJECT
客户端再次访问  会出现502,一般出现502 代表后端真实服务器挂了

2,502 解释

网关不可达   reject 拒绝

基本判定 真实服务机挂了

三   针对某个uri 进行反向代理

(一)实验步骤

66代理服务机:

访问66/api    等于访问  真是服务器77/api 

77 真实服务机 主页面内容:

客户机访问:

(二)注意加/  和不加/ 区别

http://192.168.91.77    不加/    是将location上的url 追加在后面

http://192.168.91.77/    加上/    是将location上的url 替换后proxy配置里的连接

即访问  真实服务机的主页面

四,    反向代理  缓存功能

(一)作用

加快速度

万一 真实服务器挂了 救急

(二)语法结构

1, 主配置文件

在http配置定义缓存信息

proxy_cache_path /var/cache/nginx/proxy_cache#定义缓存保存路径,proxy_cache会自动创建
 levels=1:2:2#定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
 keys_zone=proxycache:20m#指内存中缓存的大小,主要用于存放key和metadata(如:使用次数),一般1M可存放8000个左右的key
 inactive=120s#缓存有效时间
 max_size=10g;#最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值

2, 子配置文件

#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等

proxy_cache zone_name | off; 默认off

#指明调用的缓存,或关闭缓存机制;

#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

proxy_cache_key $request_uri;#对指定的数据进行MD5的运算做为缓存的key    (理解为记住 路径

proxy_cache_valid 200 302 301 10m;

proxy_cache_valid 401 1m;

#指定的状态码返回的数据缓存多长时间

对状态码不同 缓存时间不同   200 302 正常访问  时间长

404 不正常

proxy_cache_valid any 1m;

#除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存

不是上面的状态码 同一缓存1分钟


proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; 

#默认是off

#在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

#示例
proxy_cache_use_stale error http_502 http_503;
缓存过期 也能使用

proxy_cache_methods GET | HEAD | POST ...;

#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

对方法 缓存

(三)清理缓存

缓存不会自动清理   需要手动清理

方法1: rm -rf 缓存目录
方法2: 第三方扩展模块ngx_cache_purge

注意: 在rm  -rf proxycache 后   需要nginx  -s reload  再次生成proxycache文件夹

(四)示例

66  代理服务机   配置文件

当客户机 访问代理服务器时可以看到生成缓存文件

当我们 关闭真实服务器时,发现客户机 仍能看到内容

五,  IP 透传

(一)一级代理

1, 实验环境

66  是代理服务器     99是真实服务器  

目前99 服务器查看访问日志   是看不到真实ip的  

只能看到66  代理服务器的ip

2, 步骤

第一步

99 真实服务器 需要将日志中的“referer”  开启 (yum安装的nginx 默认开启 编译安装的,需要手动开启)

 如果真实服务器是  httpd 在主配置文件改   如图所示:

第二步

66 代理服务器需要改配置文件: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部

第三步:

此时我们再去让客户机访问   查看99真实服务机的日志  发现可以看到 客户机ip 为11

(二) 多级代理

1,架构

2, 步骤

步骤与一级代理一致

2.1

客户机不需要做配置

2.2 

客户机访问代理1 服务器等于访问  代理服务器2

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

2.3 

代理1服务器  访问  代理服务器2  等于访问真实服务器

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

2.4

 真实服务器 改日志格式

六,http反向代理负载均衡

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/
}#示例
upstream backend {server backend1.example.com weight=5;     权重server 127.0.0.1:8080       max_fails=3  fail_timeout=30s;server unix:/tmp/backend3;server backup1.example.com backup;
}
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而不用重启Nginxhash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使consistent参数,将使用ketama一致性www.kgc.com/test1   hash  test1      103  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

(三)负载均衡实验示例

1, 实验环境

66为代理服务器  77,99 为两台真实服务器

2,步骤

66 代理服务器的主配置文件:

3,实验结果

此为轮询算法  一人一次  总共7种算法,下面依次介绍

(四)健康性检查

1,健康性检查

nginx 非常聪明,把77停了 只会去99

原因: 在轮询前 会三次握手     握不到  就不发过去

2,实验

关闭99 真实服务器 ,发现代理服务器只会去到77 真实服务器

(五)调度算法

轮询    加权轮询   ip hash    url hash   cookie hash   最少连接数    fair根据响应时间

总共7 种调度算法

1,轮询

默认算法   一人一次

2, 加权轮询 

2.1 语法

不写 默认 weight=1

2.2 实验结果

大概 按3比1  

3, ip  hash

3.1 实现方式

通过客户端的ip 地址 计算出一个值   算出来 访问 真实服务机1 永远访问1

3.2 意义

实现会话保持

3.3 实验步骤

可以看到 第一次在77 服务器  永远在77服务器

3.4  ip hash  弊端

hash 算法 后还要除 总权重

如果你动了权重 可能会导致不正确

4,uri hash

根据访问路径

5,cookie hash

5.1 cookie 原理

5.2 更新的技术

令牌  技术

5.3 实验步骤

6,最少连接数

least_conn;

7,fair 根据响应时间

(六)一些其他设置

这些都是加在  真实服务机后面  例如这样:

weight=number#设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number#给当前后端server设置最大活动链接数,默认为0表示没有限制     最大连接数
max_fails=number

#后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测

max_fails=3  检测3次 3次检测都不回 才觉得死了

fail_timeout=time

#后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒

fail_timeout=30s  活了先等30秒在上

backup 

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

备份的真实服务机  当其他服务器都挂了  才会启用自己

down

#标记为down状态

死了

resolve

#当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

记录域名 域名对应的ip 变化

hash KEY [consistent];#基于指定请求报文中首部字段或者URI等key做hash计算,使consistent参数,将使用ketama一致性

七   自定义响应报文头部信息

在 sever 模块添加以下

add_header X-Via $server_addr;                                   当前nginx主机的IP

add_header X-Cache $upstream_cache_status;          是否缓存命中

add_header X-Accel $server_name;                             客户访问的FQDN

add_header name value [always];                               自定义响应报文头部信息

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

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

相关文章

算法——滑动窗口之最大连续1的个数、将x减到0的最小操作数、水果成篮

3.最大连续1的个数 题目:. - 力扣(LeetCode) 题目要求的是给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 按照题目正面去做,还要替换0,很麻烦 反正我们最后要求的是最长…

YOLOv8改进 | 独家创新篇 | 结合SOTA思想利用双主干网络改进YOLOv8(全网独家创新,最重磅的更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进YOLOv8(本专栏目前发布以来改进最大的内容,同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供,本文内容支持YOLOv8全系列模型从n到x均可…

刷题笔记 洛谷 P1162 填涂颜色

思路来自 大佬 hat.openai.com/c/9c30032e-5fb9-4677-8c15-9ea6530dc6db 题目链接 P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 搜索 首先 在外面围上一圈0开始搜素 因为题目说将封闭区域内的0变成2 我们可以在外面进行搜索 把外面所有可以搜索…

Nginx----高性能的WEB服务端(四)

一、http 协议反向代理 1、反向代理:缓存功能 ​ proxy_cache zone_name | off; 默认off #指明调用的缓存,或关闭缓存机制;Context:http, server, location #zone_name 表示缓存的名称.需要由proxy_cache_path事先定义proxy_cache_key string; #缓存中…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)

本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇~前4篇可移步( ̄∇ ̄)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…

BeautifulSoup+xpath+re+css简单复习+新的scrapy的学习

1.BeautifulSoupsoup BeautifulSoup(html,html.parser)all_icosoup.find(class_"DivTable") 2.xpath trs resp.xpath("//tbody[idcpdata]/tr") hong tr.xpath("./td[classchartball01 or classchartball20]/text()").extract() 这个意思是找…

文件拖放到窗体事件

网上的实现1 实现结果 具体实现代码:注意需要使能允许拖拽 public partial class Form1 : Form {public Form1(){InitializeComponent();this.AllowDrop true; //允许拖拽}private void Form1_DragEnter(object sender, DragEventArgs e){this.Text DateTime.No…

一键安装|卸载 mysql 8.2.0 shell脚本

场景:为了在无网、外网 mysql 安装方便,这里分享一个自己编写得 shell脚本 这里以当前最新版 mysql 8.2.0;centos-7 二进制包下载: 下载地址 mysql_install.sh #!/bin/bash # 解压安装包 tar -xf mysql-8.2.0-linux-glibc2.17-x8…

TC3xx SMU、PMIC和Tranceiver的功能安全闭环

目录 1.TLF35584安全状态输出响应对象 1.1 响应ERR 收集到的错误信号 1.2 响应监控功能引发的ROT 1.3 响应看门狗引发的错误 1.4 环境过温引发的错误状态 1.5 为什么设计SSx? 2. 安全状态输出给谁 3.小结 在之前文章里,我们简述了TC3xx SMU如何…

尚硅谷(SpringCloudAlibaba微服务分布式)学习代码Eureka部分

1.项目结构 2.cloud2024 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

面试笔记系列六之redis+kafka+zookeeper基础知识点整理及常见面试题

Redis redis持久化机制&#xff1a;RDB和AOF Redis 持久化 Redis 提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redi…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…

html2canvas + JsPDF.js 导出pdf分页时的问题

问题描述 前一段时间 实现了html2canvas jspdf.js 导出pdf的功能 项目当时没有测试做完就先搁置 最近项目要上线发现分页时问题 这篇文章记录一下之前的bug import html2canvas from html2canvas; import JsPDF from jspdf export function savePdf(el, title) {html2canva…

Google checkstyle实战

概述 CheckStyle检查代码是否符合制定的规范。CheckStyle检查是基于源码的&#xff0c;无需编译&#xff0c;执行速度快。 CheckStyle的主要流程是&#xff1a; 对Java文件进行词法语法分析&#xff0c;生成语法树。载入配置文件&#xff08;checkstyle-metadata.xml以及自定…

【ElfBoard】基于 Linux 的智能家居小项目

大家好&#xff0c;我是 Hello阿尔法&#xff0c;这段时间参与了保定飞凌嵌入式技术有限公司举办的 ElfBoard 共创社招募活动&#xff0c;并有幸成为了一名共创官&#xff0c;官方寄来了一块 ELF 1 开发板&#xff0c;开箱看这里 ELF 1 开箱初体验。 作为共创官&#xff0c;我…

数据可视化工具选择指南:山海鲸、Tableau与Power BI特点详解

在数据可视化的领域中&#xff0c;众多工具各有千秋。今天&#xff0c;我们将从客观的角度&#xff0c;对三款热门的数据可视化产品——山海鲸可视化、Tableau和Power BI进行深入的对比&#xff0c;帮助用户更全面地了解它们的特点&#xff0c;从而做出更明智的选择。 一、产品…

移动硬盘在电脑上显示不出来?三招教你轻松应对

随着网络的普及&#xff0c;数据的增多&#xff0c;对于数据储存的需要也是越来越多&#xff0c;相信许多人的手中都存在着一些如U盘、MP3、MP4、移动硬盘之类的储存设备&#xff0c;而在使用这些设备的时候&#xff0c;难免会遇到一些这样或那样的问题&#xff0c;比如移动硬盘…

微信小程序证书评级导致接口无法访问问题

微信小程序的ssl证书到期后&#xff0c; 更换了免费的ssl证书&#xff0c; 是在freessl网站申请的&#xff0c; 配置完了&#xff0c;后台可以访问https网页&#xff0c;但是小程序还是无法访问&#xff0c; 开始没有怀疑是https证书的问题&#xff0c; 调适了好长时间的代码&a…

Scala Intellij编译错误:idea报错xxxx“is already defined as”

今天写scala代码时,Idea报了这样的错误&#xff0c;如下图所示&#xff1a; 一般情况下原因分两种&#xff1a; 第一是我们定义的类或对象重复多次出现&#xff0c;编译器无法确定使用哪个定义。 这通常是由于以下几个原因导致的&#xff1a; 重复定义&#xff1a;在同一个文件…

【探索AI】十一 深度学习之第1周:深度学习概述与基础

深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架&#xff08;如TensorFlow或PyTorch&#xff09;进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代&#xff0c;当…