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

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

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

相关文章

C++的并发世界(三)——线程对象生命周期

0.案例代码 先看下面一个例子&#xff1a; #include <iostream> #include <thread>void ThreadMain() {std::cout << "begin sub thread:" << std::this_thread::get_id()<<std::endl;for (int i 0; i < 10; i){std::cout <&…

介绍一下Java的数据类型

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

[RK3399-Android10] 关于USB触摸屏休眠状态无法唤醒设备的一种情况

问题描述 RK3399 Android10平台上&#xff0c;USB触摸屏在系统按键休眠之后&#xff0c;无法触摸唤醒设备。查看内核日志&#xff0c;发现休眠之后&#xff0c;USB设备直接断开&#xff0c;lsusb发现不了设备。休眠之后host接口没有断开电源&#xff0c;使用USB鼠标插在同一个…

【详细介绍WebKit的结构】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

PAC下的ROP问题

Armv8.3-A引入了pointer authentication选项。 pointer authentication可以减轻ROP攻击。 为了防止ROP攻击&#xff0c;在函数开始时&#xff0c;LR寄存器中的返回地址被签名。这意味着在寄存器的高位添加了一个PAC。在返回之前&#xff0c;使用PAC对返回地址进行验证。如果检查…

如何搭建一个个人网站,个人博客?

搭建一个个人网站可以是一个有趣且有益的过程。下面是一些基本步骤和考虑因素&#xff0c;帮助你开始这个过程&#xff1a; 一、确定目标和内容 网站类型&#xff1a;首先&#xff0c;你需要明确你的网站类型。是个人博客、作品集展示、在线商店还是其他类型&#xff1f;内容…

大学html作业-个人简历静态网站(免费)

大学html作业-个人简历静态网站&#xff08;免费&#xff09; 源码来自githab&#xff0c;有些简单的问题我都修复了。大家可以直接去找原作者的源码&#xff0c;如果githab打不开就从我下载的网盘里下载吧。 效果

SpringBoot中操作Bean的生命周期的方法

引言 在 Spring Boot 应用中&#xff0c;管理和操作 Bean 的生命周期是一项关键的任务。这不仅涉及到如何创建和销毁 Bean&#xff0c;还包括如何在应用的生命周期中对 Bean 进行精细控制。Spring 框架提供了多种机制来管理 Bean 的生命周期&#xff0c;这些机制使得开发者可以…

Error: TF_DENORMALIZED_QUATERNION: Ignoring transform forchild_frame_id

问题 运行程序出现&#xff1a; Error: TF_DENORMALIZED_QUATERNION: Ignoring transform for child_frame_id “odom” from authority “unknown_publisher” because of an invalid quaternion in the transform (0.0 0.0 0.0 0.707) 主要是四元数没有归一化 Eigen::Quatern…

【Kotlin】委托模式

1 委托模式简介 委托模式的类图结构如下。 对应的 Kotlin 代码如下。 fun main() {var baseImpl BaseImpl()var baseWrapper BaseWrapper(baseImpl)baseWrapper.myFun1() // 打印: BaseImpl, myFun1baseWrapper.myFun2() // 打印: BaseImpl, myFun2 }interface Base {fun my…

【御控物联】JavaScript JSON结构转换(18):数组To对象——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON数组 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

golang语言系列:Web框架+路由 之 Echo

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是golang语言系列文章&#xff0c;本篇主要对 Echo 框架 的基本使用方法 进行学习 1.Echo是什么 Go 有众多Web框架&#xff0c;Echo 是其中的一个&#xff0c;官网介绍Echo有高性能、可扩展性、极简的特点。使用E…