Nginx学习(一)

Nginx

I/O模型
网络I/O
本质是socket读取
第一步:将数据从磁盘文件先加载至内核内存空间(暖冲区),等待数据准备完成,时间较长。
第二部:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短。
总结:CPU>内存>磁盘

同步/异步:关注的是消息通信机制
同步:synchronous,调用者等待被调用者返回消息,才能继续执行。
异步:asynchronous,调用者通过状态,(通知或回调机制)主动通知调用者被调用者的运行状态。
阻塞/非阻塞:关注调用者在等待结果返回之前所处状态
阻塞:指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起。
非阻塞: 指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起。

IO多路服用模型
进程受阻与select调用,
用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异步),同时等待select系统调用返回。当数据到达时,IO被激活,select函数返回。
用户线程正式发起read请求,读取数据并继续执行。

总结:
第一阶段
用户阻塞在select
第二阶段
需要等待数据复制到应用缓冲区(从kernel-->用户进程空间)

select和poll
1.select
(1)同步IO
(2)跨平台(Linux,Windows)
(3)线性遍历,基于数组,并发越大遍历时间越长导致响应时间越慢。
(4)最大连接数1024,超过1024修改编译内核。
(5)水平触发(多次通知)、消耗性能
2.poll
(1)同步IO
(2)Linux平台
(3)线性遍历,基于链表,并发越大遍历时间越长导致响应时间越慢。
(4)最大连接数无上限
(5)水平触发
3.epoll
(1)异步IO
(2)基于回调时间通知方式和请求数量没关系
(3)Linux平台
(4)最大连接数无上限
(5)水平触发/边缘触发(只通知一次,性能好)
磁盘I/O

例子:
用户发送请求想访问 http://www.youku.com/index.html --> 请求到达服务器的网卡 -->经过物理层 -->数据链路层 -->网络层 -->传输层 -->最后到达应用层的nginx进程-->Nginx去请求kernel-->内核把请求转到磁盘上-->磁盘返回响应给内核-->响应到达内核后会存放到内核的缓冲区上-->kerner缓存区复制到Nginx进程的缓冲区当中-->然后在经历消息封装从物理层网络出去返回给用户。
Nginx介绍

Nginx安装

Nginx各种模块

 

httpd MPM

prefork:
进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求。
worker
线程模型,三级结构,主进程master负责生成子进程,每个子进程生成多个线程,每个线程响应一个请求。
even
线程模型,三级结构,主进程master负责生成子进程,每个子进程响应多个请求。


普通文件
目录文件
链接文件
设备文件

文件描述符(fd)
文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符。

g++ lots_of_errors 2>&1 | head

其中2>&1中的 2 就是表示的「标准错误」,1 就是「标准输出」,中间的 & 表示后面跟的数字是文件描述符而不是一个文件(不然所有的「标准错误」就都重定向到了一个名为 1 的文件中了)。


system call kernel context switch : 系统调用内核上下文开关

socket默认是阻塞的
给socket设置成非阻塞的,当socket描述符未就绪时,调用读写函数就会报,EAGAIN/EWOULDBLOCK 。

epoll线程是安全的,select和poll是非安全的。
epoll内部使用了 mmap共享用户和内核的部分空间,避免了数据的来回拷贝。


内核态(内核空间)
用户态(用户空间)

内核态(内核空间)和用户态(用户空间)

    用户空间是用户进程所在的内存区域,系统空间是操作系统所在的内存区域。

    为了保证内核的安全,处于用户态的程序只能访问用户空间,而处于内核态的程序可以访问用户空间和内核空间。


文件描述符fd

    Linux将所有设备都当做文件来处理,文件描述符来标识每个文件对象。

    当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。


"soft" 和 "hard" 的区别

soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。

hard xxx : 代表严格的设定,不允许超过这个设定的值。


如:soft 设为1024,hard设为2048 ,则当你使用数在1~1024之间时可以随便使用,1024~2048时会出现警告信息,大于2048时,就会报错。


"nproc" 和 "nofile"的区别

nproc : 是操作系统级别对每个用户创建的进程数的限制

nofile : 是每个进程可以打开的文件数的限制

打开/etc/security/limits.conf (部分的系统是在/etc/security/limits.d/90-nproc.conf)

设置限制数量,第一列表示用户,* 表示所有用户

soft nproc :单个用户可用的最大进程数量(超过会警告);
hard nproc:单个用户可用的最大进程数量(超过会报错);
soft nofile  :可打开的文件描述符的最大数(超过会警告);
hard nofile :可打开的文件描述符的最大数(超过会报错);

 


阻塞I/O
应用程序调用一个IO函数,导致应用程序阻塞,如果数据准备好,从内核拷贝到用户空间,否则一直等待下去。


非阻塞I/O模型
我们把一个套接口设置为非阻塞就是告诉内核,当所有请求的I/O操作无法完成时,不要将进程休眠,而是返回一个错误。这样我们的I/O操作函数将不断测试数据是否
已经准备好,如果没有准备好,继续测试,直到数据准备为止。

注意:在这个不断测试的过程中,会大量的占用CPU时间。


Nginx:

特性:
模块化设计
高可靠性
支持热部署(不停机更新配置,比如升级Nginx版本,更换日志文件)
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存
even-driven,aio.mmap.sendfile
基本功能
静态资源web服务器
http协议反向代理服务器
pop3/imap4协议反向代理服务器
FastCGI(LNMP)协议,独立的进程。
模块化(静态加载,非DSO(非动态)),如zip,ssl模块。

web服务相关的功能
虚拟主机
支付keep-alive和管道连接
访问日志
支持基于日志缓冲
url rewirte
URL跳转
路径别名
alias 也是跳转,但是跳转的文件夹。
基于IP及用户的访问控制
支持速率限制及并发连接数限制
重新配置和在线升级而无需中断客户工作的进程
memcached的GET接口

master和worker进程关系
master管理worker进程,master负责加载配置文件、平滑升级等。


Nginx模块
高度模块化,但其模块早期不支持DSO机制(动态加载),1.9.11版本支持动态加载和卸载。
模块分类:
核心模块:core module
标准模块
http模块:ngx_http_*
http Core module 默认功能
http Optional module 需要编译时指定
Mail模块:ngx_mail_*
Stream模块:ngx_stream_*

Nginx功能
静态的web资源服务器
html,图片,js,css,txt等静态资源
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求。
http/HTTPS协议的反向代理
tcp/udp协议的请求转发(反向代理)


lvs和Nginx区别
都是接收请求,lvs会把请求转发到后端服务器,后端服务器会认为用户是请求者,Nginx会代替用户去访问后端服务器,后端服务器会认为请求者是Nginx服务器。

posted @ 2019-12-03 11:30  嚒~☆大白  阅读(130)  评论(0编辑  收藏  举报