Nginx高性能Web服务器

文章目录

    • [1 Nginx设计理念](#1 Nginx设计理念)
    • [2 Nginx架构与进程](#2 Nginx架构与进程)
      • [2.1 架构](#2.1 架构)
      • [2.2 进程](#2.2 进程)
    • [3 Nginx高性能的三大支柱](#3 Nginx高性能的三大支柱)
    • [4 Nginx功能介绍](#4 Nginx功能介绍)
    • [5 Nginx基本特性](#5 Nginx基本特性)
    • [==6 Nginx扮演的角色及特性==](#==6 Nginx扮演的角色及特性==)
    • [7 Nginx模块介绍](#7 Nginx模块介绍)
      • [7.1 核心模块](#7.1 核心模块)
      • [7.2 标准HTTP模块](#7.2 标准HTTP模块)
      • [7.3 可选HTTP模块](#7.3 可选HTTP模块)
      • [7.4 邮件服务模块](#7.4 邮件服务模块)
      • [7.5 Stream服务模块](#7.5 Stream服务模块)
      • [7.6 第三方模块](#7.6 第三方模块)
    • [8 Nginx vs Apache 对比](#8 Nginx vs Apache 对比)
    • [9 Nginx配置](#9 Nginx配置)
      • [9.1 配置文件组成](#9.1 配置文件组成)
      • [9.2 主配置文件结构](#9.2 主配置文件结构)
      • [9.3 root与alias](#9.3 root与alias)
      • [==9.4 location的匹配==](#==9.4 location的匹配==)
    • [10 实践](#10 实践)

"Apache能干的Nginx能干,Nginx能干的Apache不一定能干"

Nginx是一个高性能的Web服务器/反向代理服务器,擅长处理高并发连接。

1 Nginx设计理念

核心思想:简单即高效

设计原则 说明
模块化 功能像积木一样,按需组合
事件驱动 来一个请求处理一个,不傻等
异步非阻塞 不卡壳,一个工人同时干多件事
内存省着用 省内存才能扛住更多用户

类比:Apache像"一个客人配一个服务员",Nginx像"一个服务员同时服务所有客人"

2 Nginx架构与进程

2.1 架构

架构特点

  • Master-Worker模式:1个老板 + N个员工
  • 无共享锁:员工之间不抢资源,各干各的
  • epoll机制(Linux):高效处理海量连接

2.2 进程

进程类型 数量 职责
Master 1个 读取配置、启动worker、平滑重启、热升级
Worker 多个 处理HTTP请求、代理、读写文件

Worker数建议 = CPU核心数,可通过 worker_processes auto 自动设置

3 Nginx高性能的三大支柱

支柱 技术实现 解决的问题 性能收益
IO多路复用 epoll(Linux)、kqueue(BSD)、eventport(Solaris) C10K并发问题 单线程管理10万+连接
零拷贝 sendfile + DMA gather 文件传输CPU占用高 10Gbps传输CPU<10%
内存优化 内存池、连接池、 slab分配器 内存碎片、频繁malloc 减少50%+内存占用

对比Apache的阻塞模型

  • Apache:每个连接 ==> 一个线程/进程(人多了卡死)
  • Nginx:所有连接 ==> 一个进程轮询处理(人多也流畅)

4 Nginx功能介绍

四大核心功能

功能 用途 场景
Web服务器 托管静态网站 图片、CSS、JS、HTML
反向代理 隐藏真实服务器,统一入口 负载均衡到多台后端
负载均衡 请求分发到多台机器 高并发网站、微服务
缓存加速 热点数据存内存 减少后端压力

5 Nginx基本特性

核心特性一览

  1. 模块化设计,较好的扩展性
  2. 高并发:单机轻松10万+连接(C10K问题终结者)
  3. 低内存:1万个连接只占用2.5MB内存
  4. 热部署:不停机升级、重载配置
  5. 高可靠:Worker进程崩溃,Master自动重启
  6. 跨平台:Linux/Windows/macOS都支持
  7. 开源免费:BSD许可证,商用无忧

6 Nginx扮演的角色及特性

Web服务器

功能分类 具体功能 一句话说明 实际用途
基础服务 虚拟主机 一台机器托管多个网站 多域名共用服务器,省成本
静态资源服务 直接返回图片/CSS/JS/HTML 前端网站、下载站、图片站
目录索引 自动生成文件列表 文件服务器、FTP替代方案
路径别名(Alias) 隐藏真实文件路径 保护目录结构,简化URL
连接优化 Keep-Alive 一个连接传多个请求 省TCP握手时间,提速
管道连接 连续发请求不等回复 提升浏览器并发效率
HTTP/2支持 多路复用,更快 现代网站加速
日志管理 访问日志 记录谁访问了什么 流量分析、问题排查
日志缓冲 批量写磁盘,提性能 高并发下减少磁盘IO
条件日志 特定请求不记录 静态资源日志过滤,省磁盘
内容处理 URL重写(Rewrite) 改地址栏URL 伪静态、跳转、SEO优化
Gzip压缩 传输压缩省带宽 文本资源压缩70%+
浏览器缓存 控制客户端缓存 减少重复请求,提速
访问控制 IP黑白名单 限制特定IP访问 封禁恶意IP,内部系统保护
用户认证 弹窗输入账号密码 后台管理页面保护
防盗链 阻止其他网站引用资源 防止图片/视频被盗用
流控保护 速率限制 限制下载速度 防带宽占满、防恶意下载
并发限制 限制单IP连接数 防爬虫、防CC攻击
请求限流 限制单IP请求频率 防接口被刷、防暴力破解
运维特性 热配置重载 不停机刷新配置 线上配置更新无感知
热升级 不停机升级版本 Nginx版本更新不中断服务
日志切割 重新打开日志文件 日志按天归档,配合crontab

反向代理

功能分类 具体功能 一句话说明 实际用途
基础代理 隐藏后端IP 用户不知道真实服务器 保护后端服务器安全
请求头传递 告诉后端真实信息 后端获取用户真实IP、协议
协议转换 HTTP/HTTPS/WebSocket 支持多种协议转发
安全增强 SSL终端 Nginx处理HTTPS解密 后端专注业务,不用管证书
访问控制 代理层统一鉴权 统一入口做权限校验
超时控制 连接超时 防止后端卡死 快速失败,释放资源
读取超时 防止响应慢拖垮 避免长时间等待
发送超时 防止客户端慢 清理慢连接
容错处理 错误页拦截 后端错误显示友好页面 提升用户体验
错误重试 失败自动换一台 单点故障自动恢复
健康检查 自动剔除故障机器 保证服务高可用
高级代理 WebSocket代理 支持实时通信 在线聊天、股票行情
gRPC代理 支持微服务RPC 云原生微服务架构
TCP/UDP代理 四层代理非HTTP 数据库、游戏服务器代理

负载均衡

功能分类 具体功能 一句话说明 实际用途
调度算法 轮询(Round Robin) 一人一次,平均分配 机器配置相同场景
加权轮询(Weight) 高配机器多干活 机器配置不同,按能力分配
IP哈希(IP Hash) 同IP固定到同一台 需要保持登录会话
最少连接(Least Conn) 谁空闲给谁 请求处理时长不一
一致性哈希 带缓存场景用 缓存命中率优化
后端管理 备份节点(Backup) 平时standby,故障才上 灾备切换,高可用
下线节点(Down) 临时标记不可用 维护时手动摘除
长连接池 复用后端连接 减少后端连接压力
会话保持 Sticky Cookie Cookie绑定后端 会话保持,登录状态不丢
Sticky Route 路由绑定后端 特定用户固定到特定机器

缓存服务器

功能分类 具体功能 一句话说明 实际用途
静态缓存 内存缓存 热点文件放内存 毫秒级响应静态资源
磁盘缓存 大文件缓存到磁盘 视频、安装包等大文件
缓存失效 按时间自动清理 控制缓存新鲜度
代理缓存 缓存路径配置 定义缓存存储位置 规划磁盘空间使用
缓存Zone定义 开辟内存存储缓存键 内存中快速查找缓存
缓存有效期 不同状态码不同时间 200缓存10分钟,404缓存1分钟
缓存绕过 特定请求不缓存 登录用户、实时数据不缓存
缓存锁 防止缓存失效并发穿透 防雪崩,保护后端
缓存刷新 主动清理特定URL 内容更新后手动刷新
缓存策略 缓存Key定义 自定义缓存标识 区分不同版本、不同参数
vary支持 根据Header缓存多版本 移动端/PC端分开缓存

API网关

功能分类 具体功能 一句话说明 实际用途
路由管理 路径路由 不同路径到不同服务 /users/→用户服务,/orders/→订单服务
域名路由 不同域名到不同服务 api.a.com和api.b.com分开
版本路由 /v1/和/v2/分开 API版本兼容,平滑升级
认证鉴权 Basic认证 基础用户名密码 内部系统快速保护
JWT验证 Token鉴权 现代前后端分离认证
子请求鉴权 转发到鉴权服务 统一认证中心,复用已有系统
API Key 密钥访问控制 开放API的调用管控
流量控制 限流(Leaky Bucket) 匀速处理请求 突发流量削峰填谷
限并发 限制同时处理数 保护系统资源不被耗尽
黑白名单 特定IP拒绝/允许 封禁恶意调用方
灰度发布 按IP灰度 特定IP走新版本 内部测试、白名单体验
按权重灰度 5%流量到新版本 小流量验证新版本稳定性
Cookie灰度 带特定Cookie走新版 用户自主选择版本
请求处理 请求改写 改路径/参数/Header 适配后端接口格式
响应改写 改返回内容/Header 数据脱敏、格式统一
请求体限制 限制上传大小 防止大文件攻击
超时控制 API专用超时 快速失败,提升体验
可观测性 统一日志 记录所有API调用 审计、分析、计费
请求ID 全链路追踪 分布式系统问题定位
指标暴露 Prometheus监控 实时监控网关状态
容错保护 熔断降级 后端故障快速失败 防止故障扩散
超时熔断 超时就放弃 避免长时间等待拖垮系统

7 Nginx模块介绍

模块 = 功能插件,按需加载,相当于游戏加model、系统填补丁。

模块类型 核心功能 具体功能举例 是否必须
核心模块 服务器运行基础 错误日志、配置解析、事件驱动、进程管理 必须
标准HTTP模块 HTTP协议基础功能 端口配置、编码设置、响应头、静态文件 默认开启
可选HTTP模块 扩展HTTP特殊功能 SSL、Gzip、GeoIP、Flash流媒体 需手动开启
邮件服务模块 邮件代理服务 POP3、IMAP、SMTP协议支持 邮件场景用
Stream服务模块 四层代理转发 TCP/UDP协议代理 非HTTP场景用
第三方模块 自定义扩展功能 Lua、JSON、WAF等 需编译安装

7.1 核心模块

具体模块 功能说明 实际用途
ngx_core_module 配置解析、日志系统、进程管理 Nginx启动运行的基础
ngx_errlog_module 错误日志记录 排查问题、记录异常
ngx_events_module 事件驱动机制(epoll/kqueue) 高并发连接处理核心
ngx_regex_module 正则表达式支持 URL匹配、重写规则
ngx_thread_pool_module 线程池管理 异步文件IO

核心模块是Nginx的"心脏",没有这些服务器无法运行

7.2 标准HTTP模块

具体模块 功能说明 实际用途
ngx_http_core_module HTTP核心(端口、server、location) 虚拟主机配置基础
ngx_http_static_module 静态文件服务 托管图片、CSS、JS
ngx_http_index_module 默认首页索引 自动找index.html
ngx_http_log_module 访问日志记录 分析流量来源
ngx_http_rewrite_module URL重写 伪静态、跳转、SEO
ngx_http_proxy_module 反向代理 负载均衡、隐藏后端
ngx_http_headers_module 响应头设置 跨域、缓存控制
ngx_http_charset_module 网页编码设置 UTF-8/GBK等

标准模块编译时默认包含,无需额外操作

7.3 可选HTTP模块

具体模块 功能说明 实际用途
ngx_http_ssl_module HTTPS/SSL协议支持 网站加密、证书配置
ngx_http_gzip_module Gzip压缩传输 省带宽、提速
ngx_http_geoip_module GeoIP地理位置解析 按地区分流、限制
ngx_http_flv_module Flash视频流媒体 渐进式下载播放
ngx_http_mp4_module MP4视频流媒体 视频拖拽播放
ngx_http_secure_link_module 防盗链安全链接 链接加密、时间限制
ngx_http_stub_status_module 服务器状态监控 查看连接数、请求数
ngx_http_realip_module 获取真实客户端IP 经过代理后识别用户IP

可选模块需在编译时添加 --with-http_xxx_module 开启

7.4 邮件服务模块

具体模块 功能说明 实际用途
ngx_mail_core_module 邮件代理核心 邮件服务基础
ngx_mail_pop3_module POP3协议支持 邮件接收
ngx_mail_imap_module IMAP协议支持 邮件同步
ngx_mail_smtp_module SMTP协议支持 邮件发送
ngx_mail_ssl_module 邮件SSL加密 安全邮件传输

Nginx可作为邮件代理服务器,替代传统邮件网关

7.5 Stream服务模块

具体模块 功能说明 实际用途
ngx_stream_core_module TCP/UDP代理核心 四层转发基础
ngx_stream_proxy_module TCP/UDP代理 MySQL、Redis代理
ngx_stream_ssl_module TCP SSL加密 数据库连接加密
ngx_stream_realip_module 获取真实客户端IP TCP连接识别来源
ngx_stream_limit_conn_module TCP连接限制 防止连接数过多

Stream模块让Nginx从七层代理扩展到四层,支持任意TCP/UDP协议

7.6 第三方模块

模块名称 功能说明 安装方式
ngx_lua_module Lua脚本扩展(OpenResty核心) 编译添加
ngx_http_json_module JSON格式支持 编译添加
nginx-module-vts 流量监控面板 编译添加
ngx_pagespeed 自动网页优化 编译添加
ngx_http_waf_module Web应用防火墙 编译添加
ngx_http_echo_module 调试输出 编译添加
ngx_http_upstream_check_module 后端健康检查 编译添加

第三方模块需手动下载源码,重新编译Nginx

8 Nginx vs Apache 对比

核心差异

Nginx Apache
设计哲学 快、省、异步 全、稳、进程
擅长场景 高并发、静态资源、反向代理 动态内容、.htaccess、模块丰富
资源占用 内存省(万连接≈2MB) 内存高(一个连接一个进程)
配置方式 中央集权(nginx.conf) 分布式(.htaccess随处放)

功能对比表

对比项 Nginx Apache
静态文件速度 极快(直接sendfile)
动态内容(PHP等) 需转发给后端(FPM) 内置mod_php,开箱即用
并发处理能力 10万+无压力 几千就吃力
内存占用 极低 较高
配置灵活性 改配置需重载 .htaccess实时生效
模块生态 精而少 多而全
Windows性能 一般 较好
热部署/平滑升级 原生支持 较复杂

选择推荐

场景 推荐 理由
纯静态资源服务(图片、视频、CSS/JS) Nginx 零拷贝极致性能
反向代理/负载均衡 Nginx 专为代理设计,配置简洁
高并发API网关 Nginx/OpenResty Lua脚本扩展,性能无敌
复杂动态内容(.htaccess重写) Apache 模块丰富,配置灵活
共享主机环境(多用户.htaccess) Apache .htaccess支持更好
遗留系统兼容 Apache 模块生态20年积累
需要动态模块加载 Apache 动态加载so模块
Windows服务器 Apache Nginx Windows支持较弱

最佳实践:Nginx + Apache 组合

  • Nginx放前面:挡子弹(静态资源、SSL、负载均衡)
  • Apache放后面:处理动态PHP等
  • 各取所长,1+1>2

9 Nginx配置

9.1 配置文件组成

Nginx的配置文件的组成部分:

  • 主配置文件:nginx.conf
  • 子配置文件: include conf.d/*.conf
  • fastcgi, uwsgi,scgi 等协议相关的配置文件。
  • mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮。
  • 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

9.2 主配置文件结构

bash 复制代码
main block:主配置段,即全局配置段,对http,mail都有效
# 事件驱动相关的配置
event {
...
}
# http/https 协议相关配置段
默认的nginx.conf 配置文件格式说明
http {
...
}
# 默认配置文件不包括下面两个块
# mail 协议相关配置段
mail {
...
}
# stream 服务器相关配置段
stream {
...
}

9.3 root与alias

root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location

bash 复制代码
server {
	location /dirtest { #必须建立/mnt/dirtest才能访问
		root /mnt;
	}
}

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制,仅能用于

location上下文

bash 复制代码
server {
	location /alias {# 使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403
		alias /mnt/dirtest; #当访问alias的时候,会显示alias定义的/mnt/dirtest里面的内容
	}
}

location中使用root指令和alias指令的意义不同:

  • root:给定的路径对应于location中的/uri左侧的/
  • alias:给定的路径对应于location中的/uri的完整路径

9.4 location的匹配

  • 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射。
  • ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配
  • 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
  • uri是用户请求的字符串,即域名后面的web文件路径
  • 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
bash 复制代码
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
=	# 用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求

^~	# 用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
	# 对uri的最左边部分做匹配检查,不区分字符大小写

~	# 用于标准uri前,表示包含正则表达式,并且区分大小写

~*	# 用于标准uri前,表示包含正则表达式,并且不区分大写

/	# 匹配起始于此uri的所有的uri

\	# 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

# 匹配优先级从高到低:
=, ^~, ~/~*, /
#匹配优先级:=, ^~, ~/~*,/
location优先级:(location = 文件) > (location ^~ 路径) > (location ~,~* 正则顺序) >
(location 完整路径) > (location 部分起始路径) >

10 实践

相关推荐
wefg11 小时前
【Linux】进程的页表详解
linux
海色的人1 小时前
ansible普通用户批量修改密码
运维
unfeeling_2 小时前
Nginx实验
运维·nginx
unfeeling_2 小时前
HAProxy实验
linux·haproxy
倚肆2 小时前
在 Windows Docker 中安装并配置 Nginx (映射 Windows 端口与路径)
windows·nginx·docker
️️(^~^)2 小时前
LVS实验
linux·服务器·lvs
悠闲蜗牛�2 小时前
边缘AI推理实战:从服务器到嵌入式设备的模型部署与优化
运维·服务器·人工智能
qianshanxue112 小时前
--components=main,contrib,non-free什么意思
linux
shawnyz3 小时前
Nginx的源码编译
运维·nginx