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服务器。
Nginx学习(一)的更多相关文章
- Nginx学习回顾总结 部分:
21:46 2015/11/9Nginx学习回顾总结进程间通信,近似于socket通信的的东西:才发现这种通信并不是很难,并不是我想象的那样很多内容,新领域,入门只是几个函数的使用而已.以前猜过是这样 ...
- Nginx学习笔记4 源码分析
Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...
- Nginx学习笔记~目录索引
回到占占推荐博客索引 前几天整理了<Docker的学习笔记索引>,受到了很多朋友的关注,今天把Nginx的文章也整理一下,以后将永久更新,像大叔之前的<EF文章系列>,< ...
- Nginx学习系列二Linux下Nginx实现负载均衡
关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...
- Nginx系列0:Nginx学习历程
Nginx学习历程 一.初识Nginx 1.Nginx适用于哪些场景 (1)静态资源服务 通过本地文件系统提供服务 (2)反向代理服务 Nginx的强大性能 缓存 负载均衡 (3)API服务 Open ...
- nginx 学习资料
nginx 学习资料 table th:first-of-type { width: 90px; } table th:nth-of-type(2) { } table th:nth-of-type( ...
- Nginx学习总结
2017年2月23日, 星期四 Nginx学习总结 Nginx是目前比较主流的HTTP反向代理服务器(其企业版提供了基于TCP层的反向代理插件),对于构建大型分布式web应用,具有举足轻重的作用.简单 ...
- nginx 学习笔记(2) nginx新手入门
这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...
- Nginx学习---Nginx的详解_【all】
1.1. Nginx简介 1.什么是nginx nginx:静态的,开源的www软件,可以解析静态的小文件(低于1M ),支持高并发占用较发少的资源(3W并发,10个进程,内存150M),跨平台 te ...
- Nginx学习之从零搭建静态资源网站
前言 在某学习网站学习了nginx的安装和使用,以此文记录. 环境准备 安装在VMWare下的Centos虚拟机.由于我这是新装的虚拟机.所以很多插件都没有,这里干脆一次性安装上. wget ...
随机推荐
- postgresql plv8 安装
网上可以看到pg 9.6 版本的plv8容器镜像,没有pg 高版本的支持镜像,但是在基于原有dockerfile 进行构建的时候,居然失败了,有墙的问题,有版本的问题 所以通过虚拟机尝试下构建方式安装 ...
- Flask视图之CBV示列
from flask import views, Flask app=Flask(__name__) class loginview( views.MethodView ): # 继承views. ...
- PATA1028 List Sorting
Excel can sort records according to any column. Now you are supposed to imitate this function. Input ...
- xcode: {} 花括号缩进一个空格
if (jsonDict.HasParseError()) { //前面总是有一个空格 CCLOG("GetParseError %d\n",jsonDict.GetParseEr ...
- java 调用腾讯身份OCR接口文档实例(绝对可用)
1.情景展示 通过读取身份证照片上的信息,实现自动填充功能. 2.原因分析 想要解析照片上所携带的相关信息,就需要识别照片的功能,腾讯提供了免费的身份证OCR接口,可供大家使用. 没有耐心的可以直 ...
- Gamma阶段项目展示
Gamma阶段项目展示 一. 团队成员介绍 姓名 Gamma职责 个人博客 张圆宁 PM,后端 个人博客 王文珺 后端 个人博客 牛宇航 后端 个人博客 申化文 后端 个人博客 汪慕澜 测试,部署 个 ...
- ESRally压测ElasticSearch性能 CentOS 7.5 安装 Python3.7
1,CentOS 7.5 安装 Python3.7 1.安装开发者工具 yum -y groupinstall "Development Tools"2.安装Python编译依赖包 ...
- [ARM-Linux]Linux-MATLAB安装
说明 网上关于caffe的安装教程非常多,但是关于每一步是否操作成功,出现了什么样的错误又该如何处理没有给出说明.因为大家的操作系统的环境千差万别,按照博客中的教程一步步的安装,最后可能失败--这是很 ...
- c++11 enum class用法
使用过的一个enum class的用法:enum class EModel : int { Model1, Model2, Model3, Other = 4, }; EMo ...
- linux --------- linux系统 安装tomcat
1.下载tomcat http://tomcat.apache.org/ 进入官网选download 点击 Archies 2.版本的下载与选择 3.使用winscp传递文件 4.查看所在位置 5 ...