一、I/O模型 处理高并发的时候用
1.1I/O模型简介
同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
- 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
- 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
- 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
- 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
1.2多路复用I/O型
多路复用I/O(I/O multiplexing)模型是一种基于事件驱动的 I/O 处理模式。它利用操作系统提供的多路复用机制(如select、poll、epoll等)来同时监听多个 I/O 事件,当某个事件就绪时,通知应用程序进行处理。
通过多路复用I/O模型,可以在一个线程中同时处理多个客户端连接的 I/O 操作,而不需要为每个连接创建一个线程或进程,避免了资源开销和上下文切换的成本。
常见的多路复用I/O模型有:
- select:适用于连接数不太多的情况,轮询监听多个文件描述符上的 I/O 事件。
- poll:与select类似,但没有连接数的限制,并且不会修改传入的描述符集合。
- epoll:适用于连接数非常多的情况,通过事件驱动机制来处理 I/O 事件,可以在大并发情况下具有较高的性能优势。
1.3异步I/O模型
异步 I/O 模型是一种非阻塞的 I/O 处理模式,通过回调函数或事件通知的方式来处理已完成的 I/O 操作,能够提高系统的并发性和处理效率。
1.4事件模型 select poll epoll
Nginx服务使用异步非阻塞模式:请求不需要排队,会反馈任务的完成结果。
Apache服务使用同步阻塞模式:请求需要排队,且不会主动返回结果。
优缺点:
模型 | 概述 | 优点 | 缺点 |
select | 最古老的模型 | 可以同时监视多个文件描述符 | 效率较低,不适用于大规模并发连接 |
poll | 类似于select | 效率相对更高,可以处理大量并发连接 | 随着文件描述符数量的增加,性能下降较明显 |
epoll | Linux特有模型 | 在高并发场景下性能表现更好,使用边缘触发方式,只在状态变化时通知 | 在非Linux系统上不可用,涉及到一些操作系统特定的细节和配置 |
区别:
select | poll | epoll | |
操作方式 | 遍历 | 遍历 | 回调 |
底层实现 | 数组 | 链表 | 哈希表 |
IO效率 | 每次调用都进行线性遍历,时间复杂度为0(n) | 同左 | 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到rdlllist里,时间复杂度O(1) |
最大连接数 | 1024(x86)2048(x64) | 无上限 | 无上限 |
fd拷贝 | 每次调用select都需要把fd集合从用户拷贝到内核态 | 每次调用poll,都需要把fd集合从用户态拷贝到内核态 | 调用epoll ctl时拷贝进内核并保存,之后每次epoll wait不拷贝 |
二、Nginx概述
2.1简介
①作用:支持七层(应用层)和四层(传输层)反向代理、可做web服务器。
②特性:高可靠性、支持热部署、可扩展性好、高并发高性能、单机部署。
⑤进程:一个主进程master生成多个worker子进程,worker子进程负责处理工作。
2.2Nginx和APACHE的区别
特点 | Nginx | Apache |
并发处理 | 高并发处理能力,轻量级且低内存消耗 | 对静态文件处理高效,但在高并发情况下内存消耗较大 |
资源占用 | 占用更少的系统资源和内存 | 占用较多的系统资源和内存 |
事情驱动 | 使用事件驱动模型,可在较少的线程上同时处理多个连接 | 使用多线程模型,会为每个连接创建一个线程 |
配置灵活性 | 配置简单明了,易于阅读和维护 | 配置相对复杂,需要更多的配置项指定 |
扩展性 | 支持动态模块和第三方扩展,可自定义功能 | 支持动态模块和第三方扩展,但相对Nginx更少 |
虚拟主机 | 支持无限个虚拟主机配置,每个虚拟主机独立配置 | 支持无限个虚拟主机配置,但每个虚拟主机使用同一套配置 |
模块支持 | 支持反向代理、负载均衡、HTTP缓存等 | 支持反向代理、负载均衡、SSL等 |
用户群体 | 更适合高并发、网络应用场景,如反向代理、负载均衡 | 更适合传统Web服务器应用,如静态内容和PHP |
核心区别
1)apache 是同步多进程模型,一个连接对应一个进程,而 nginx 是异步的,多个
连接(万级别)可以对应一个进程;
2)需要稳定用apache,需要高性能用nginx。
2.3什么是零拷贝
在Nginx中,使用零拷贝技术可以将数据从文件系统直接发送到网络套接字中,而不需要中间的内存拷贝。
这可以减少CPU的使用量,减少内存带宽的消耗,并且可以更快地将数据发送到客户端
三、Nginx模块
3.1安装方式
3.1.1方式一 yum安装
#安装依赖包
yum install -y epel-releas
#yum方式安装
yum install -y nginx
3.2.2方式二 编译安装
前期准备
#安装依赖包
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
#新建nginx用户便于管理
useradd -M -s /sbin/nologin nginx
#官网下载包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
编译安装nginx
tar xf nginx-1.18.0.tar.gz
mkdir /apps/nginx -p
cd nginx-1.18.0/./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make -j2 && make install
chown -R nginx.nginx /apps/nginx#加权限
ln -s /apps/nginx/sbin/nginx /usr/sbin/ #直接启动 不需要绝对路径
3.2Nginx命令 常用选项
#基本格式
nginx [选项] [参数]
3.2.1常用选项
选项 | 功能 |
-c <配置文件> | 指定一个自定义的配置文件路径 |
-g <全局配置> | 在命令行中指定全局配置选项 |
-p <工作目录> | 设置工作目录,用于存放日志文件和临时文件 |
-s <信号> | 向nginx发送信号,常用的有stop (停止nginx进程)和reload (重新加载配置文件) |
-t | 测试配置文件语法是否正确 |
-q | 在测试配置文件时,以静默模式运行,只输出关键信息 |
-V | 显示nginx的版本、编译信息和配置参数 |
-h | 显示帮助信息,包括所有可用的命令行选项 |
-s <文件> | 启动nginx并将master进程的PID写入指定的文件 |
-e <错误日志文件> | 设置错误日志文件的路径 |
-g <配置指令> | 设置全局配置指令。可以在命令行中设置多个全局配置指令,用分号分隔 |
-T | 测试配置文件,并打印出解析后的配置内容 |
-q <文件> | 检查配置文件,并打印出解析后的配置内容,但不启动nginx |
3.2.3信号
#基本格式
nginx -s 信号
信号 | 描述 |
stop | 快速停止nginx进程,可能会中断现有连接。 |
quit | 优雅地停止nginx进程,等待现有连接完成后再停止。 |
reload | 重新加载配置文件,优雅地应用新配置,不中断现有连接。 |
reopen | 重新打开日志文件,用于日志切割或日志重定向。 |
term | 快速停止nginx进程,可能会中断现有连接,与stop 信号类似。 |
usr1 | 重新打开日志文件,用于日志切割或日志重定向,与reopen 信号类似。 |
usr2 | 平滑地升级nginx可执行文件。 |
hup | 重新加载配置文件,优雅地应用新配置,与reload 信号类似。 |
winch | 当nginx以master/worker工作模式运行时,重新生成worker进程以适应新的配置。 |
usr3 | 向worker进程发送自定义信号。 |