1.网络IO模型
1.1同步/异步
同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
-
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
nginx主动去问内核,是否完成了任务;
-
异步:
asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
内核主动反馈给nginx交代的任务
1.2阻塞/非阻塞
-
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
-
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
1.3四种组合
- 同步阻塞:发起方主动去问 接收方是否完成任务;处理完成之前,接收方会被挂起,不会处理别的事情
- 同步非阻塞:发起方主动去问 接收方是否完成任务;处理完成之前,可以处理别的请求
- 异步阻塞:接收方主动给发起方反馈消息;处理完成之前,接收方会被挂起,不会处理别的事情
- 异步非阻塞:接收方主动给发起方反馈消息;处理完成之前,可以处理别的请求
1.4五种网络I/O模型
- 阻塞性I/O模型:相当于 异步阻塞(最简单、基本不用!)
- 非阻塞I/O模型:相当于 同步非阻塞
- 多路复用I/O模型(能满足,足够用!)
- 信号驱动式I/O模型:效率高
- 异步I/O模型:相当于 异步非阻塞 效率高
注:目前主流模型是多路复用模型
2.nginx
1.nginx架构:主程序master+子进程worker
- master:不干活,只接收请求,然后分配工作给worker
- worker:干活
2.nginx8种模型
nginx共有8种模型,默认选择的epoll模型。最常用的模型是前3种:
-
select
Select: POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理 缺点 单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义 FD_SETSIZE,再重新编译内核实现,但是这样也会造成效率的降低 单个进程可监视的fd数量被限制,默认是1024,修改此值需要重新编译内核 对socket是线性扫描,即采用轮询的方法,效率较低 select 采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,这样一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大 -
poll
poll: 本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态 其没有最大连接数的限制,原因是它是基于链表来存储的大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义poll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd select是边缘触发即只通知一次 -
epoll
epoll: 在Linux 2.6内核中提出的select和poll的增强版本支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知 优点: 没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口),具体查看/proc/sys/fs/file-max,此值和系统内存大小相关 效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少复制开销 -
rtsig
-
kqueue
-
/dev/poll
-
eventport
-
Iocp
select poll epoll 操作方式 遍历 遍历 回调 底层实现 数组 链表 哈希表 IO效率 每次调用都仅从线性遍历,时间复杂度为O(n) 同select 时间复杂度O(1) 最大连接数 1024(X86)2048(X64) 无上限 无上限 fd拷贝 每次调用select,都需要把fd集合,从用户态拷贝到内核态 每次调用poll,都要把fd集合,从用户态拷贝到内核态 调用epoll_ctl 时,拷贝进内核态并保存,之后每次epoll_wait不拷贝 - select 遍历
- poll 也是遍历,但是能用epoll就不用poll。
- epoll 回调,主动反馈。epoll 在fd里有报警机制。
3.nginx模块
- 核心模块
- 标准HTTP模块
- 可选HTTP模块
- 邮件服务模块
- stream服务模块
- 第三方模块
3.nginx安装
3.1yum安装
yum install -y epel-release #centos7需要安装额外epel源
yum install nginx -y
3.2编译安装
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel #解决依赖环境
useradd -M -s /sbin/nologin nginx #创建nginx系统用户
cd /opt/
wget http://nginx.org/download/nginx-1.18.0.tar.gz #下载nginx安装包
tar xf nginx-1.18.0.tar.gz #解压安装包
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 #编译nginx
make &make install #安装nginx
chown -R nginx.nginx /apps/nginx #修改权限
vim /usr/lib/systemd/system/nginx.service #创建nginx 系统service文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
systemctl daemon-reload #更新加载service配置
ln -s /apps/nginx/sbin/nginx /usr/sbin/ #创建软连接方便补全启动nginx
编译安装完成后4个配置文件功能如下:
- conf:保存nginx所有的配置文件
- html:目录中保存了nginx服务器的web文件
- logs:用来保存nginx服务器的访问日志错误日志等日志
- sbin:保存nginx二进制启动脚本
3.3nginx信号
| 选项 | 含义 |
|---|---|
| -t | 检查语法格式 |
| -T | 检查语法,并打印所有配置 |
| -v | 显示版本 |
| -V | 显示详细信息,包括编译的信息 |
| -c | 指定配置文件位置,可以不用官方默认的文件,自己指定路径 |
| -g | 单独指定配置,不以配置文件中的为准,但注意: 单独改之前,要先将配置文件里的注释掉,二者不能有冲突 |
| -s | 发送信号,类似于kill |
| -h | help帮助 |
nginx -s 与kill对比
| nginx -s信号 | kill信号 | 含义 |
|---|---|---|
| nginx -s reload | kill -1(HUP) | 重新加载配置文件 |
| nginx -s stop | kill -9 (KILL) | 立即退出 |
| nginx -s quit | kill -3(QUIT) | 优雅的退出 |
| nginx -s reopen | kill -USR1 | 重新生成日志 |
| nginx -s USR2 | —— | 飞行中升级 |
4.nginx配置
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf