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…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...