导图社区 nginx 知识点一本全
全量nginx 知识点,其优点有IO多路复用epoll、轻量级、CPU亲和(affinity),希望这份脑图会对你有所帮助。
编辑于2023-10-11 11:00:41Nginx思维导图
优点
IO多路复用epoll
什么是IO多路复用
IO多路复用是一种同步IO模型
允许单个线程同时处理多个IO请求
提高系统资源的利用率
epoll是Linux下的IO多路复用技术
相比select和poll,epoll的性能更好
支持更多的文件描述符
epoll的优点
高性能
采用事件驱动的设计
减少系统资源的消耗
可扩展性
支持大量的文件描述符
适用于大型服务器
灵活性
支持多种事件类型
可以根据需要添加或删除事件
跨平台
支持Linux和Windows等操作系统;
轻量级
功能模块少
Nginx核心模块
基本模块
处理HTTP请求
处理HTTP响应
处理HTTP头
处理HTTP请求体
处理HTTP响应体
扩展模块
处理HTTPS请求
处理HTTPS响应
处理HTTPS头
处理HTTPS请求体
处理HTTPS响应体;
代码模块化
模块化设计
模块间低耦合
易于维护和扩展
提高代码重用性
模块间高内聚
模块功能单一
降低复杂性
可配置性
配置文件
方便修改配置
无需重新编译
模块热加载
无需重启服务
提高服务可用性
可扩展性
第三方模块
丰富功能
提高性能
自定义模块
满足特定需求
提高灵活性;
CPU亲和(affinity)
概念
Nginx通过CPU亲和来优化性能
目的
减少进程在不同CPU之间切换的开销
工作原理
将进程固定到特定的CPU上
避免进程在不同CPU之间切换的开销
配置方法
使用worker_cpu_affinity指令
配置每个worker进程绑定到特定的CPU上
优点
提高系统性能
减少进程切换的开销
提高Nginx的吞吐量
降低延迟
常见模块
官方模块
http_stub_status_module
概述
Nginx 内置模块
提供 Nginx 状态信息
配置
stub_status
开启状态页
默认关闭
allow
允许访问状态页的 IP 地址
默认允许所有 IP 访问
deny
禁止访问状态页的 IP 地址
默认禁止所有 IP 访问
状态页内容
Active connections
当前活动的客户端连接数
accepts
已接受的客户端连接数
handled
已处理的客户端连接数
requests
已处理的客户端请求数
reading
正在读取客户端请求的连接数
writing
正在向客户端发送响应的连接数
waiting
正在等待客户端请求的连接数;
http_random_index_module
概述
Nginx模块,用于随机选择索引文件
安装
编译安装Nginx时,使用addmodule参数添加模块
配置
在Nginx配置文件中,使用random_index on指令启用模块
使用random_index_name指令设置随机索引文件名称
使用
访问网站时,随机选择并显示索引文件
可以用于负载均衡,减轻服务器压力;
http_sub_module
概述
http_sub_module 是 Nginx 的一个模块,用于实现 URL 重写和重定向功能
安装
需要在 Nginx 的配置文件中加载 http_sub_module 模块
配置
需要在 Nginx 的配置文件中配置 http_sub_module 的相关参数
示例
可以使用 http_sub_module 实现 URL 重写和重定向功能
常见问题
使用 http_sub_module 时需要注意的一些问题;
limit_conn_module
概述
限制每个IP地址的连接数
防止恶意连接攻击
保护服务器资源
提高网站性能
支持配置多个限制条件
例如:限制每个IP的连接总数、每个IP的并发连接数等
应用场景
适用于高并发、大流量的网站
适用于需要限制连接数的服务器
配置
配置语法
limit_conn_zone $binary_remote_addr zone=conn_limit:10m
$binary_remote_addr:表示客户端IP地址
zone:表示共享内存区域名称
10m:表示共享内存区域的大小
limit_conn conn_limit 10
conn_limit:表示限制的连接数
10:表示限制的连接数上限
配置示例
limit_conn_zone $binary_remote_addr zone=conn_limit:10m
限制每个IP的连接数为10
limit_conn conn_limit 10
限制每个IP的并发连接数为10;
limit_req_module
概述
限制请求速率的模块
可以限制单个IP的请求速率
可以限制每个虚拟服务器的请求速率
配置
limit_req_zone
定义共享内存区域
指定速率限制参数
limit_req
应用速率限制
指定共享内存区域
指定速率限制参数
速率限制参数
rate
每秒允许的请求数
burst
允许的突发请求数
nodelay
是否延迟处理请求
key
用于识别请求的键;
http_access_module
简介
http_access_module 是 Nginx 的一个模块,用于实现基于 IP 地址、用户代理、请求方法和其他 HTTP 请求特征的访问控制
配置
http_access_module 的配置主要通过 ngx_http_access_module 指令来实现
常用的配置指令包括 allow、deny、auth_basic、auth_request、satisfy 等
工作原理
http_access_module 会检查每个 HTTP 请求,根据配置的规则来决定是否允许请求通过
如果请求被允许,则继续处理请求;如果请求被拒绝,则返回一个 403 Forbidden 错误
应用场景
http_access_module 常用于实现简单的访问控制,例如限制特定 IP 地址的访问、限制特定用户代理的访问等
可以与其他 Nginx 模块结合使用,例如使用 auth_basic 指令实现基于用户名和密码的访问控制
示例配置
allow 192.168.1.0/24
deny ***.***.*.*/24
auth_basic "Restricted Area"
auth_basic_user_file /etc/nginx/htpasswd;
http_auth_basic_module
介绍
Nginx的基本认证模块,用于保护服务器资源
配置
auth_basic
启用基本认证
指定认证域
auth_basic_user_file
指定用户文件
包含用户名和密码
用户文件格式
每行一个用户
用户名和密码之间用冒号分隔
密码可以是明文或加密
加密密码
使用htpasswd工具生成
输入用户名和密码
生成加密密码
认证过程
用户访问受保护资源
Nginx发送401状态码和WWWAuthenticate头
浏览器弹出登录窗口
用户输入用户名和密码
浏览器发送请求,包含Authorization头
Nginx验证用户名和密码
验证通过,返回请求资源;
proxy_pass
定义
用于将请求转发到其他服务器
语法
proxy_pass URL
参数
URL
可以是域名、IP地址或UNIX域套接字
可以包含端口号
可以包含路径
可以包含参数
转发方式
默认
转发请求和响应
不修改请求头
break
中断请求处理
不转发响应
redirect
返回302临时重定向
修改Location响应头
permanent
返回301永久重定向
修改Location响应头
应用场景
反向代理
负载均衡
内容缓存
安全防护;
upstream
概述
upstream 是 Nginx 的一个模块,用于实现负载均衡
支持多种负载均衡算法,如轮询、最小连接、IP 哈希等
配置
upstream 块
server 指令
weight 选项,用于设置服务器的权重
max_fails 选项,用于设置最大失败次数
fail_timeout 选项,用于设置失败超时时间
backup 选项,用于设置备份服务器
proxy_pass 指令
使用 upstream 变量来指定要代理的服务器组
负载均衡算法
轮询
默认算法,每个请求轮流分配到不同的服务器
最小连接
根据服务器的连接数来分配请求,优先分配给连接数最少的服务器
IP 哈希
根据客户端的 IP 地址进行哈希计算,将请求分配到特定的服务器
基于 URL 的哈希
根据请求的 URL 进行哈希计算,将请求分配到特定的服务器
健康检查
可以通过配置 upstream 块中的 healthcheck 指令来启用健康检查
支持多种健康检查方法,如 HTTP、TCP、SMTP 等
第三方模块
memcnginxmodule
概述
memcnginxmodule 是 Nginx 的一个第三方模块,用于与 memcached 集成
安装
通过 yum 或 apt 安装
手动下载和编译
配置
在 Nginx 配置文件中添加 memcnginxmodule 模块
配置 memcached 服务器地址和端口
配置缓存键和值
使用
在 Nginx 请求处理程序中使用 memcnginxmodule 提供的 API 函数
读取和写入缓存数据
优势
提高网站性能
降低服务器负载
提高数据一致性;
echo-nginx-module
Echo Nginx 模块是一个用于在 Nginx 中输出调试信息的模块
它允许开发人员在 Nginx 配置文件中插入 echo 指令,以便在 Nginx 处理请求时输出调试信息
Echo 指令可以输出各种类型的信息,如变量值、请求信息、响应头等
Echo 指令可以用于调试 Nginx 配置、跟踪请求处理流程等
Echo 指令可以与其他 Nginx 模块结合使用,以提高调试效率
Echo Nginx 模块支持多种输出格式,如 JSON、XML、HTML 等
Echo Nginx 模块可以与 Nginx 的其他模块集成,以提高 Nginx 的可扩展性和灵活性
Echo Nginx 模块的安装和配置
Echo Nginx 模块可以通过多种方式安装,如通过源代码编译、使用包管理器等
安装 Echo Nginx 模块后,需要在 Nginx 配置文件中添加相应的配置信息,以启用 Echo 指令
Echo Nginx 模块的配置可以通过 Nginx 配置文件进行定制,以满足不同的调试需求
Echo Nginx 模块的示例和使用场景
Echo Nginx 模块可以用于输出请求和响应信息,以便进行调试和问题定位
Echo Nginx 模块可以用于输出 Nginx 配置信息,以便进行配置检查和验证
Echo Nginx 模块可以用于输出 Nginx 内部状态信息,以便进行性能分析和优化
Echo Nginx 模块可以与其他 Nginx 模块结合使用,以提高 Nginx 的可扩展性和灵活性
lua-nginx-module
概述
luanginxmodule 是 Nginx 的一个模块,用于在 Nginx 中运行 Lua 脚本
提供了与 Nginx 交互的 API,如访问请求、响应、变量等
可以用于实现各种功能,如访问控制、日志处理、缓存等
安装
通过 LuaRocks 安装 LuaJIT 和 luanginxmodule
在 Nginx 的配置文件中加载 luanginxmodule 模块
配置
在 Nginx 的配置文件中配置 luanginxmodule 的相关参数
设置 Lua 脚本的路径和权限
使用
在 Nginx 的配置文件中编写 Lua 脚本
使用 luanginxmodule 提供的 API 与 Nginx 交互
调试 Lua 脚本
示例
访问控制
使用 Lua 脚本实现 IP 黑名单和白名单
使用 Lua 脚本实现用户认证
日志处理
使用 Lua 脚本实现日志格式化
使用 Lua 脚本实现日志分析和统计
缓存
使用 Lua 脚本实现缓存控制
使用 Lua 脚本实现缓存失效和更新;
srcache-nginx-module
drizzle-nginx-module
rds-json-nginx-module
http_geoip_module
ngx_cache_purge
性能参数
worker_processes
概述
Nginx worker进程数量
影响并发连接数
并发连接数 = worker_processes * worker_connections
影响CPU利用率
过多worker进程可能导致CPU频繁切换上下文
配置
worker_processes指令
用于设置worker进程数量
语法:worker_processes number
默认值:1
worker_connections指令
用于设置每个worker进程可以处理的最大连接数
语法:worker_connections number
默认值:512
优化
根据CPU核心数设置worker进程数量
建议worker进程数量等于CPU核心数
根据业务需求调整worker_connections值
适当增加worker_connections值以提高并发性能
避免过高的worker_connections值导致内存和CPU资源浪费;
worker_cpu_affinity
概述
worker_cpu_affinity 是 Nginx 的一个配置参数
用于设置 worker 进程与 CPU 核心的绑定关系
可以提高 Nginx 的性能
配置方法
在 Nginx 的配置文件中设置 worker_cpu_affinity 参数
使用掩码格式表示 worker 进程与 CPU 核心的绑定关系
掩码格式:0x03,表示将 worker 进程绑定到 CPU0 和 CPU1 上
示例
worker_cpu_affinity 0x0003
将 worker 进程绑定到 CPU0 和 CPU1 上
注意事项
worker_cpu_affinity 参数需要根据服务器的 CPU 核心数量进行设置
不同的 CPU 架构可能需要不同的掩码格式;
worker_rlimit_nofile
描述
worker_rlimit_nofile是Nginx的一个性能参数
用于限制每个worker进程可以打开的文件描述符数量
默认值为1024
可以通过ulimit命令查看和设置
设置方法
在Nginx配置文件中设置worker_rlimit_nofile参数
worker_rlimit_nofile 65535
重启Nginx以应用新的设置
优化
根据系统资源情况调整worker_rlimit_nofile参数
建议设置为系统最大文件描述符数量的一半
定期监控系统性能,以确保worker_rlimit_nofile设置合理;
event module
epoll
1. epoll是Linux下一种高效的I/O复用技术,它可以使一个进程同时处理大量并发连接。
2. epoll采用事件驱动的方式,只在事件发生时才进行处理,从而降低了CPU的使用率。
3. epoll的性能优势主要体现在处理大量并发连接时,相比于select和poll,epoll的效率更高。4. Nginx中的event模块提供了基于epoll的高性能网络编程接口,使得Nginx能够更好地应对高并发场景。
worker_connections
概述
worker_connections是Nginx的一个性能参数
用于设置每个worker进程可以同时处理的最大连接数
默认值为1024
可以通过修改配置文件中的worker_connections值来调整
调整worker_connections值的影响
提高worker_connections值
可以提高Nginx的并发处理能力
但可能会导致系统资源消耗增加
降低worker_connections值
可以降低系统资源消耗
但可能会影响Nginx的并发处理能力
如何确定合适的worker_connections值
根据服务器硬件资源来调整
考虑CPU、内存和网络带宽等因素
根据实际应用场景来调整
考虑网站的访问量和并发连接数等因素;
Nginx与LUA开发
WAF
常见HTTP服务器
Apache Webserver - Apache基金会
IIS - 微软<br>
Nginx - Nginx<br>
GWS - Google<br>
Lighthttpd
应用场景
代理服务
反向代理(proxy_pass)
负载均衡
七层(upstream)
round robin
ip hash
url hash
weight
fair(第三方)
四层(Nginx PLUS)
缓存
proxy_cache
HTTPS
动静分离
静态资源(动态资源)
跨域访问
防盗链
动态资源(tomcat,php-fpm)
限流
算法
令牌桶
漏桶
实现
limit_conn_zone
limit_req_zone
ngx_http_upstream_module
衍生应用
Openresty
Kong
Tengine