当前位置: 首页 > news >正文

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计算领域的软硬件能力&#xff…...

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语言的大工程中&#xff0c;会在定义的函数中&#xff0c;把一些其他函数指针作为本函数形参。 函数指针作形参的例子 代码如下: #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}")读…...

查看并设定【网络适配器】的优先级(跃点数)

目录 前言&#xff1a; 1.查看所有的适配器 2.修改优先级&#xff08;需要以管理员身份运行&#xff09; 跃点数&#xff08;InterfaceMetric &#xff09; DHCP 3.修改后的效果 pwoerShell 再次运行之前的程序 4.其他 参考 网络适配器1&#xff0c;8相关知识介绍1 …...

深入理解 Hadoop 上的 Hive 查询执行流程

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

JS封装网页进入/退出全屏功能,兼容各大主流浏览器

1、演示 2、封装进入全屏函数 mozRequestFullScreen&#xff1a;兼容Firefox webkitRequestFullscreen&#xff1a;兼容 Chrome、Safari、Opera msRequestFullscreen&#xff1a;兼容&#xff1a;IE/Edge const enter () > {const element document.documentElementif (el…...

el-table的复选框勾选整行变色

要实现el-table的复选框勾选整行变色&#xff0c;你可以使用element-ui提供的row-class-name属性结合scoped slot来完成。 首先&#xff0c;你需要为el-table组件添加 row-class-name 属性&#xff0c;并给它绑定一个方法。在这个方法中&#xff0c;你可以根据你的业务逻辑来判…...

一步一步写线程之八线程池的完善之二数据结构封装

一、数据容器 在前面分析过&#xff0c;不管是线程任务的封装还是同步数据队列的封装&#xff0c;都是需要一个数据结构的。一用来说&#xff0c;如果没有什么特殊的原因&#xff0c;开发者都是使用STL中数据结构。比如前面经常见到的std::queue,std::deque,std::vector,std::…...

go连接数据库(原生)

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

【C语言】2048小游戏【附源码】

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

部署项目遇到的各种问题总结

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

JavaSE:抽象类和接口

目录 一、前言 二、抽象类 &#xff08;一&#xff09;抽象类概念 &#xff08;二&#xff09;使用抽象类的注意事项 &#xff08;三&#xff09;抽象类的作用 三、接口 &#xff08;一&#xff09;接口概念 &#xff08;二&#xff09;接口语法规则 &#xff08;三&a…...

发票是扫码验真好,还是OCR后进行验真好?

随着科技的进步&#xff0c;电子发票的普及使得发票的验真方式也在不断演进。目前&#xff0c;我们常见的发票验真方式主要有两种&#xff1a;一种是扫描发票上的二维码进行验真&#xff0c;另一种是通过OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别…...

【AIGC调研系列】AIGC+Jmeter实现接口自动化测试脚本生成

AIGC&#xff08;人工智能生成内容&#xff09;结合JMeter实现接口自动化测试脚本生成的方法&#xff0c;主要涉及到通过流量收集工具和AIGC技术获取用户操作接口数据&#xff0c;并利用这些数据生成自动化测试脚本的过程。这种方法可以有效提高软件测试的效率和质量[1]。JMete…...

前端|babel升级

问题 项目不支持可选链调用过多的 babel 插件 步骤 基础包 dependencies “react-scripts”: “5.0.1” devDependencies “customize-cra”: “^1.0.0”,“react-app-rewired”: “^2.2.1”, 框架包 dependencies “react”: “16.13.1”,“react-dom”: “16.13.1”, …...

【微服务】spring状态机模式使用详解

一、前言 在很多系统中&#xff0c;通常会涉及到某个业务需要进行各种状态的切换操作&#xff0c;例如在审批流程场景下&#xff0c;某个审批的向下流转需要依赖于上一个状态的结束&#xff0c;再比如电商购物场景中&#xff0c;一个订单的生命周期往往伴随着不同的状态&#…...

【算法刷题day14】Leetcode:144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历

文章目录 二叉树递归遍历解题思路代码总结 二叉树的迭代遍历解题思路代码总结 二叉树的统一迭代法解题思路代码总结 草稿图网站 java的Deque 二叉树递归遍历 题目&#xff1a; 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 解析&#xff1a;代码随想录解析…...

mysql闲谈

如何定位慢查询 1、测试环境压测时&#xff0c;有的接口非常慢&#xff0c;响应时间超过2秒以上。当时系统部署了运维的监控系统Skywalking&#xff0c;在展示报表中可以看到是哪儿个接口慢&#xff0c;可以看到SQL具体执行时间。 2、如果没有类似的监控系统&#xff0c;在Mysq…...

物联网学习1、什么是 MQTT?

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备之间的高效通…...

【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析

一、引言 在机器学习项目中&#xff0c;数据探索是至关重要的一步。它不仅是模型构建的基础&#xff0c;还是确保模型性能稳定、预测准确的关键。数据探索的过程中&#xff0c;数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息&#xff…...

软件测试(一)--简介+主流技能+分类+模型+流程

一、软件及测试简介 1、软件生产过程 需求产生–需求文档–设计效果图–产品开发–产品测试&#xff08;测试产品与需求文档是否一致&#xff09;–部署上线 2、什么是软件测试 使用技术手段验证软件是否满足使用需求。 技术包括&#xff1a;&#xff08;使用网络技术测试安…...

技术引领,策略升级:腾讯云与你共探数字金融新篇章

引言 2024 年 3 月 27 日下午&#xff0c;在北京腾讯总部&#xff0c;一场关于大模型与数据要素时代数字金融发展的深入讨论火热进行中。【TVP 走进腾讯&#xff1a;大模型与数据要素时代的数字金融发展论坛】是在腾讯二十年发展历程和数字化实践的基础上&#xff0c;进一步探索…...

数据库-root密码丢失的重置方案(win11环境)

当在windows系统中安装的mysql由于操作不当&#xff0c;或者密码遗忘&#xff0c;今天测试了一下&#xff0c;可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…...

免试生常问的一些问题汇总---专升本学习篇

1.你怎么理解你申请的专业? 答:软件工程室一门涉及软件开发、维护和管理的工程学科。它结合了计算机科学、工程学和管理科学的原理,皆在通过系统化、规范化的方法来开发高质量的软件系统。 1.技术和支持 :软件工程包括编程语言、算法、数据结构、软件设计模式、软件测试、…...

google地图嵌入网站/seminar

目录 1.浅克隆 1.1基本实现 1.2 用原型模式生成“三好学生"奖状 2.深克隆 1.浅克隆 使用场景&#xff1a; 对象的创建非常复杂&#xff0c;可以使用原型模式快捷的创建对象。 性能和安全要求比较高。 1.1基本实现 Realizetype&#xff08;具体的原型类&#xff09…...

怎么登录企业网站/潍坊网站建设

线程池的概念 线程池是管理线程的一个工具&#xff0c;通过线程的重复使用从而降低开销&#xff0c;提高效率。因为创建和销毁线程都很耗费时间 ThreadPoolExecutor 创建线程池需要用到一个核心类就是ThreadPoolExecutor。 先来看构造函数&#xff1a; /*** Creates a new {cod…...

百姓网站制作/百度推广价格表

6安装可选部件介绍R390X G2有哪些可选部件&#xff0c;以及如何进行部件安装的详细操作步骤。R390X G2可选部件如下&#xff1a;介绍如何安装硬盘。 请确保同一RAID的所有硬盘类型相同&#xff0c;否则会因硬盘性能不同而造成RAID性能下降或者无法创建RAID。即满足如下两点…...

做网站前期需要准备什么/抖音seo排名系统哪个好用

Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他发表于19 天前 ? Android, Android开发 ? 评论数 1 ? 被围观 热度 49?现在开发中的功能需要直接跳转到拨号、联系人、短信界面等等&#xff0c;查找了很多资料&#xff0c;自己整理了一下。 首先&#xff0c;…...

电商网站建设心得体会/海南网站设计

Python3求最后一个单词长度给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s&#xff0c;返回其最后一个单词的长度。如果字符串从左向右滚动显示&#xff0c;那么最后一个单词就是最后出现的单词。如果不存在最后一个单词&#xff0c;请返回 0 。说明&#xff1a;一个单词是指…...

分类信息网站手机版/seo排名资源

程序员职场三部曲之三 把求职中的“道”与“术”有效结合&#xff0c;能让您迷途中眼前一亮。 在找工作的茫茫大军里&#xff0c;本书让您有机会领先一步取得最后的胜利&#xff01; Leo继《程序员羊皮卷》、《程序员职场第一课》之后为读者奉上的求职速查手册&#xff01; …...