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

Nginx简单介绍

第九天

Nginx

1.什么是Nginx,他有什么优势和功能?

Nginx是一个高性能的 Web 服务器、方向代理服务器、负载均衡器。他一般用于反向代理,负载均衡,缓存数据,托管静态网站等。

反向代理,保正高可靠性,实现是Nginx作为客户端和服务端的中介,隐藏了后端架构,用户访问网站,Nginx会监听请求转发到对应的后端服务器,后端处理后,通过反向代理返回给客户端。

负载均衡,是将流量分发到多个后端服务器,避免单点过载,提高可用性。使用流程是nginx监听有请求时,会根据负载均衡算法,轮询,最少连接数等,选择一台后端服务器。将请求发送到选中的服务器。后端处理完成后,结果通过负载均衡器返回客户端。

缓存数据,存储频繁访问的静态或动态内容,减少后端计算和数据库查询

扩展

负载均衡算法

算法指令示例适用场景特点
轮询 (RR)upstream { server1; server2 }后端服务器性能均衡默认策略,简单公平
加权轮询server 10.0.0.1 weight=3异构服务器(CPU/RAM差异)性能差的服务器分配较少请求
最少连接 (Least Conn)least_conn长连接服务(如WebSocket)动态分配,避免过载
IP哈希ip_hash会话保持需求同一客户端固定访问某服务器
响应时间优先fair (第三方模块)对延迟敏感的服务需安装额外模块

反向代理工作原理

请求处理流程

  1. 请求接收:客户端连接Nginx 80/443端口

  2. 协议解析:解构HTTP头部,匹配server_name

  3. 路由转发:根据location规则选择upstream

    location /api/ {proxy_pass http://backend;proxy_set_header X-Real-IP $remote_addr;
    }
  4. 连接复用:通过keepalive维持与后端长连接

  5. 响应缓冲:启用proxy_buffering on避免慢客户端拖慢Worker

关键优化参数
proxy_buffer_size 4k;       # 响应头缓冲区
proxy_buffers 8 16k;       # 响应内容缓冲区
proxy_connect_timeout 5s;  # 后端连接超时

2.Nginx是如何处理一个HTTP请求的呢?实现原理是什么?

Nginx的多进程机制

Nginx采用主进程(Master Process)和工作进程(Worker Process)的架构。启动时,主进程会预先创建固定数量的工作进程(通常与CPU核心数相同),而非为每个连接动态创建进程。这些工作进程共享监听套接字,采用事件驱动模型并行处理多个客户端连接。工作进程之间完全独立运行,无需加锁,降低了编程复杂度。当某个工作进程异常退出时,主进程会立即重新启动一个新进程,确保服务的高可用性。这种设计的优势在于避免了动态创建进程的开销,同时通过进程隔离提高了稳定性。但由于采用多进程模型,仍存在一定的内存占用问题,每个工作进程需要维护独立的内存空间。

Nginx的异步非阻塞机制

Nginx的工作进程基于异步非阻塞I/O模型,单个进程可以同时处理数千个连接。当工作进程接收到客户端请求后,如果遇到I/O操作(如磁盘读写或网络通信),会立即将该请求挂起并转去处理其他就绪请求(非阻塞),而客户端在此期间也不会被阻塞(异步)。当I/O操作完成时,操作系统会通过事件通知机制(如epoll或kqueue)唤醒工作进程,后者会根据事件队列继续处理对应的请求。这种机制通过事件驱动和回调函数实现高并发,但要求所有I/O操作都必须是非阻塞的,且应用程序需要适应这种编程范式。

3.请解释Nginx服务器上的Master和Worker进程分别是什么?

Master进程(主进程)

Nginx的管理者,负责全局控制,不直接处理客户端请求。

Worker进程(工作进程)

Nginx的实际工作者,负责处理客户端请求(如HTTP/TCP连接)。

并发请求处理:每个Worker通过事件驱动(epoll/kqueue)非阻塞处理数千连接

动态请求代理:反向代理时,将请求转发到后端(如Node.js/Java)。

http://www.dtcms.com/a/297139.html

相关文章:

  • 【STM32】Keil + FreeRTOS + HAL DMA + UART 空闲中断 接收异常
  • 【矩阵专题】Leetcode48.旋转图像(Hot100)
  • leetcode_122 买卖股票的最佳时机II
  • STM32与ADS1220实现多通道数据采集的完整分析和源程序
  • Comfyui中Upscale Image By 几种放大方法的区别
  • Java研学-RabbitMQ(三)
  • Centos7安装rabbitmq
  • RabbitMQ—HAProxy负载均衡
  • React性能优化终极指南:memo、useCallback、useMemo全解析
  • Ubuntu22 上,用C++ gSoap 创建一个简单的webservice
  • NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!
  • Spring Boot 自动装配底层源码实现详解
  • 国产DevOps平台Gitee:如何重塑中国企业研发效能新格局
  • Java 单元测试详解:从入门到实战,彻底掌握 JUnit 5 + Mockito + Spring Boot 测试技巧
  • react中 多个层级 组件数据同用 组件之间传值 usecontext useReducer
  • Gitee如何成为国内企业DevOps转型的首选平台?
  • 璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式
  • ERNIE-4.5-0.3B 实战指南:文心一言 4.5 开源模型的轻量化部署与效能跃升
  • 规则分配脚本
  • 初识JVM--从Java文件到机器指令
  • 中国开源Qwen3 Coder与Kimi K2哪个最适合编程
  • “磁”力全开:钕铁硼重塑现代科技生活
  • Linux 网络与 Vim 编辑器操作
  • 3D实景的概念、特点及应用场景
  • 从“人工眼”到‘智能眼’:EZ-Vision视觉系统如何重构生产线视觉检测精度?
  • AI与区块链融合:2025年的技术革命与投资机遇
  • C++与Hive、Spark、libhdfs、ACID交互技巧
  • Vue2下
  • VR 技术在污水处理领域的创新性应用探索​
  • C++ string:准 STL Container