Nginx反向代理和缓存
一、Nginx反向代理
1.调度和代理的区别:
1.调度基于内核层面,代理基于应用层面
2.代理必须实现一手托两家
3.调度不需要监听任何端口,不需要工作任何应用程序,代理需要工作和上游服务器一模一样的进程
4.调度没有并发上限,代理最高65535
5.调度只实现报文转发,代理必须实现重构报文
6.通常情况下代理会关联缓存,调度不会(haproxy不支持缓存)
正向代理和反向代理的区别:
1.正向代理:为客户端提供服务的代理,实现访问控制;明确知道访问的是代理服务器
2.反向代理:为服务端提供服务的代理;客户端不知道访问的是代理服务器
3.透明代理:通过某些技术手段nat转换,或者通过某些应用程序修改你的浏览器,让你不察觉你访问的是代理服务器,但是一样可以为客户端提供代理服务。如:squid
2.代理经典架构体系图:
ht_core:web服务器模块,实现自身web服务器功能;基于kv存储的方式缓存到磁盘中,k缓存到内存区、v是以hash码存储到磁盘区。
ht_upstream:集群模块,代理的集群功能,应用程序服务器(python:uwsgi);本质:调用ht_proxy模块,实现代理后台多个web服务器资源达到负载均衡
ht_proxy:普通代理模块,普通代理功能
ht_fastcgi:异构代理模块 ,关联后台php、Python
工作进程走的是事件驱动、复用I/O模型、异步非阻塞I/O模型(用户缓存)
【注】:代理服务器副作用非常大,错误也会缓存,但是可以基于修剪缓存工具进行修剪(本质就是把hash码删除);也可以把缓存时间设置短一些。
3.Nginx集群
①Nginx除了是一个强大的静态web服务器,也是强大的负载均衡器,它通过应用层完成负载均衡,构建成负载均衡集群的架构。Nginx的集群本质上是基于反向代理来实现。
②:基于应用层完成负载--->nginx proxy
③:upstream server:上游服务器,即被代理服务器所连接的后台真实服务器
nginx缺点:算法少
4.Nginx的代理模块
upstream模块(ngx_http_upstream、ngx_stream_proxy_module)
fastcgi模块(ngx_http_fastcgi)
uwsgi模块(ngx_http_uwsgi)
proxy模块(ngx_http_proxy):用于单台代理
【注】:反向代理可以实现全根代理(完全放弃自己web服务器功能,完全代理后台),也可以实现半根代理
①:proxy模块
proxy模块(ngx_http_proxy)
server {
listen
server_name
location / {
proxy_pass //粘性工具
}
}
以proxy模块配置反向代理,格式:
location /uri {
proxy_pass http://upstream_server:port/newuri; #(可以代理全根,Nginx也可以自己作为web服务器对客户提供服务)
}
例:
【注】:①如果在代理区域使用正则表达式,代理的的地址不能承接URI,否则为语法错误。
②只要能被正则表达式能匹配到,都会将请求调度到对应的代理服务器的URI
无需考虑前端URI的资源,只需考虑重写后的结果URI
③若后端web服务设置主机名虚拟主机,代理转发不会将请求头部进行转发,而是默认 中心主机代理(解决方案:proxy_set_header Host $http_host;)
④上述代理方式,在上游US日志的记录上,之后记录请求的地址,不会记录源客户端的 IP地址,无法完成用户日志的精准分析。于是需要引用remote_addr这个变量来进行记 录基于源客户端的IP地址的日志,使用proxy_set_header配置方法,来定义remote_addr。
多层代理记录 X-Forwarder-For $proxy_add_x_forwarded_for
二、Nginx中配置缓存
1.缓存的简介
缓存:缓存数据在内存空间,以kv对进行存储,以hash码进行定位指引。
缓存路径的目录由proxy_cache_path来定义 (定义在httpd上下文)
优先级:浏览器、代理、服务器
2.定义缓存路径配置方式
定义格式:
proxy_cache_path PATH levels=levels keys_zone=name:size [interactive=time] [max_size=#k|M|G]
定义详解:PATH:缓存路径
前Level:级层目录
后level:目录名称的字符量
Keys_zone:定义键名字和大小
Levels=1:2:4
例如:
proxy_cache_path /data/caches levels=1:2 keys_zone=xxhf123_cdn:100m inactive=30m max_size=100m;
代表缓存目录在这个路径下,允许出现二级子目录,一级子目录名称为单个字符,二级子目录为双位字符。
Keys_zone键存储的名称为one和大小为10M。
【注】:缓存目录属主属组必须是nginx
缓存文件示例:/cache/nginx/b/02/c649288d058e4b67c2b30bfbbcf5500b
3.在http段中定义缓存,定义完后在http、server、location中使用proxy_cache进行调用。
(1)定义缓存的其他属性
定义触发缓存的最少访问次数:(默认一次)
格式:proxy_cache_min_uses number;
例如:proxy_cache_min_uses 5;
(2)定义客户端请求缓存的方法
格式:proxy_cache_methods GET |HEAD POST...
默认为GET和HEAD
(3)定义缓存修剪管理
proxy_cache_purge: 编译的时候添加--add-module=/root/ngx_cache_purge-2.3
缓存后过期后重新校验:
proxy_cache_revalidate on | off
跟后端服务器交互发生错误情况下,使用过期的缓存内容响应请求错误请求
proxy_cache_use_stale error timeout | invalid_header | http_500 ......
跟后端服务器交互连接超时情况下,使用过期缓存响应请求
proxy_commect_timeout;
自定义缓存时长
Proxy_cache_valid [code ...] time;
添加代理服务器的地址到首部
add_header X-Via $server_addr;
添加缓存命中状态到报文首部
add_header X_cache_hit $upstream_cache_status;
例:
三、 Nginx基于反向代理实现负载均衡
1.upstream负载均衡模块
【注】:只能定义在http配置段中
配置语法:
upstream name {
[ip_hash] #源地址hash绑定
server backend1.example.com [weight=5];(权重)
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;(表示如果请求上游发生错误3次,超时30s,将连接不上的上游节点下线)
server backup1.example.com backup|down;(备份节点,如果需要可以顶上 | 永久下线)
例:表示加权轮询上游被调度的服务器10.10 和10.20
【注】: 定义upsteam后,上游服务器在proxy_pass中需要改成upsteam命名的名称
2. Nginx的调度算法(方法)
rr wrr(定义upsteam_server的weight)
Ip_hash: 源地址hash,实现session绑定
3.基于sticky实现Session绑定的
ip_hash的源地址绑定方式有很大的副作用,因此通常基于sticky方式来实现绑定。
①:cookie
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
4.fastcgi模块(ngx_http_fastcgi)
Nginx默认无法以模块的方式连接php,Fastcgi实现代理不属于http协议,而是必须基于fastcgi协议的默认9000端口进行代理。
我们可以以fpm的方式进行调度fastcgi请求,同时定义PHP自己的fpm工作模式,进行参数设定。
fastcgi模块对应常见配置
①fastcgi pass 将fastcgi请求代理给指定的主机
fastcgi_pass address;(定义在location或者if location配置段中)
例如:fastcgi_pass localhost:9000;
②fastcgi_index 基于fastcgi请求的默认索引页
例如:fastcgi_index index.php
③fastcgi_param 向后端传递的参数
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
④fastcgi请求超时时长
fastcgi_connect_timeout time;(在http server location中定义)
例如:fastcgi_connect_timeout 60s; #通常不要超过75s
5.定义fastcgi缓存
fastcgi_cache(需要配置在http配置段)
例如:fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=fcgicache:10m inactive=3m max_size=1g;
定义fastcgi缓存页面缓存属性
fastcgi_cache_valid [code ...] time; (可设置在http server location中)
例:
使用ab压力测试,动态页面缓存未开启和开启之后的对比效果
例如:ab -n 10 -c 2 http://192.168.10.100/index.php
通常情况下,在企业生产环境中,动态网页是否缓存由程序内部代码去定义
四、LNMP架构搭建
Nginx和apache不同之处在于,nginx对动态资源的处理能力非常差,并且无法向apache一样以模块装载的方式进行勾连php,
Nginx需要以fpm方式进行连接php,来完成LNMP架构的部署。 LNAMP
部署过程:
①:fastcgi的相关配置:
LNMP:php启用fpm模型前提,需要Nginx以代理的方式将PHP动态资源的请求交给fastcgi的9000端口进行处理
fastcgi由单独fpm模块进行处理。在主配置文件中的虚拟主机中,定义fastcgi区域
②:安装php和mysql
yum -y install php mariadb mariadb-server mysql-devel php-mysql php-cgi php-mbstring php-gd php-fpm
③:安装php依赖组件
yum -y install autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
④:配置php-mysql的勾连
⑤:部署应用验证结构
配置Nginx和Apache的动静分离
①:在企业级web服务应用中,通常Nginx用于纯静态的web服务,部分情况下也可以实现Nginx和apache进行结合,前台静态资源由Nginx进程处理,后台有Apache和PHP进行处理,各司其职,形成Nginx和Apache的动静分离 ---> LNAMP (目前不常用)
②:Nginx和Apache本质上Nginx作为前端纯静态服务器,Apache作为后端服务器,结合使用PHP,动静分离,实质上实现的是Nginx的反向代理
配置思路:
①:先构建一台nginx的静态web服务器,以代理的方式,基于正则表达式定向到后台的动态apache-php服务器。 LNAMP
如图所示:
proxy_pass表示代理给后台的192.168.22.13主机
②:构建一台LAMP架构的主机(步骤略)
③:在LAMP架构内配置动态页面和静态页面,浏览器分别访问静态服务器的动态资源和动态服务器的静态资源,验证动静分离结果。
相关文章:

Nginx反向代理和缓存
一、Nginx反向代理 1.调度和代理的区别: 1.调度基于内核层面,代理基于应用层面 2.代理必须实现一手托两家 3.调度不需要监听任何端口,不需要工作任何应用程序,代理需要工作和上游服务器一模一样的进程 4.调度没有并发上限&am…...

支持多元AI场景应用,宁畅“NEX AI Lab”开放试用预约中
3月29日,宁畅在京举行发布会,正式发布“全局智算”战略,并在会上推出战略性新品“AI算力栈”,旨在有效解决大模型产业落地的全周期问题。 据宁畅CTO赵雷介绍,“AI算力栈”集成了宁畅在AI计算领域的软硬件能力ÿ…...

Git 如何合并多个连续的提交
我平常的编程喜欢是写一段代码就提交一次,本地一般不攒代码,生怕本地有什么闪失导致白干。但这样就又导致一个问题:查看历史日志时十分不方便,随便找一段提交可以看到: > git log --oneline 8f06be5 add 12/qemu-h…...

k8s 基础入门
1.namespace k8s中的namespace和docker中namespace是两码事,可以理解为k8s中的namespace是为了多租户,dockers中的namespace是为了网络、资源等隔离 2.deployment kubectl create #新建 kubectl aply #新建 更新 升级: 滚动升级&#x…...

【Python项目】AI动物识别工具
目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域,拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中,鉴于地球的广阔地域和多样的气候条件,利用图像技术捕…...
逻辑回归(Logistic Regression)详解
逻辑回归是一种用于解决二分类问题的统计方法,它通过构建一个模型来预测某个事件的概率。 以下是逻辑回归的一些关键要点: 适用场景:逻辑回归特别适合于处理二分类问题,即两个类别的分类问题,例如判断一封邮件是否为…...
.vimrc文件的语句语法
本文结构: a、简介 b、详细解释其中的一些常见语句和语法。 a、.vimrc 文件是 Vim 编辑器用于配置用户设置和自定义行为的文件。当 Vim 启动时,它会读取 .vimrc 文件中的命令和设置,并根据这些指令来配置编辑器的行为。 b、.vimrc 文件中…...
c语言之函数指针作形参
在一些c语言的大工程中,会在定义的函数中,把一些其他函数指针作为本函数形参。 函数指针作形参的例子 代码如下: #include<stdio.h> int max(int a,int b) { return(a>b?a:b); } int min(int a,int b) { return(a<b?a:b); } i…...
python文件的读取操作
打开文件 fopen("F:/python/helloworld/测试.txt","r",encoding"UTF-8")读取文件 print(f"读取10个字节的结果{f.read(10)}") print(f"读取全部字节的结果{f.read()}") linesf.readlines() print(f"{lines}")读…...

查看并设定【网络适配器】的优先级(跃点数)
目录 前言: 1.查看所有的适配器 2.修改优先级(需要以管理员身份运行) 跃点数(InterfaceMetric ) DHCP 3.修改后的效果 pwoerShell 再次运行之前的程序 4.其他 参考 网络适配器1,8相关知识介绍1 …...

深入理解 Hadoop 上的 Hive 查询执行流程
在 Hadoop 生态系统中,Hive 是一个重要的分支,它构建在 Hadoop 之上,提供了一个开源的数据仓库系统。它的主要功能是查询和分析存储在 Hadoop 文件中的大型数据集,包括结构化和半结构化数据。Hive 在数据查询、分析和汇总方面发挥…...

JS封装网页进入/退出全屏功能,兼容各大主流浏览器
1、演示 2、封装进入全屏函数 mozRequestFullScreen:兼容Firefox webkitRequestFullscreen:兼容 Chrome、Safari、Opera msRequestFullscreen:兼容:IE/Edge const enter () > {const element document.documentElementif (el…...
el-table的复选框勾选整行变色
要实现el-table的复选框勾选整行变色,你可以使用element-ui提供的row-class-name属性结合scoped slot来完成。 首先,你需要为el-table组件添加 row-class-name 属性,并给它绑定一个方法。在这个方法中,你可以根据你的业务逻辑来判…...
一步一步写线程之八线程池的完善之二数据结构封装
一、数据容器 在前面分析过,不管是线程任务的封装还是同步数据队列的封装,都是需要一个数据结构的。一用来说,如果没有什么特殊的原因,开发者都是使用STL中数据结构。比如前面经常见到的std::queue,std::deque,std::vector,std::…...

go连接数据库(原生)
根据官网文档 Go Wiki: SQL Database Drivers - The Go Programming Language 可以看到go可以连接的关系型数据库 常用的关系型数据库基本上都支持,下面以mysql为例 下载mysql驱动 打开上面的mysql链接 GitHub - go-sql-driver/mysql: Go MySQL Driver i…...

【C语言】2048小游戏【附源码】
欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏描述: 2048是一款数字益智类游戏,玩家需要使用键盘控制数字方块的移动,合并相同数字的方块,最终达到数字方块上出现“2048”的目标。 每次移动操作,所…...

部署项目遇到的各种问题总结
文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后,为了让别人访问到自己的网站,就需要部署前端后端以及数据库,但是在部署的过程中出现了各种问题和困…...

JavaSE:抽象类和接口
目录 一、前言 二、抽象类 (一)抽象类概念 (二)使用抽象类的注意事项 (三)抽象类的作用 三、接口 (一)接口概念 (二)接口语法规则 (三&a…...

发票是扫码验真好,还是OCR后进行验真好?
随着科技的进步,电子发票的普及使得发票的验真方式也在不断演进。目前,我们常见的发票验真方式主要有两种:一种是扫描发票上的二维码进行验真,另一种是通过OCR(Optical Character Recognition,光学字符识别…...
【AIGC调研系列】AIGC+Jmeter实现接口自动化测试脚本生成
AIGC(人工智能生成内容)结合JMeter实现接口自动化测试脚本生成的方法,主要涉及到通过流量收集工具和AIGC技术获取用户操作接口数据,并利用这些数据生成自动化测试脚本的过程。这种方法可以有效提高软件测试的效率和质量[1]。JMete…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...