Nginx反向代理架构介绍

Nginx反向代理架构是一种强大的服务器架构模式,它位于用户和原始服务器之间,接收用户的请求并将其转发到一个或多个后端服务器,然后将从后端服务器获取的响应返回给用户,就好像这些内容都是由代理服务器本身直接提供的一样。以下是对Nginx七层反向代理架构的详细剖析:

文章目录

      • 一、工作原理
      • 二、核心优势
      • 三、配置示例
      • 四、特殊场景应用
      • 五、Nginx进程模型
      • 六、Nginx线程模型
      • 七、Nginx进程及线程模型的优势

一、工作原理

  1. 请求接收与解析

    • Nginx接收到客户端的HTTP请求后,会解析请求的URL、HTTP头部信息等,以理解请求的具体内容和目标。
  2. 配置规则查找

    • 基于解析的结果,Nginx会查找其配置规则,确定应该将请求转发到哪个后端服务器。这个选择过程可能涉及多种因素,如URL路径、请求类型、负载均衡算法等。
  3. 请求转发

    • Nginx会建立一个到选定后端服务器的新连接(除非使用了连接池),并将原始请求转发给这个后端服务器。在转发过程中,Nginx可能会修改某些HTTP头部信息,例如添加表示真实客户端IP的X-Forwarded-For头部。
  4. 响应处理

    • 后端服务器接收到请求后,会处理这个请求并生成响应。这个响应会被发送回Nginx。
    • Nginx接收到后端服务器的响应后,可能会对响应进行一些处理,例如添加或修改某些HTTP头部,或者对响应内容进行压缩。
  5. 响应返回

    • 最后,Nginx将处理后的响应发送回原始客户端。从客户端的角度来看,整个过程就像是直接与Nginx通信,而不知道后端服务器的存在。

二、核心优势

  1. 负载均衡

    • 当有多个后端服务器时,Nginx可以根据预定义的规则将请求分发到不同的服务器,从而平衡各服务器的负载,提高整体系统的性能和可用性。
  2. 安全性增强

    • 通过隐藏后端服务器的真实IP地址和架构细节,Nginx可以有效地保护后端资源免受直接攻击。
    • 此外,Nginx还可以集中实施安全策略,如SSL/TLS加密、请求过滤等。
  3. 缓存优化

    • Nginx可以缓存静态内容和一些动态内容,减轻后端服务器的压力,同时提高响应速度。
  4. 灵活的请求路由

    • 通过配置不同的路由规则,Nginx可以将不同类型的请求导向不同的后端服务,实现微服务架构或者API网关的功能。
  5. 系统扩展性

    • Nginx允许通过添加或移除后端服务器来调整系统容量,客户端无需感知这些变化。这种透明的扩展能力有助于应对流量波动和系统升级。

三、配置示例

在Nginx中,反向代理的配置主要在http块内的server块中进行。一个基本的反向代理配置示例如下:

http {
    server {
        listen 80;
        server_name example.com;
        
        location / {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

在这个配置中:

  • 定义了一个监听80端口的服务器,它将接收所有发往example.com的请求。
  • location /块指定了对根路径“/”的处理规则,这里使用proxy_pass指令将请求转发到后端服务器http://backend_server
  • proxy_set_header指令用于设置或修改发送给后端服务器的请求头。

四、特殊场景应用

除了基本的反向代理功能外,Nginx还支持一些特殊场景的应用,例如:

  1. UWSGI协议支持

    • 对于使用UWSGI协议的Web应用,Nginx可以通过uwsgi_pass指令将请求转发到运行UWSGI协议的后端服务器。
    • UWSGI协议是一种二进制协议,专为Web服务器和Web应用程序之间的通信而设计,相比HTTP协议具有更高的效率。
  2. 高并发处理

    • Nginx采用事件驱动的架构和非阻塞I/O模型,能够同时处理大量的并发连接,而不需要为每个连接创建一个新的线程或进程。
  3. HTTPS支持

    • 对于需要处理HTTPS请求的场景,Nginx可以在server块中配置SSL/TLS,以确保数据传输的安全性。

五、Nginx进程模型

Nginx采用的是主进程和工作进程(worker processes)的模型。在这种模型中,Nginx会启动一个主进程(Master Process)和多个工作进程(Worker Processes)。

  1. 主进程(Master Process)

    • 主要职责是配置文件的解析和工作进程的管理。
    • 负责读取和验证配置文件(nginx.conf),在配置文件发生变化时(如使用nginx -s reload命令时),它会重新加载配置文件而无需重启服务。
    • 负责创建、监控和结束工作进程的生命周期。
    • 可以接收系统信号(如重启、停止等),并根据信号进行相应的操作,例如重新加载配置文件或优雅地关闭工作进程。
  2. 工作进程(Worker Processes)

    • 是实际处理客户端请求的进程。
    • 通常情况下,会根据服务器的CPU核心数量来设置工作进程的数量,以便充分利用多核处理器的优势。
    • 每个工作进程都是独立的,它们运行在独立的内存空间中,并且通常不进行父子进程间的通信。
    • 工作进程通过竞争方式来处理来自客户端的连接和请求。当一个客户端连接到达时,Nginx会根据特定的算法(如轮询)选择一个工作进程来处理该连接。
    • 工作进程负责从接收请求、解析、处理到响应的全过程。

六、Nginx线程模型

虽然Nginx主要基于多进程模型,但它在代码中提供了一个thread_pool(线程池)的核心模块来处理多任务。这个模块是可选的,并且需要手动配置才能启用。

  1. 线程池配置

    • 配置语法:thread_pool name threads=number [max_queue=number];其中,name是线程池的名称,threads=number指定了线程池中的线程数量,max_queue=number指定了队列的最大长度。
  2. 工作原理

    • 每个工作进程可以配置一个或多个线程池。
    • 当工作进程需要处理大量I/O密集型任务时(如磁盘读写、网络通信等),它可以将这些任务交给线程池来处理。
    • 线程池中的线程会并发地执行这些任务,从而提高处理效率。

然而,需要注意的是,Nginx的线程池模块并不是其主要的并发处理机制。在大多数情况下,Nginx的多进程和异步非阻塞处理机制已经足够满足高并发的需求。线程池模块主要用于处理一些特定的、需要并发执行的任务。

七、Nginx进程及线程模型的优势

  1. 高并发处理能力

    • Nginx通过多进程和异步非阻塞的处理机制,能够高效地处理大量的并发连接,而不会显著增加资源消耗。
  2. 稳定性和可靠性

    • 如果一个工作进程崩溃,它不会影响其他工作进程,主进程可以简单地启动一个新的工作进程来替代。这种设计提高了系统的稳定性和可靠性。
  3. 内存使用高效

    • 工作进程的独立性意味着内存使用更加高效,因为不需要为所有请求维护一个单一的大型内存空间。
  4. 灵活性和可扩展性

    • Nginx的进程和线程模型允许根据服务器的硬件资源和应用场景进行灵活的配置和调整,以满足不同的性能需求。

综上所述,Nginx的七层反向代理架构通过其高效的工作机制、丰富的功能和灵活的配置选项,成为构建现代Web应用架构的理想选择。Nginx的进程及线程模型是其高性能和高并发处理能力的关键所在。通过合理配置和调整Nginx的进程和线程数量以及线程池参数,可以充分发挥Nginx的性能优势,满足各种应用场景的需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BeanFactory 是什么?它与 ApplicationContext 有什么区别?

谈到Spring,那势必要讲讲容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么? BeanFactory,其实就是 Spring 容器,用于管理和操作 Spring 容器中的 Bean。可能此时又有初学的小伙伴会问:Bean 是什么&#x…

ABP - 缓存模块(1)

ABP - 缓存模块(1) 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching ,而对于分布式缓存…

SWD仿真接口(for ARM)的使用方法

概述: JTAG JTAG代表联合测试行动小组(定义JTAG标准的小组),旨在作为测试板的一种方式。JTAG允许用户与微控制器的各个部分进行对话。在许多情况下,这涉及一组指令或对电路板进行编程。JTAG标准定义了5个引脚: TCK: Test Clock TMS: Test Mode Select TDI: Test Data-…

Linux UDP 编程详解

一、引言 在网络编程领域,UDP(User Datagram Protocol,用户数据报协议)作为一种轻量级的传输层协议,具有独特的优势和适用场景。与 TCP(Transmission Control Protocol,传输控制协议&#xff0…

OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 为已校准的立体相机的每个头计算校正变换。 cv::stereoRectify 是 OpenCV 中用于立体校正的函数,它基于已知的相机参数和相对位置&am…

AWS物联网连接的数据记录器在冰川环境中的性能比较:Campbell CR1000X与ESP32开源

论文标题 中文:AWS物联网连接的数据记录器在冰川环境中的性能比较:Campbell CR1000X与ESP32开源 英文:Performance comparison of AWS IoT connected dataloggers in glacier environments: Campbell CR1000X vs. ESP32 Open source 作者信…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下: 假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

Python爬虫学习前传 —— Python从安装到学会一站式服务

早上好啊,大佬们。我们的python基础内容的这一篇终于写好了,啪唧啪唧啪唧…… 说实话,这一篇确实写了很久,一方面是在忙其他几个专栏的内容,再加上生活学业上的事儿,确实精力有限,另一方面&…

【书生大模型实战营】Git 基础知识-L0G3000

本文是书生大模型实战营系列的第三篇文章,本文的主题是:Git基础知识点。 原始教程链接:Tutorial/docs/L0/git/readme.md at camp4 InternLM/Tutorial 1.Git总览 什么是Git? Git是一个分布式版本控制系统,广泛用于…

基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)

个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库&…

python如何解析word文件格式(.docx)

python如何解析word文件格式(.docx) .docx文件遵从开源的“Office Open XML标准”,这意味着我们能用python的文本操作对它进行操作(实际上PPT和Excel也是)。而且这并不是重复造轮子,因为市面上操作.docx的…

Visual Studio2019调试DLL

1、编写好DLL代码之后,对DLL项目的属性进行设置,选择待注入的DLL,如下图所示 2、生成DLL文件 3、将DLL设置为启动项目之后,按F5启动调试。弹出选择注入的exe的界面之后,使用代码注入器注入步骤2中生成的dll&#xff…

nginx 配置防爬虫

今天早上查看服务器,发现昨天发布的一个在线解析充电桩协议的网页工具有大量的访问记录,应该是爬虫在爬api接口数据。该工具api接口后台用的是python写的,和大多数项目一样也采用nginx反向代理,由于采用nginx,可以利用…

日志收集Day001

1.ElasticSearch 作用:日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml(这里yy做了别名,过滤掉空行和注释行) yy /etc/el…

微信小程序-base64加解密

思路:先创建一个base64.js的文件,这个文件可以作为专门加解密的文件模块,需要时就引用;创建好后,引用base64.js里的加解密函数。 注意:引用模块一定要引用正确的路径,否则会报错。 base64.js:…

【网络协议】【http】【https】AES-TLS1.2

【网络协议】【http】【https】AES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议TLS TLS 协议用于应用层协议(如 HTTP)和传输层(如 TCP)之间,增加了一层安全性来解决 HTTP 存在的问题,H…

打造更安全的Linux系统:玩转PAM配置文件

在Linux系统中,用户认证是确保系统安全的关键步骤。PAM(可插拔认证模块)为我们提供了一个非常灵活的框架,帮助我们管理各种服务的认证过程。其中,/etc/pam.d目录是PAM配置的核心部分,这里存放了每个服务所需…

无人机技术架构剖析!

一、飞机平台系统 飞机平台系统是无人机飞行的主体平台,主要提供飞行能力和装载功能。它由机体结构、动力装置、电气设备等组成。 机体结构:无人机的机身是其核心结构,承载着其他各个组件并提供稳定性。常见的机身材料包括碳纤维、铝合金、…

【西藏乡镇界面】图层arcgis格式shp数据有乡镇名称和编码2020年wgs84坐标内容测评

西藏乡镇界面图层arcgis格式shp数据有乡镇名称和编码2020年wgs84坐标无偏移

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

🔥 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用(Enabled) 2.3 坐标系(Geometry) **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题(windowTiltle&a…