nginx

84 阅读7分钟

1.网络IO模型

1.1同步/异步

同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。

  • 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成

    nginx主动去问内核,是否完成了任务;

  • 异步:

    asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

    内核主动反馈给nginx交代的任务

    image-20240630230727454

1.2阻塞/非阻塞

  • 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。

  • 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

    image-20240630230738309

1.3四种组合

  1. 同步阻塞:发起方主动去问 接收方是否完成任务;处理完成之前,接收方会被挂起,不会处理别的事情
  2. 同步非阻塞:发起方主动去问 接收方是否完成任务;处理完成之前,可以处理别的请求
  3. 异步阻塞:接收方主动给发起方反馈消息;处理完成之前,接收方会被挂起,不会处理别的事情
  4. 异步非阻塞:接收方主动给发起方反馈消息;处理完成之前,可以处理别的请求

1.4五种网络I/O模型

  1. 阻塞性I/O模型:相当于 异步阻塞(最简单、基本不用!)
  2. 非阻塞I/O模型:相当于 同步非阻塞
  3. 多路复用I/O模型(能满足,足够用!)
  4. 信号驱动式I/O模型:效率高
  5. 异步I/O模型:相当于 异步非阻塞 效率高

注:目前主流模型是多路复用模型

2.nginx

1.nginx架构:主程序master+子进程worker

  • master:不干活,只接收请求,然后分配工作给worker
  • worker:干活

2.nginx8种模型

nginx共有8种模型,默认选择的epoll模型。最常用的模型是前3种:

  1. select

    Select:
    POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理
    缺点
    单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义
    FD_SETSIZE,再重新编译内核实现,但是这样也会造成效率的降低
    单个进程可监视的fd数量被限制,默认是1024,修改此值需要重新编译内核
    对socket是线性扫描,即采用轮询的方法,效率较低
    select 采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,这样一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
    
  2. poll

    poll:
    本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
    其没有最大连接数的限制,原因是它是基于链表来存储的大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义poll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd select是边缘触发即只通知一次
    
  3. 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减少复制开销
    
  4. rtsig

  5. kqueue

  6. /dev/poll

  7. eventport

  8. Iocp

    selectpollepoll
    操作方式遍历遍历回调
    底层实现数组链表哈希表
    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个配置文件功能如下:

  1. conf:保存nginx所有的配置文件
  2. html:目录中保存了nginx服务器的web文件
  3. logs:用来保存nginx服务器的访问日志错误日志等日志
  4. sbin:保存nginx二进制启动脚本

3.3nginx信号

选项含义
-t检查语法格式
-T检查语法,并打印所有配置
-v显示版本
-V显示详细信息,包括编译的信息
-c指定配置文件位置,可以不用官方默认的文件,自己指定路径
-g单独指定配置,不以配置文件中的为准,但注意: 单独改之前,要先将配置文件里的注释掉,二者不能有冲突
-s发送信号,类似于kill
-hhelp帮助

nginx -s 与kill对比

nginx -s信号kill信号含义
nginx -s reloadkill -1(HUP)重新加载配置文件
nginx -s stopkill -9 (KILL)立即退出
nginx -s quitkill -3(QUIT)优雅的退出
nginx -s reopenkill -USR1重新生成日志
nginx -s USR2——飞行中升级

4.nginx配置

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

主配置文件:nginx.conf

子配置文件: include conf.d/*.conf

image-20240630233018751