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学习(一)的更多相关文章

  1. Nginx学习回顾总结 部分:

    21:46 2015/11/9Nginx学习回顾总结进程间通信,近似于socket通信的的东西:才发现这种通信并不是很难,并不是我想象的那样很多内容,新领域,入门只是几个函数的使用而已.以前猜过是这样 ...

  2. Nginx学习笔记4 源码分析

    Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...

  3. Nginx学习笔记~目录索引

    回到占占推荐博客索引 前几天整理了<Docker的学习笔记索引>,受到了很多朋友的关注,今天把Nginx的文章也整理一下,以后将永久更新,像大叔之前的<EF文章系列>,< ...

  4. Nginx学习系列二Linux下Nginx实现负载均衡

    关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境 1.启动Nginx 在Nginx安装成功的前提下,启动Nginx 已root模式登陆(权限 ...

  5. Nginx系列0:Nginx学习历程

    Nginx学习历程 一.初识Nginx 1.Nginx适用于哪些场景 (1)静态资源服务 通过本地文件系统提供服务 (2)反向代理服务 Nginx的强大性能 缓存 负载均衡 (3)API服务 Open ...

  6. nginx 学习资料

    nginx 学习资料 table th:first-of-type { width: 90px; } table th:nth-of-type(2) { } table th:nth-of-type( ...

  7. Nginx学习总结

    2017年2月23日, 星期四 Nginx学习总结 Nginx是目前比较主流的HTTP反向代理服务器(其企业版提供了基于TCP层的反向代理插件),对于构建大型分布式web应用,具有举足轻重的作用.简单 ...

  8. nginx 学习笔记(2) nginx新手入门

    这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...

  9. Nginx学习---Nginx的详解_【all】

    1.1. Nginx简介 1.什么是nginx nginx:静态的,开源的www软件,可以解析静态的小文件(低于1M ),支持高并发占用较发少的资源(3W并发,10个进程,内存150M),跨平台 te ...

  10. Nginx学习之从零搭建静态资源网站

    前言   在某学习网站学习了nginx的安装和使用,以此文记录. 环境准备   安装在VMWare下的Centos虚拟机.由于我这是新装的虚拟机.所以很多插件都没有,这里干脆一次性安装上. wget ...

随机推荐

  1. Mongo 服务器的安装

    MongoDB的安装 CentOS 中使用yum安装: touch /etc/yum.repos.d/mongodb-org-4.2.repo vim /etc/yum.repos.d/mongodb ...

  2. 阿里云物联网平台: Android 连接阿里云物联网平台

    说明 这节是是为下一节做铺垫的 只要是按照我提供的学习路线一节一节的认认真真学过来的,这节就十分的简单 有了前两节的基础,这节呢咱让Android 连接阿里云物联网平台 使用这节的代码  https: ...

  3. Python3 异常

    异常 --- 程序执行时产生的事件,为Python对象 <Python学习手册>笔记 异常总是通过实例对象来识别 默认的异常处理器 --- 打印标准出错信息(包括引发的异常和堆栈跟踪-异常 ...

  4. P2508 [HAOI2008]圆上的整点

    题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 复制 4 输出样例#1: 复制 ...

  5. Docker入门笔记(Centos7)

    centos7 wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo vim docker-c ...

  6. Java 读取和写入文本文件

    package test_java; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStre ...

  7. Linux 内核启动信息的打印 --- dev_driver_string函数/dev_name函数

    内核启动时,常会打印出一些信息:开头是 "驱动模块的名字: + 具体的信息" 如:在运行的linux系统设备上,插入鼠标,就会打印出鼠标的相关信息; [ 402.134068] i ...

  8. CF461B Appleman and Tree

    CF461B Appleman and Tree 传送门 一道比较容易的树形DP. 考虑用\(dp[i][1]\)代表将\(i\)分配给\(i\)的子树内黑点的方案数,\(dp[i][0]\)代表将\ ...

  9. C语言-memset()

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count)        buffer:为指针或是数组, c:是赋给buff ...

  10. 简单说说JavaScript的Generator 实现(ES6)

    Generator 是 ES6 中新增的语法,和 Promise 一样,都可以用来异步编程 // 使用 * 表示这是一个 Generator 函数 // 内部可以通过 yield 暂停代码 // 通过 ...