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

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明:


一、Nginx 的核心功能

1. 静态资源服务

  • 功能:直接返回静态文件(如 HTML、CSS、JS、图片、视频等)。
  • 配置示例
    server {listen 80;server_name example.com;root /var/www/html;  # 静态文件根目录location / {index index.html;}
    }
    

2. 反向代理

  • 功能:将客户端请求转发到后端服务器(如 Tomcat、Node.js、Python 应用等),隐藏后端细节。
  • 配置示例
    server {listen 80;server_name api.example.com;location / {proxy_pass http://backend_servers;  # 转发到后端服务器组proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
    }
    

3. 负载均衡

  • 功能:将请求分发到多个后端服务器,支持多种负载均衡算法(轮询、权重、IP 哈希等)。
  • 配置示例
    upstream backend_servers {server 192.168.1.101:8080 weight=3;  # 权重轮询server 192.168.1.102:8080;server 192.168.1.103:8080 backup;    # 备用服务器
    }
    

4. SSL/TLS 终止

  • 功能:处理 HTTPS 加密和解密,减轻后端服务器压力。
  • 配置示例
    server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.crt;ssl_certificate_key /etc/nginx/ssl/example.key;location / {proxy_pass http://backend_servers;}
    }
    

5. 缓存加速

  • 功能:缓存动态内容或静态资源,减少后端负载并提升响应速度。
  • 配置示例
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
    server {location / {proxy_cache my_cache;proxy_pass http://backend_servers;proxy_cache_valid 200 302 10m;  # 缓存有效时间}
    }
    

6. 访问控制与安全

  • 功能:限制 IP 访问、请求速率、防盗链等。
  • 配置示例
    location /admin {allow 192.168.1.0/24;  # 允许特定 IP 段deny all;              # 拒绝其他 IP
    }location /uploads {valid_referers none blocked example.com;  # 防盗链if ($invalid_referer) {return 403;}
    }
    

7. 日志记录

  • 功能:记录请求日志,支持自定义日志格式。
  • 配置示例
    log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    

二、Nginx 的核心职责

  1. Web 服务器:高效处理静态资源请求。
  2. 反向代理网关:转发请求到后端应用服务器,隐藏后端架构。
  3. 负载均衡器:分配流量到多个服务器,提升系统可用性。
  4. 安全防护层:通过 SSL 加密、访问控制保护后端服务。
  5. 流量管理:实现限流、缓存、压缩(如 Gzip)等优化。

三、Nginx 的工作原理

1. 事件驱动模型

  • 异步非阻塞 I/O
    Nginx 使用 epoll(Linux)或 kqueue(BSD)等系统调用,单线程可处理数千并发连接,避免传统多线程模型的上下文切换开销。
  • 多进程架构
    • Master 进程:负责读取配置、绑定端口、管理 Worker 进程。
    • Worker 进程:实际处理请求的进程,彼此独立,避免资源竞争。
      在这里插入图片描述

2. 请求处理流程

  1. 客户端发起请求到 Nginx 监听端口。
  2. Worker 进程通过事件驱动模型接收请求。
  3. 根据配置匹配 serverlocation 块,执行反向代理、缓存读取等操作。
  4. 若需访问后端服务器,通过负载均衡算法选择目标服务器。
  5. 返回响应给客户端(可能经过缓存或压缩处理)。
    在这里插入图片描述

3. 核心模块化设计

  • 模块分类
    • 核心模块(如 ngx_http_core_module
    • 第三方模块(如 ngx_http_lua_module 支持 Lua 脚本)
  • 动态加载:支持按需加载模块,减少资源占用。

四、Nginx 的应用场景

  1. 静态资源托管
    • 直接托管 HTML、图片等文件,替代 Apache 或 Tomcat。
  2. API 网关
    • 反向代理微服务,统一入口管理鉴权、限流、日志。
  3. 动态内容加速
    • 缓存数据库查询结果或动态页面(如电商商品页)。
  4. 高并发负载均衡
    • 分配请求到多台应用服务器(如抢购场景)。
  5. SSL 卸载
    • 集中处理 HTTPS 加解密,降低后端服务器压力。
  6. 灰度发布
    • 通过流量切分(如按比例或 IP)测试新版本服务。

五、Nginx 高性能的原因

1. 事件驱动与非阻塞 I/O

  • 单线程处理大量连接,避免多线程/进程的上下文切换开销。

2. 高效内存管理

  • 零拷贝技术:通过 sendfile 系统调用直接传输文件,减少内核态与用户态数据拷贝。
  • 内存池机制:预分配内存块,减少频繁的内存申请释放操作。

3. 多进程架构

  • Worker 进程独立运行,避免锁竞争,充分利用多核 CPU。

4. 轻量级设计

  • 模块化架构,核心代码精简,第三方模块按需加载。

5. 配置优化友好

  • 支持连接复用(Keep-Alive)、响应压缩(Gzip)、缓存等优化策略。

六、Nginx 的优缺点

优点

  • 高并发处理能力(单机支持数万并发连接)。
  • 低内存消耗(静态资源处理尤其高效)。
  • 灵活的配置和模块化扩展。
  • 广泛的应用场景和社区支持。

缺点

  • 动态内容处理依赖后端服务(如 PHP 需配合 FastCGI)。
  • 复杂配置需一定学习成本。
  • 原生不支持动态模块热加载(需重启生效)。

七、总结

Nginx 凭借其事件驱动模型、高效资源管理和模块化设计,成为现代 Web 架构的核心组件。无论是作为静态服务器、反向代理,还是负载均衡器,Nginx 都能显著提升系统性能和可靠性。合理配置其缓存、压缩、负载均衡策略,可应对高并发、大流量场景(如电商大促、在线教育等)。

相关文章:

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明: 一、Nginx 的核心功能 1. 静态资源服务 功能:直接返回静态文件(如 HTML、CSS、JS、图片、视频等)。配置示例:server {listen 80…...

Spring Boot中使用Flyway进行数据库迁移

文章目录 概要Spring Boot 集成 FlywayFlyway 其他用法bug错误Flyway版本不兼容数据库存在表了Flyway 的校验和(Checksum)不匹配 概要 在 Spring Boot 项目开发中,数据库的变更不可避免。手动执行 SQL 脚本不仅容易出错,也难以维…...

CAS单点登录(第7版)9.属性

如有疑问,请看视频:CAS单点登录(第7版) 属性 属性定义 概述 属性定义 从身份验证或属性存储库源获取和解析 CAS 中属性的定义时,往往使用其名称进行定义和引用,而无需任何其他元数据或修饰。例如&#…...

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...

P9853 [入门赛 #17] 方程求解

P9853 [入门赛 #17] 方程求解 - 洛谷 题目描述 小A有n个关于x的方程,第i个方程形如ai​xi​bi​ci​。方程的解x均为正整数,例如下面几个方程都是符合要求的方程: 2x 4 10 -3x 13 10 4x - 8 16 其中,第一组方程的解为x1​…...

【网络安全 | 漏洞挖掘】跨子域账户合并导致的账户劫持与删除

未经许可,不得转载。 文章目录 概述正文漏洞成因概述 在对目标系统进行安全测试时,发现其运行着两个独立的域名——一个用于司机用户,一个用于开发者/企业用户。表面上看,这两个域名各自独立管理账户,但测试表明它们在处理电子邮件变更时存在严重的逻辑漏洞。该漏洞允许攻…...

spring集成activiti流程引擎(源码)

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,请假审批demo从流程绘制到审批结束实例。 源码获取:本文末个人名片直接获取。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行…...

ROS基本功能

1.Topic话题与Message消息(主要通讯方式) 基本规则 发布消息的步骤 常用工具 话题的订阅 使用launch启动多个节点...

C++基础系列【13】类的成员初始化

博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇&#x1f…...

Redis 03章——10大数据类型概述

一、which10 (1)一图 (2)提前声明 这里说的数据类型是value的数据类型,key的类型都是字符串 官网:Understand Redis data types | Docs (3)分别是 1.3.1redis字符串&#xff0…...

Ubuntu 上安装 Elasticsearch 7.6.0

要在 Ubuntu 24.04 上安装 Elasticsearch 7.6.0,可以按照以下步骤进行: 步骤 1: 更新系统依赖 确保系统是最新的,并安装必要的依赖包: sudo apt update sudo apt upgrade -y sudo apt install -y apt-transport-https openjdk-1…...

Android ListPreference使用

Android ListPreference使用 参考 添加链接描述 导入 androidx.preference.ListPreferenceListPreference是Android中的一个Preference子类,用于显示一个可选择的列表,并且可以保存用户所选择的值。它继承自DialogPreference,可以在用户点击时弹出一个对话框,显示可选择的…...

Java 大视界 -- 绿色大数据:Java 技术在节能减排中的应用与实践(90)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程

该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…...

英码科技基于昇腾算力实现DeepSeek离线部署

DeepSeek-R1 模型以其创新架构和高效能技术迅速成为行业焦点。如果能够在边缘进行离线部署,不仅能发挥DeepSeek大模型的效果,还能确保数据处理的安全性和可控性。 英码科技作为AI算力产品和AI应用解决方案服务商,积极响应市场需求&#xff0…...

CTex安装和使用(1)

CTeX是一款基于TeX/LaTeX的集成开发环境(IDE),主要用于文档排版,特别是在处理复杂的数学公式和学术论文方面具有显著优势。以下是CTeX的一些基本信息: 功能 文档编辑 :提供了一个友好的界面用于编辑LaTeX…...

Oracle序列(基础操作)

序列概念 序列是用于生成唯一、连续序号的对象。 序列可以是升序的,也可以是降序的。 使用CREATE SEQUENCE语句创建序列。 start with 1 指定第一个序号从1开始 increment by 1 指定序号之间的间隔为1 increment by -1 降序1000 999 998这样 maxvalue 2000 表…...

Unity Shader Graph 2D - Procedural程序化图形循环的箭头

前言 箭头在游戏开发中也是常见的一种图形之一,在游戏中箭头通常会用作道路引导或者指示,告诉玩家前进的方向,是比较重要的提示信号。本文将通过使用程序化图形来实现循环滚动的箭头效果,实践和熟悉Shader Graph的相关节点。 首先创建一个Shader Graph文件命名为Mo…...

4、C#基于.net framework的应用开发实战编程 - 测试(四、二) - 编程手把手系列文章...

四、 测试; 四.二、实际运行; 在应用调试完毕,Bug基本解决的时候就需要对应用进行实际运行来进行查看使用体验及分发的准备工作。 1、 运行设置; 在启动项目上右键属性,点击生成,将顶部的配置改…...

Windows搭建CUDA大模型Docker环境

Windows搭建CUDA大模型Docker环境 一、安装Docker二、拉取镜像三、启动容器四、安装依赖环境五、安装Miniconda3六、设置pip源地址 一、安装Docker windows中docker安装教程 二、拉取镜像 系统:Ubuntu20.04CUDA版本:11.8.0 docker pull nvcr.io/nvid…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...