Nginx反向代理和缓存

news2024/11/26 8:17:37

一、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架构内配置动态页面和静态页面,浏览器分别访问静态服务器的动态资源和动态服务器的静态资源,验证动静分离结果。

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

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

相关文章

是谁?写的Java神作一出版就获Jolt图书大奖【抽奖赠书】

送书活动 1️⃣参与方式:点此参与抽书抽奖 2️⃣获奖方式:小程序随机 抽5位,每位小伙伴一本《Effective Java中文2024版》 3️⃣活动时间:截止到 2024-4-6 12:01:00 注:所有抽奖活动都是全国范围免费包邮到家&#xff…

HWOD:等差数列前n项的和

一、知识点 1、杨辉三角 第一行有1个,第二行有2个,第三行有3个,第n行有n个 前n行的和为(n1)*n/2 2、等差数列 等差数列,第1个数,有1个基数,0个公差;第2个数,有1个基数&#xff…

最优算法100例之24-打印1到最大的n位数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则…

使用open3d进行人体配准和重建学习记录

使用open3d进行人体配准和重建学习记录 一、使用kinectv2捕捉人体rgb和depth图二、重建部分2.1 泼松重建2.2 滚球重建2.3 alpha重建 一、使用kinectv2捕捉人体rgb和depth图 # -*- coding: utf-8 -*- # Time : 2024/3/20 17:26 # Author : sjh # Site : # File : ma…

外贸建站:WordPress搭建外贸独立站零基础自建站完整教程(2024)

对于做外贸来说,拥有自己的外贸独立网站真的非常重要。在外贸领域,如今各平台竞争激烈,规则多,成本高,价格战、政策变化快,还存在封店风险等等因素。在这种情况下,拥有外贸独立站就能很好规避上…

保卫蓝天:持续努力,任重道远|中联环保圈

经过长达十年的不懈努力,我国在大气污染防治领域取得了令人瞩目的历史性成就。空气质量明显改善,蓝天保卫战初见成效。但是也必须清醒地认识到,目前仍面临着诸多严峻挑战,保卫蓝天的任务依然任重道远。 2023 年,我国空…

使用pip安装Jupyter

通过pip安装Jupyter Notebook. pip install jupyter通过pip安装Jupyter Lab pip install jupyterlab启动Jupyter jupyter notebook

人人都离不开的算法:AI 时代的生存指南

文章目录 一、算法在生活中的“无处不在”二、算法在工作学习中的“智慧助力”三、算法在社会发展中的“驱动力量”四、算法带来的“双刃剑”效应五、应对算法挑战的策略《人人都离不开的算法——图解算法应用》编辑推荐1、通俗易懂2、技术科普3、贴近时代、贴近生活4、启发思考…

pygame--坦克大战(二)

加载敌方坦克 敌方坦克的方向是随机的,使用随机数生成。 初始化敌方坦克。 class EnemyTank(Tank):def __init__(self,left,top,speed):self.images {U: pygame.image.load(img/enemy1U.gif),D: pygame.image.load(img/enemy1D.gif),L: pygame.image.load(img/e…

僵死进程(僵尸进程)

1.僵死进程产生的原因或者条件: 什么是僵死进程?当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取子进…

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程 📍相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 ✨stm32使用硬件I2C去读取角度数据,通过STM32CubeMX工具配置工程,读取角度数据,只需要调用一个函数&#xf…

vulhub打靶记录——healthcare

文章目录 主机发现端口扫描FTP—21search ProPFTd EXPFTP 匿名用户登录 web服务—80目录扫描search openemr exp登录openEMR 后台 提权总结 主机发现 使用nmap扫描局域网内存活的主机,命令如下: netdiscover -i eth0 -r 192.168.151.0/24192.168.151.1…

空间数据结构(四叉树,八叉树,BVH树,BSP树,K-d树)

下文参考:https://www.cnblogs.com/KillerAery/p/10878367.html 游戏编程知识课程 - 四分树(quadtree)_哔哩哔哩_bilibili 利用空间数据结构可以加速计算,是重要的优化思想。空间数据结构常用于场景管理,渲染,物理,游…

云计算对象存储服务

对象存储服务(OSS)中的存储桶(Bucket)叫做‘OBS桶 存储桶(Bucket):存储桶式对象存储服务中用于存储对象的基本容器,类似于文件系统中的文件夹。每个存储桶具有唯一的名称,并且可以在桶中存储任…

用于自动驾驶,无人驾驶领域的IMU六轴陀螺仪传感器:M-G370

用于自动驾驶,无人驾驶的IMU惯导模块六轴陀螺仪传感器:M-G370。自2020年,自动驾驶,无人驾驶已经迎来新突破,自动驾驶汽车作为道路交通体系的一员,要能做到的就是先判断周边是否有障碍物,自身的行驶是否会对其他交通参与成员产生危…

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍: 在控制领域里面,我们可以用信号输出定时器,进行PWM的控制,从而达到控制电机的目的,通过输入捕获功能可以用来接收外部的数字信号,用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…

二维相位解包理论算法和软件【全文翻译-将相位分解为 “非旋转 “和 “旋转 “(2.4)】

2.4 将相位分解为 "非旋转 "和 "旋转 "部分 借用电磁场理论,可以用发散和卷曲来指定矢量场[9][10]。当且仅当矢量函数 F(r)(以及由其描述的场)在整个域 D 中不旋转或无旋转时,我们称之为矢量函数 F(r)、 因此,如果等式 2.30(也是第 2.2 节关于路径…

面对汽车充电桩隐私泄露威胁,应该怎么做?

想必各位车主在第一次扫码或刷卡使用汽车充电桩时,都会出现类似于上图的请求,除了上述的定位权限外,运营商还会索要你的网络权限、相机权限、通知权限、设备信息权限、存储权限、电话权限等。 那么你知道这些权限充电桩获取后到底用于什么吗&…

DELL服务器使用iDRAC升级BIOS等固件版本

前言 正值DELL推出DELL R730XD服务器最新的BIOS固件(2.19.0 2024/3/18)之际,本人也有合适的时间将手头的服务器BIOS固件进行升级操作。 本文博将DELL R730xd 的iDRAC8版本为例,介绍整个升级过程。其他DELL类型的服务器操作类似&…

黄金票据攻击

黄金票据攻击——域内横向移动技术 一、黄金票据攻击介绍: 黄金票据攻击是一种滥用Kerberos身份认证协议的攻击方式,它允许攻击者伪造域控krbtgt用户的TGT(Ticket-Granting Ticket)。通过这种方法,攻击者可以生成有效…