Skip to content

什么是Nginx?

Nginx(发音为"engine-x")是一款轻量级、高性能的HTTP服务器和反向代理服务器,同时也支持IMAP/POP3代理服务。它由俄罗斯程序员lqor Sysoev于2004年首次发布,旨在解决C10k问题(即在单台服务器上处理每秒1万个并发连接)。

主要特点:

1.高并发处理能力:Nginx采用异步非阻塞事件驱动架构,能够高效地处理大量并发连接。

2.反向代理和负载均衡:它可以作为反向代理服务器,将客户端请求分发到后端多个服务器,并根据不同的策略进行负载均衡。

3.静态文件服务:Nginx在提供静态文件(如HTML、CSS、javaScript、图片等)方面表现出色,速度非常快。

4.模块化设计:用户可以根据需要加载不同的功能模块,扩展其功能。

5.热部署与平滑升级:支持不停机更新配置或升级版本。

6.安全性:通过多种机制保障Web应用的安全性,例如防止DDoS攻击、限制访问速率等。

应用场景

  • 作为Web服务器直接提供静态内容。

  • 作为反向代理服务器,为后端的应用服务器分担压力。

  • 实现负载均衡,提高系统的可用性和性能。

  • 提供缓存功能,减少对后端服务器的压力,加快响应速度

Nginx因其高性能、稳定性、丰富的功能以及较低的资源消耗,在互联网行业中得到了广泛应用。

为什么要用Nginx?或者有哪些优势

使用Nginx的原因有很多,包括但不限于:

  • 高并发连接处理能力:Nginx能够处理数万的并发连接,官方监测能支持5万并发。
  • 反向代理与负载均衡:是其核心强项。能高效地将客户端请求分发到后端多个应用服务器(支持HTTP,HTTPS,FastCGI,uWSGI,gRPC等),提供轮询、加权轮询、IPHash、最少连接等多种负载均衡算法,显著提升应用扩展性和可用性。
  • 内存消耗小:即使开启多个Nginx进程,内存消耗也非常小。
  • 静态文件处理:Nginx在处理静态文件方面表现出色,耗费内存少。
  • 健康检查功能:内置健康检查功能,能够确保请求不会发送到宕机的服务器。
  • 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存。
  • 稳定性高:宕机的概率非常小,接收用户请求是异步的。
  • 热部署与平滑升级:支持不中断服务的情况下重新加载配置(nginx-sreload)或升级二进制版本,对线上业务影响极小。

简述Nginx处理请求的流程?

作为核心的Web服务器和反向代理,Nginx处理请求的流程是其高性能的关键,其核心是非阻塞、事件驱动的架构。流程简述如下:

  1. Master进程启动与初始化:

    • Nginx启动时,首先运行Master进程(主进程)。

    • Master进程负责读取和验证配置文件(nginx.conf),管理Worker进程(工作进程),执行平滑升级、日志重开等管理任务。它本身不处理客户端请求。

  2. Worker进程生成与监听:

    • Master进程根据配置(通常worker_processes设置为CPU核数或稍多)fork出多个Worker进程。

    • 每个Worker进程是独立且平等的,它们各自初始化,独立监听配置中指定的网络端口(如80、443)。这允许多个Worker进程同时竞争处理新连接,提高并发能力。

  3. 事件循环启动:

    • 每个Worker进程启动一个高效的事件循环(EventLoop),通常基于操作系统提供的高性能I/O多路复用机制(如Linux的epoll,FreeBSD的kqueue)。

    • 这个事件循环持续监听其负责的socket(监听套接字和活动连接套接字)上的事件(新连接到达、数据可读、数据可写等)。

  4. 接受新连接(Accept):

    • 当客户端发起一个新连接请求到监听端口时,操作系统内核会通知所有监听该端口的Worker进程。

    • 其中一个Worker进程会成功accept这个新连接,创建一个新的连接套接字(connectionsocket)。其他竞争失败的Worker进程则继续处理其他任务。这一步非常快速。

  5. 读取请求头(ReadHeaders):

    • Worker进程将新接受的连接套接字注册到它自己的事件循环中,监听该套接字上的可读事件

    • 当客户端发送请求数据(首先是HTTP请求头)到达时,事件循环检测到该套接字可读。

    • Worker进程非阻塞地读取请求头数据(尽可能一次性读完整个请求头)。Nginx高效地解析这些头部信息。

  6. 请求处理与路由(ProcessRequest&Routing):

    • 根据解析出的请求头信息(如Host头、请求的URI、请求方法等),Nginx匹配配置规则:

    • 匹配server块:基于listen指令和server_name(即Host头)。

    • 匹配location块:在选定的server块内,根据URI找到最匹配的location

    • 根据匹配到的location配置,决定如何处理该请求:

    • 服务静态文件:直接从磁盘读取文件内容(可能利用sendfile零拷贝优化)并发送响应。

    • 反向代理(proxy_pass):将请求转发给配置的后端服务器组(如应用服务器)。

    • FastCGI/uWSGI处理:将请求转发给FastCGI或uWSGI后端进程(如PHP-FPM,PythonWSGI应用)。

    • 重写(rewrite)或重定向(redirect):修改URI或直接返回重定向响应。

    • 访问控制:检查权限(如allow/deny,auth_basic)。

    • 日志记录:记录访问日志。

    • 内容缓存:检查缓存是否存在有效响应,有则直接返回缓存,无则向后端请求并可能缓存响应。

  7. 处理请求体(ReadBody-IfNeeded):

    • 对于需要处理请求体的请求(如POST提交),Nginx会在必要时(例如,配置了proxy_pass且需要转发请求体,或者需要应用client_body_buffer_size等限制时)继续非阻塞地读取请求体数据。
  8. 生成或转发响应(Generate/ProxyResponse):

    • 静态文件/缓存/重定向:Worker进程直接构造并发送HTTP响应头和响应体(如静态文件内容、缓存内容、301/302响应)。

    • 反向代理/FastCGI/uWSGI:

    • Worker进程根据负载均衡策略(如轮询、最少连接)选择一个后端服务器。

    • 与后端服务器建立连接(或复用连接池中的连接)。

    • 将请求(包括处理后的请求头和请求体)非阻塞地转发给后端。

    • 将后端服务器的套接字注册到事件循环,监听可读事件以接收后端响应。

    • 非阻塞地读取后端响应数据(响应头和响应体)。

    • 在接收后端响应的同时(流式处理),可能对响应进行处理(如缓冲、Gzip压缩、Header修改)并非阻塞地发送给客户端。Nginx高效地管理客户端和后端之间的数据流。

  9. 连接关闭或保持(ConnectionHandling):

    • 根据HTTP协议版本(HTTP/1.1的Keep-Alive)和配置(keepalive_timeout),Nginx决定在处理完一个请求后是立即关闭连接还是保持连接打开一段时间以处理该客户端后续可能的请求(避免重复建立TCP连接的开销)。对于保持的连接,Worker进程会继续在事件循环中监听该套接字上的新请求事件。
  10. 事件循环持续运行:

    • 整个过程中,Worker进程的事件循环始终在运行。它不会因为等待某个I/O操作(如网络读写、磁盘读取)完成而阻塞。当一个I/O操作需要等待时(例如,等待客户端发送数据或等待磁盘读取完成),Worker进程会立即转去处理事件循环中其他已经就绪的连接或事件,最大限度地利用CPU时间。这就是非阻塞I/O和事件驱动的核心优势。

核心要点总结:Nginx通过Master管理多个Worker进程,每个Worker使用单一事件循环高效处理大量并发连接。它利用操作系统的I/O多路复用机制非阻塞地处理网络和文件I/O,通过状态机解析HTTP协议,并根据配置精确路由请求到不同的处理方式(静态文件、代理、FastCGI等),同时高效管理连接的生命周期(建立、保持、关闭)。这种设计使其能够以极低的资源消耗处理海量并发请求。

简述Nginx应用场景?

Nginx凭借其高性能、灵活性和可靠性,在现代IT架构中扮演着核心角色,主要应用场景包括:

  1. Web服务器
    • 高效处理静态内容:HTML、CSS、JavaScript、图片、视频等,响应速度极快,是托管静态网站的首选。
    • 处理动态内容入口:虽然不直接运行PHP/Python等后端语言,但作为前端服务器,将动态请求高效转发给后端应用服务器(如Tomcat,uWSGI,Gunicorn,Node.js)。
  2. 反向代理服务器:
    • 隐藏后端架构:对外暴露单一入口点,保护后端应用服务器的真实IP和拓扑结构。
    • 负载均衡:核心功能。将客户端请求智能分发到后端多个应用服务器集群(支持HTTP/S,TCP/UDP,gRPC),提供多种算法(轮询、加权、IPHash、最少连接),显著提升应用的扩展性、吞吐量和容错能力(自动剔除故障节点)。是构建高可用、可伸缩应用的基础。
  3. API网关:
    • 统一入口与管理:作为所有API请求的单一接入点,进行认证、授权、限流、日志记录、监控。
    • 请求路由与版本控制:根据URI、Header等将请求路由到不同后端服务或版本。
    • 协议转换与聚合:支持REST,gRPC,WebSocket等,并可进行简单的请求/响应转换或微服务聚合。
  4. 内容缓存:
    • 加速响应:将后端应用生成的动态内容或静态文件缓存到Nginx本地内存/磁盘。后续相同请求直接从缓存返回,极大减轻后端压力,显著提升用户访问速度,尤其适用于高读取负载场景。
  5. SSL/TLS终端:
    • SSLOffloading:集中处理HTTPS连接的加解密工作。后端服务器只需处理明文的HTTP请求,降低后端计算负载,简化证书管理和更新(只需在Nginx配置)。
  6. 安全防护(基础层):
    • 访问控制:基于IP、用户名密码等进行访问限制。
    • 请求限速:防止暴力破解、DDoS攻击(基础缓解)。
    • 请求过滤:过滤恶意请求、限制请求大小等。
    • WAF集成基础:可作为Web应用防火墙的前置入口点。
  7. 媒体流服务器:
    • 支持高效传输音频、视频流(如MP4,FLV的伪流),常用于点播服务。也可作为HLS,MPEG-DASH等自适应流协议的代理或源服务器。
  8. 邮件代理服务器:
    • 支持POP3、IMAP、SMTP协议的反向代理和负载均衡。
  9. TCP/UDP负载均衡器:
    • (NginxPlus或OpenSource搭配Stream模块)为数据库、LDAP、DNS、自定义TCP/UDP应用提供负载均衡和高可用。
  10. 微服务架构入口:
    • 作为ServiceMesh或微服务集群的边缘入口,提供路由、负载均衡、安全、监控等能力。
  11. 灰度发布/金丝雀发布:
    • 通过灵活的配置,将特定流量(如基于Header、Cookie、IP比例)路由到新版本后端,实现平滑、可控的应用发布。
  12. A/B测试:
    • 将用户流量按比例分配到不同版本的后端(A/B版),进行功能或用户体验测试。

总结:Nginx是现代应用交付的瑞士军刀。其核心价值在于:高性能处理请求、智能分发流量、加速内容访问、保障安全入口、简化架构复杂度。无论是简单的静态网站、高并发的电商平台、复杂的微服务架构,还是需要负载均衡和缓存的内容分发网络,Nginx都是不可或缺的技术栈基石。它在公有云、私有云、混合云及容器化环境中均有广泛应用。

Nginx 是如何实现高并发的?

Nginx实现高并发的核心在于其非阻塞、事件驱动、多进程的架构设计,以及高效利用操作系统提供的I/O多路复用机制。以下是关键要素的解析:

  1. 非阻塞(Non-blocking)I/O模型
    • Nginx在所有可能的I/O操作(网络套接字读写、文件读写)上都采用非阻塞模式。
    • 当一个I/O操作(例如,从客户端读取数据、向磁盘读取文件、向后端服务器发送请求)不能立即完成(需要等待数据就绪或资源可用)时,Worker进程不会挂起等待(阻塞),而是立即返回并标记该操作的状态。
    • Worker进程可以继续处理事件循环中的其他就绪事件(例如,处理另一个已经收到数据的连接)。
  2. 事件驱动(Event-Driven)架构:
    • 每个Worker进程运行一个单一的主事件循环(EventLoop)。
    • 这个事件循环的核心是高效监听大量文件描述符(主要是套接字)上的I/O事件(如可读可写新连接到达)。
    • Worker进程只在事件实际发生时才去处理对应的连接或操作。没有事件时,它处于低功耗的休眠状态(通过系统调用如epoll_wait等待事件通知)。
  3. 高效利用I/O多路复用(I/OMultiplexing):
    • Nginx依赖操作系统提供的高性能I/O多路复用接口(Linux的epoll,FreeBSD的kqueue,Solaris的eventports)来实现事件循环。
    • 关键能力:这些接口允许一个进程/线程同时监控成千上万个文件描述符的状态变化,并仅通知进程哪些描述符真正有事件发生。这避免了传统轮询或为每个连接创建线程/进程的巨大开销。
    • epoll等机制的优势:其时间复杂度通常是O(1)或O(活跃连接数),与总监控的连接数无关,使得单进程处理海量并发成为可能。
  4. 多进程(Multi-Process)模型:
    • Master-Worker模式:一个轻量的Master进程负责管理,多个Worker进程负责实际处理请求。
    • Worker独立性:每个Worker进程都是独立的,拥有自己的事件循环和连接池。
    • 并行处理:多个Worker进程并行运行,充分利用多核CPU的计算能力。
    • 避免锁竞争:Worker进程间不共享连接状态(连接由接收它的Worker全程负责),极大减少了进程间通信(IPC)和锁竞争的开销,这是其高性能的关键之一。共享配置、共享内存缓存等少量共享数据有专门机制处理。
    • 监听优化:所有Worker进程同时监听相同的网络端口(如80,443)。当新连接到达时,内核会将其公平地分配给其中一个空闲或负载较轻的Worker(现代内核的SO_REUSEPORT选项优化了此过程,避免了早期的“惊群”问题)。
  5. 优化的内存管理:
    • 为每个连接分配固定大小的内存缓冲区(如client_header_buffer_size,client_body_buffer_size),避免动态内存分配的开销。
    • 高效的内存池机制,减少内存碎片和分配/释放成本。
  6. 高效的连接和请求处理:
    • 快速状态机:使用优化的状态机快速解析HTTP请求行和头部。
    • 零拷贝优化:在处理静态文件时,使用sendfile系统调用,允许内核直接将文件内容从磁盘拷贝到网络套接字,绕过用户空间缓冲区,减少CPU和内存复制开销。
    • 智能缓冲:在代理场景下,智能管理客户端与后端服务器之间的数据流缓冲,优化吞吐量。
    • 连接池:向上游(后端)服务器转发请求时,使用连接池复用TCP连接,减少频繁建立和断开连接的开销。
  7. 异步任务处理:
    • 对于无法完全避免的阻塞操作(如访问慢速磁盘、某些第三方模块调用),Nginx提供了机制(如线程池)将这些任务卸载到后台线程异步执行,避免阻塞主事件循环。 总结: Nginx的高并发能力是精心设计的架构与操作系统能力深度结合的成果:
    • 事件驱动+非阻塞I/O+I/O多路复用是其基石,确保单个进程能高效管理海量连接,CPU时间不被I/O等待浪费。
    • 多Worker进程模型充分利用多核CPU,进程间低耦合避免了锁竞争瓶颈。
    • 高效的资源管理(内存、连接、文件传输)最大限度减少内部开销。
    • 优化的协议处理(HTTP状态机)和OS特性利用(sendfile,SO_REUSEPORT,epoll/kqueue)提供了额外的性能提升。

这种架构使单个NginxWorker进程能够轻松处理数万并发连接(受限于可用内存和文件描述符限制),而多个Worker进程共同协作则可支撑数十万甚至百万级的并发,同时保持极低的CPU和内存消耗。

反向代理服务器的优点是什么

反向代理服务器是现代架构的核心组件,其优点主要体现在安全性、性能、可扩展性和运维便利性四大维度,具体如下:

一、安全加固(SecurityEnhancement)

  1. 隐藏后端架构:充当安全屏障,客户端仅与代理通信,无法直接接触真实后端服务器(IP/端口/拓扑均隐藏),有效防御DDoS、端口扫描等网络攻击。
  2. 集中式安全策略:在单点实施防火墙规则、IP黑名单、速率限制(防暴力破解)、请求过滤(如拦截恶意User-Agent)。
  3. SSL/TLS终端(SSLOffloading):集中处理HTTPS加解密,减轻后端计算压力;简化证书管理(仅代理需更新证书),后端可使用HTTP明文通信。
  4. WAF集成点:作为Web应用防火墙(WAF)的天然部署位置,拦截SQL注入、XSS等应用层攻击。

二、性能与效率优化(Performance&Efficiency)

  1. 负载均衡(LoadBalancing):将流量智能分发到多个后端服务器(支持轮询、加权、最少连接、IPHash等算法),提升系统整体吞吐量,避免单点过载。
  2. 内容缓存(Caching):缓存静态资源(如图片/CSS/JS)甚至动态API响应,显著减少后端请求,加速客户端响应速度(尤其高重复访问场景)。
  3. 压缩传输:启用Gzip/Brotli压缩响应体,节省带宽,提升传输效率。
  4. 连接池优化:复用向后端的连接,减少TCP握手开销,提升代理到后端的通信效率。

三、高可用性与扩展性(HighAvailability&Scalability)

  1. 故障转移(Failover):实时监控后端健康状态,自动剔除故障节点,将请求路由至健康服务器,保障服务连续性。
  2. 无缝扩展:横向扩展时,只需向后端集群添加新服务器并更新代理配置,客户端无感知,支持弹性伸缩。
  3. 容灾能力:结合多地域部署,可将流量切换至灾备集群(如云厂商多可用区部署)。

四、运维与架构简化(OperationalSimplicity)

  1. 统一接入点:为多个服务/域名提供单一入口(api.example.com),简化客户端配置和DNS管理。
  2. 协议转换与适配:前端支持HTTP/1.1、HTTP/2、WebSocket,后端可连接gRPC、FastCGI等异构服务,屏蔽协议差异。
  3. 灰度发布/金丝雀发布:按权重、Header、Cookie等将部分流量导流至新版本后端,实现平滑发布与测试。
  4. 集中式日志与监控:收集所有入口请求日志,统一监控流量、延迟、错误率等指标。

五、成本优化(CostEfficiency)

  1. 减少后端资源开销:通过缓存、SSL卸载、压缩等功能,降低后端服务器算力与带宽需求。
  2. 最大化硬件利用率:负载均衡使后端集群资源均匀负载,避免资源闲置。

总结 反向代理服务器是构建安全、高性能、易扩展应用架构的战略性枢纽。它通过屏蔽后端细节、智能调度流量、加速内容交付、统一安全策略,成为云计算、微服务、全球化业务不可或缺的基础设施。其价值不仅体现在技术层面,更直接转化为业务稳定性与成本效益的提升。

Nginx不使用多线程?

Nginx的线程模型核心说明 Nginx默认采用多进程+单线程架构处理请求,仅在特定场景使用线程池辅助:

  1. 核心请求处理机制
    • 多进程模型:Master进程管理多个Worker进程(数量通常等于CPU核数)
    • 单线程事件循环:每个Worker进程运行单个事件循环线程
    • 基于I/O多路复用(epoll/kqueue)非阻塞处理数万并发连接
    • 无锁竞争:Worker进程间完全独立,不共享连接状态
  2. 避免多线程的主要原因
    • 性能考量:消除线程切换和锁竞争开销,保障海量并发下的线性扩展能力
    • 稳定性需求:进程间内存隔离,单Worker崩溃不影响整体服务
    • 架构简洁性:单线程事件循环模型更易维护,避免并发编程陷阱
  3. 线程池的补充作用
    • 仅用于阻塞操作:当遇到慢速磁盘I/O(如大文件读取)时
    • 工作流程:
      1. 事件循环线程将阻塞任务提交到线程池
      2. 线程池线程执行磁盘读写
      3. 完成时通知事件循环线程继续处理
    • 典型配置:通过aiothreads;指令启用
  4. 与传统多线程服务器对比
    • Apache多线程模型:每个连接占用独立线程,万级并发时线程切换消耗50%以上CPU
    • Nginx混合模型:
    • 常规请求:单线程事件循环处理(消耗5%CPU处理万级连接)
    • 阻塞任务:线程池隔离处理(不影响事件循环)

这种架构经过大规模互联网验证(如Netflix、Cloudflare),是同时满足高并发、低延迟、高稳定的最优解。

为什么Nginx性能这么高?

Nginx的性能之所以高,主要归功于其事件处理机制:

  • 异步非阻塞事件处理机制:运用了epoll模型(Linux下)或kqueue(BSD下),提供了一个队列,排队解决事件。

同步阻塞I/O和异步非阻塞I/O的含义

答案

  • 同步阻塞I/O模型:线程干活时,是一件事一件事的干,向磁盘读写数据时,线程需要等待磁盘I/O完成
  • 异步非阻塞I/O模型:线程干活时,可以同时做多件事情,永不等待,向磁盘读写数据时,线程不需要等待而是先做其他事情

Nginx负载均衡算法

Nginx作为一个广泛使用的Web服务器和反向代理服务器,其负载均衡功能是实现高可用性和高性能服务的关键。Nginx支持多种负载均衡算法,适用于不同的场景和需求。以下是Nginx支持的主要负载均衡算法的详细介绍:

1. 轮询(Round Robin)

这是Nginx默认的负载均衡策略。在这种模式下,Nginx会按顺序将客户端的请求轮流分配给后端的每个服务器。这种策略假设所有的后端服务器都有相同的处理能力。如果服务器性能相同,轮询是一个简单且公平的分配请求的方式。但是,如果服务器性能不同,可能会导致性能较差的服务器成为瓶颈。

2. 权重(Weight)

权重策略是在轮询策略的基础上增加权重参数,允许为每个后端服务器指定不同的权重。权重高的服务器将会接收更多的请求。这种方式可以用来处理后端服务器性能不均的情况,例如,可以将更多的流量导向性能更强的服务器。

3. IP哈希(IP Hash)

IP哈希策略根据客户端的IP地址来分配请求。Nginx会使用哈希算法计算客户端IP地址的哈希值,然后根据这个值将请求发送到对应的后端服务器。这样可以确保来自同一IP地址的请求总是被发送到同一台服务器,这对于需要保持用户会话状态的应用非常有用。

4. 最少连接(Least Connections)

最少连接策略会将新的请求发送给当前活跃连接数最少的服务器。这种策略考虑了服务器当前的负载情况,动态地分配请求,以避免某些服务器过载而其他服务器空闲的情况。

5. Fair(第三方策略)

Fair策略是一种根据服务器响应时间来分配请求的算法。服务器响应时间短的将会接收到更多的请求。这种策略需要安装第三方的upstream_fair模块,并且可以与权重和最少连接策略结合使用。

6. URL哈希(第三方策略)

URL哈希策略根据请求的URL的哈希结果来分配请求。这种策略可以确保同一个URL的请求总是被发送到同一台服务器,这对于缓存优化和负载均衡非常有用。同样,这需要安装第三方的nginx_hash模块。

总结

Nginx的负载均衡算法可以根据不同的应用场景和需求进行选择和组合。在实际部署时,需要根据服务器的性能、应用的特点以及业务的需求来决定使用哪种负载均衡策略。例如,对于无状态的服务,可以使用轮询或权重策略;而对于需要保持会话状态的应用,则可以使用IP哈希策略。对于处理时间不一致的请求,最少连接策略可能更为合适。而Fair和URL哈希策略则适用于特定的优化场景。通过合理配置和使用这些策略,可以有效地提高服务的可用性和响应能力。

Nginx的location五种优先级过滤规则

答案:优先级从高到低

  1. 精确匹配(=)
  2. 特殊正则(^~):使前缀字符串优先级高于正则
  3. 普通正则(~或者~*):*忽略大小写
  4. 字符串前缀匹配(/images/优先级高于/images)
  5. 默认匹配(/)

会话保持的概念及Nginx实现方法

答案

  • 概念:会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在做负载均衡的同时还保证一系列相关连的访问请求会保持分配到一台服务器上
  • 实现方法:
    1. ip_hash静态调度算法:按客户端IP的hash结果分配
    2. 将用户的session存入cookie里
    3. 利用Memcached将所有服务器产生的session存入同一台服务器的缓存中
    4. 一致性hash算法:根据用户请求的URI或者指定字符串进行计算(需下载补丁包)

Nginx怎么处理请求的?

  • 监听端口:Master进程监听配置的端口(如80/443),通过系统调用(如epollkqueue)接收客户端连接请求。
  • 分配Worker:Master进程将新连接分配给空闲的Worker进程(基于负载均衡策略),Worker进程接管后续处理。
  • 读取数据:Worker进程异步读取请求行(方法、URI、协议版本)和请求头(Host、User-Agent等)。
  • 解析结构:解析后的信息存储在ngx_http_request_t结构体中,用于后续匹配逻辑。
  • Server块匹配:根据请求头的Host字段选择对应的虚拟主机(server块)。
  • Location块匹配:根据URI路径找到最佳匹配的location块(支持前缀匹配、正则匹配等规则)。
  • Rewrite阶段:执行URL重写规则(如rewrite ^/old /new;)。
  • Access阶段:进行访问控制(如IP过滤、HTTP认证)。
  • Content阶段:核心处理逻辑:
    • 静态文件:直接读取磁盘文件并返回(使用sendfile零拷贝优化)。
    • 动态代理:转发请求到后端(如proxy_pass到应用服务器)。
    • 动态生成:通过FastCGI等协议调用外部程序。
  • 构建响应头:生成状态码、Content-Type等头部信息。
  • 发送响应体:分块发送数据(静态内容直接传输,动态内容从后端获取后转发)。
  • Keep-Alive:若启用长连接(keepalive_timeout),连接保持复用。
  • 关闭连接:无后续请求或超时后释放资源,记录访问日志(如access_log)。

什么是正向代理和反向代理?

  • 正向代理:客户端向代理服务器发送请求,代理服务器将请求转发给目标服务器,然后将目标服务器的响应返回给客户端。
  • 反向代理:客户端直接向目标服务器发送请求,目标服务器将请求转发给反向代理服务器,反向代理服务器根据一定的规则将请求分发给后端的业务处理服务器进行处理。

使用反向代理服务器的优点是什么?

反向代理服务器可以隐藏源服务器的存在和特征,它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

Nginx的优缺点?

  • 优点
    • 占内存小,可实现高并发连接,处理响应快。
    • 可实现http服务器、虚拟主机、反向代理、负载均衡。
    • Nginx配置简单。
    • 可以不暴露正式的服务器IP地址。
  • 缺点
    • 动态处理差:Nginx处理静态文件好,但处理动态页面则相对较弱。

Nginx目录结构有哪些?

Nginx的目录结构通常包括:

  • client_body_temp:存储客户端请求的临时文件。
  • conf:存放Nginx的配置文件。
  • fastcgi_temp:FastCGI临时数据目录。
  • html:Nginx默认站点目录。
  • logs:存放Nginx的日志文件。
  • proxy_temp:代理临时目录。
  • sbin:存放Nginx的启动命令。
  • scgi_tempuwsgi_temp:分别存放SCGI和uWSGI的临时数据。

Nginx配置文件nginx.conf有哪些属性模块?

Nginx的配置文件nginx.conf中包含多个属性模块,例如:

  • worker_processes:设置worker进程的数量。
  • events:配置事件相关的参数,如最大连接数。
  • http:配置HTTP相关的参数,如媒体类型库文件mime.types,默认媒体类型default_type等。
  • server:配置虚拟主机的相关参数。

location的作用是什么?

location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

Nginx配置高可用性怎么配置?

配置高可用性主要是确保当上游服务器出现故障时,能够及时切换到下一台服务器。这通常涉及到合理配置upstream模块和相关的超时参数,如proxy_connect_timeoutproxy_send_timeoutproxy_read_timeout

Nginx的403访问错误原因

答案

  1. Nginx配置文件里没有配置默认首页参数或首页文件在站点目录下没有索引文件 如果输入域名时,不告诉浏览器看哪个页面,nginx会自动将页面跳转到首页;然而,跳转过程中发现找不到首页时,会默认将整个网页的内容显示出来,此时nginx的安全机制拒绝用户访问,就触发了nginx安全模块,显示403
  2. 站点目录或内部的程序文件没有Nginx用户访问权限(x权限) 如果用户对目录没有x权限,就进不去这个目录
  3. Nginx配置文件中设置了allow,deny等权限控制,导致客户端没有访问权限

Nginx 安全优化

答案

  1. 隐藏Nginx版本号
  2. 降权启动,更改掉默认的Nginx服务用户
  3. 上传文件大小限制(动态服务器web应用)
  4. Nginx日志相关优化(日志切割,不记录指定元素日志,最小化日志目录权限)
  5. 限制指定目录或指定扩展名的文件被访问
  6. 事件驱动模型优化(epoll)
  7. Nginx连接数(最大并发连接数):worker_connections
  8. Nginx静态文件缓存
  9. Nginx连接超时设置,一般设置60左右,因为浏览器默认超时为60s
  10. 设置CPU亲合,设置CPU绑定
  11. 系统句柄数(文件打开数)优化
  12. 开启高效传输:sendfile
  13. 设置gzip压缩输出
  14. 设置防盗链
  15. 防止爬虫优化

解释什么是Nginx动态资源、静态资源分离

动态资源与静态资源分离的核心概念

这是网站架构优化的基础策略,核心思路是根据资源特性采用不同的处理方式:

  • 静态资源:内容固定不变的文件(如HTML/CSS/JS/图片/视频)。特点是不需后端计算,可直接读取。

  • 动态资源:需要实时生成的内容(如用户数据/商品列表/API响应)。特点依赖程序处理,每次请求可能不同。

通过配置规则将请求分流

  • 静态请求(如图片/CSS路径)直接由Nginx处理:从磁盘读取文件,快速响应客户端,并设置长期缓存。

  • 动态请求(如API或PHP路径)转发给后端服务器:由应用服务器执行代码,连接数据库生成结果。

典型工作流

  1. 用户请求网站页面
  2. Nginx接收到HTML请求(动态)转发给应用服务器
  3. 应用服务器生成HTML时引用的CSS文件路径(静态)
  4. 浏览器请求CSS文件时,Nginx直接返回本地缓存的CSS
  5. 图片等资源同理由Nginx或CDN直接响应

如何用Nginx解决前端跨域问题

跨域(Cross-Origin)是指浏览器出于安全考虑,限制网页脚本访问不同源(协议、域名、端口任意一项不同)的资源,这一限制称为同源策略(Same-Origin Policy)。跨域问题本质是浏览器行为,而非服务器限制——请求能正常发送到服务器并返回结果,但浏览器会拦截响应数据。

同源策略:浏览器要求请求的URL与当前页面的协议(如HTTP/HTTPS)、域名(如example.com)、端口(如8080)完全一致,否则视为跨域。例如:

  • http://a.com请求 https://a.com(协议不同)
  • http://a.com请求 http://b.com(域名不同)
  • http://a.com:80请求 http://a.com:8080(端口不同)

限制内容:跨域主要影响AJAX请求、Cookie、LocalStorage等数据的访问,但允许部分标签(如<script><img>)跨域加载资源。

解决办法:利用反向代理技术,使浏览器认为所有请求都来自同一域名。

  1. 浏览器访问前端页面(如www.example.com

  2. 前端页面请求同域名下的接口路径(如www.example.com/api

  3. 服务器接收到/api请求后,在后台转发到真实接口地址(如api.target-service.com

  4. 返回结果时添加跨域响应头,使浏览器接受响应

    • Access-Control-Allow-Origin:设置允许访问的前端域名(如https://www.example.com

    • Access-Control-Allow-Methods:声明允许的HTTP方法(如GET,POST,PUT,DELETE

    • Access-Control-Allow-Headers:声明允许携带的请求头(如Content-Type,Authorization

Nginx 如何实现防止 DDOS 攻击。

Nginx 可以通过配置限制来抵抗 DDOS 攻击,例如:

  • 限制连接速率(limit_req 模块):基于漏桶算法控制单位时间内的请求处理量

    • 请求到达时检查是否符合速率阈值

    • 未超速则立即处理

    • 超速但未超过突发值则进入队列等待

    • 超出突发值直接拒绝请求(默认返回503错误)

  • 限制并发连接数(limit_conn 模块):限制同一客户端的并发TCP连接数量

    • 新连接到达时检查当前连接数
    • 未超限则建立连接
    • 超限则拒绝新连接
  • 配置防火墙规则来拦截异常流量

  • 使用第三方模块如 ngx_http_limit_req_module 来限制请求频率

  • 启用 fail2ban 等工具来动态地添加攻击源 IP 到防火墙黑名单

502报错可能原因有哪些,解决方法

Nginx 502 Bad Gateway 错误表示 Nginx 作为反向代理时,无法从上游服务器获取有效的响应。以下是常见的原因及解决方法:

  • 上游服务器问题

    未运行或配置错误 :检查上游服务器是否启动,监听端口是否正确。查看其日志文件分析异常。

    资源耗尽 :监控上游服务器的 CPU、内存、磁盘空间等资源,优化应用代码或增加服务器数量。

  • 网络问题

    连接异常 :使用 ping、telnet 等工具检查 Nginx 与上游服务器之间的网络连接状态,确保网络正常。

    防火墙限制 :检查防火墙设置,确保 Nginx 能访问上游服务器的相关端口。

  • Nginx 配置问题

    配置错误 :使用 nginx -t 命令检查 Nginx 配置文件是否有语法错误,仔细检查 location、proxy_pass 等指令是否正确。

    缓冲区设置不当 :如果网站页面消耗缓冲区过大或 Header 过大,可增大缓冲区相关参数。

  • 反向代理缓存问题

    如果 Nginx 配置了反向代理缓存,但缓存策略不当或缓存过期,也可能导致 502 错误。检查缓存配置,清理无效缓存数据。

  • PHP-CGI 相关问题(针对 PHP 应用)

    进程数不足 :如果 PHP-CGI 进程数不够用,修改 PHP-FPM 配置文件,增大 pm.max_children 参数值。

    PHP 执行超时 :修改 PHP 配置文件,增大 max_execution_time 参数值。

    其他 PHP-CGI 异常 :检查 PHP-CGI 进程是否正常运行,查看相关日志分析异常中断原因。

Nginx 与 OpenResty 的核心区别是什么?

特性NginxOpenResty
核心能力静态资源处理Lua 脚本动态扩展
适用场景反向代理 /CDNAPI 网关 / 业务逻辑
性能开销中等(Lua VM)

如何在 Nginx 中监控性能?

可以使用 Nginx 的 stub_status 模块来监控性能。通过配置 location 块来启用 stub_status,然后可以访问相应的 URL 来查看性能指标,如活跃连接数、接受的连接数、处理的请求数等。

负载均衡算法中 cookie和ip_hash的区别

在 Nginx 负载均衡中,基于 cookie 和 ip_hash 的负载均衡算法都可用于实现会话保持,但它们在实现原理、适用场景和特点上有显著区别。

原理:基于 cookie 的负载均衡通过在客户端的请求中插入一个特殊的 cookie 来识别客户端的身份。当客户端首次访问时,负载均衡器会为其分配一个后端服务器,并在响应中设置一个 cookie。后续请求中,客户端会携带这个 cookie,负载均衡器根据 cookie 中的信息确定将请求转发到相同的后端服务器。

优点:

  • 精确的会话保持:能更准确地识别客户端,即使客户端的 IP 发生变化(如移动设备切换网络),只要 cookie 未丢失或过期,仍可保持会话。
  • 灵活性高:可以自定义 cookie 的名称、过期时间等参数,适用于多种复杂场景。

缺点:

  • 依赖客户端支持:如果客户端禁用 cookie 或清除 cookie,会话保持将失效。
  • 配置复杂度高:需要在 Nginx 配置中手动设置 cookie 的相关参数,如 cookie 名称、路径、域等。

适用场景:适用于需要高精度会话保持的场景,如电商网站的购物车、在线支付等。

ip_hash 负载均衡

原理:ip_hash 算法根据客户端的 IP 地址进行哈希运算,然后将哈希值对后端服务器的数量取模,确定请求应转发到哪一台服务器。同一客户端的 IP 地址始终会被映射到同一台后端服务器。 优点

  • 简单易用:Nginx 内置了 ip_hash 算法,无需额外安装插件,配置简单,只需在 upstream 模块中添加 ip_hash 指令即可。
  • 会话保持:能保证来自同一 IP 地址的请求始终转发到同一台服务器,从而实现会话保持。

缺点

  • 对 IP 变化敏感:如果客户端的 IP 地址发生变化(如移动设备切换网络),会话将无法保持。
  • 局域网问题:同一局域网内用户可能因 IP 前三位相同而被分配到同一台后端服务器,导致负载不均衡。
  • 动态扩容困难:当后端服务器动态增减时,可能导致部分请求无法均匀分发。

适用场景:适用于客户端 IP 相对固定且对会话保持要求较高,同时服务器数量相对稳定的场景,如企业内部应用

工作中Nginx遇到哪些故障?如何解决的

  • 413错误:nginx对上传文件大小有限制,默认1m,client_max_body_size设置请求体大小
  • 504错误:请求后端服务的时候,后端服务很长时间才响应,proxy_read_timeout he proxy_read_time优化超时时间
  • 502错误:Nginx 作为反向代理时,无法从后端服务器获取有效的响应。
    • 检查后端服务器是启动,监听端口是否正确。查看其日志文件分析异常。
    • 监控后端服务器的 CPU、内存、磁盘空间等资源,优化应用代码或增加服务器数量。
    • 配置健康检查接口实时监测后端服务运行状态
    • 配置后端服务器CPU、内存、磁盘空间等资源监控与告警,适当的配置自动扩缩容