一、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进程发送自定义信号。

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐