部署一个nginx的服务器之各大模块讲解

http服务及IO事件模型详解


Nginx:
	
	engine X = Nginx
	
		http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy
			
		NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. 
		
		C10K(10K Connections).
		Tengine, OpenResty.
		
	http协议:
		URL:shceme://username:password@host:port/path;params?query#frag
		用户名和密码 表示需要认证的页面
		/path是根本地文件系统的映射
		动态资源或者需要参数 params 
		
			DocumentRoot:/PATH/TO/SOMEDIR/
				Location:URL				
			Alias
			
			params:
				key=value&key=value
				
			query: 从数据库需要查询 传递select语句的查询条件
				field=value, ...
		  frag:锚定资源的某一个位置		 
		
		http事务:
			request:
				<method> <URL> <VERSION>
				HEADERS
				
				<body>
			
			response:
				<VERSION> <STATUS> <REASON-PHRASE>
				HEADERS
				
				<body>
				
				name: value
		
			Method:GET/HEAD/POST, PUT/DELETE, TRACE, OPTIONS
		
			Status Code:
				1xx: 信息类响应码 没什么意义
				2xx:成功类响应码,200
				3xx:重定向类的响应码,301, 302, 304
				4xx:客户端错误,403客户端没权限,404
				5xx:服务器端错误,502
				
			认证:
				基于ip认证  限制Ip地址访问
				基于用户认证 :basic/digest 
				
			httpd MPM:常见的并发响应模型
				prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求;预先生成空闲进程
				worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求;
				event:主进程master负责生成子进程,每个子进程响应多个请求;基于事件驱动的模型,是真正意义上的非常轻量化的,甚至没有单一组织实体的线程。没有一个线程实体。worker的线程确实是存在的,跟进程的量级是差不多的。

程序的执行是从主程序执行 有需要的函数进行调用别的函数
等待函数返回后 继续执行 每个函数有自己的上下文(变量)

相当于打离婚官司
你是主程序 调用律师打官司 但是律师的知识背景(变量)你是不清楚的
律师帮你处理肯定需要从你(主程序)这里获取信息,处理完毕之后返回给你(主程序),然后你继续执行后面的(找新的)

在这里插入图片描述
所以随时调用函数
每次调用的参数都是不一样的(对象名字)
有没有可能调用一个函数 不等它返回继续向下走

也就是把信息给律师后直接又去找新对象了
但是不等待返回 等执行完如何把结果返回给主程序呢?
也就是律师处理完想要返回给你 但是你不知道跑哪儿去了。就有问题了(代码调用问题)可以留微信号让他找到你 可以把你调回来的功能(回调机制)

		同步:等待对方返回消息; 
		异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;

系统调用:
内核上有很多代码库(函数)
如果用户空间需要调用内核上的函数(系统调用)
实现系统级的功能 网卡报文发送过程

任何程序是不能直接在磁盘存数据 需要像内核发起系统调用

在这里插入图片描述
所以想要存文件 就需要磁盘IO
一般用户空间的文件调用都是文件系统IO
还有网络IO 键盘IO 都需要系统调用实现 这个时候cpu运行的就是内核代码

最多就是磁盘IO 网络IO 函数调用

他们的本质都是系统调用

cpu上面 很多电路级指令
一类:普通指令
一类:特权指令
操作指令在环0上 内核极代码 公共 盖房子
其他的在环3上 在家装书柜

在这里插入图片描述
还有远程调用
比如nfs

I/O模型:
		阻塞型、非阻塞型、复用型、信号驱动型、异步
		
		同步/异步:
			关注消息通知机制;
			
			消息通知:
				同步:等待对方返回消息; 一直跟律师在一起
				异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;律师打完官司通过微信找到你
		
		阻塞/非阻塞:   在律师把结果返回之前你在干什么。调用者的状态
			关注调用者在等待结果返回之前所处的状态; 
			
				阻塞:blocking,调用结果返回之前,调用者被挂起;(睡觉)等律师返回之前把你唤醒,发出请求在对方返回之前什么事情也不做,调用返回激活。
				非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起;(不睡眠,你坐着等,反复询问律师你好了没有)忙等
				
		一次文件IO请求,都会由两阶段组成:
			第一步:等待数据,即数据从磁盘到内核内存; 
			第二步:复制数据,即数据内核内存到进程内存; 
			内核内存和进程内存不同  从磁盘到内核内存很慢 因为磁盘很慢
			
		复用型IO调用:
			select()1024  就是httpd的preforx最多支持1024个进程
			poll():无限制
			
			event-driven:  信号驱动型
				epoll(Linux):libevent包提供的
				Kqueue(BSD):
				/dev/poll(Solaris)

复用IO 需要一个内核复用器 帮助它 自己依然是阻塞的
等待内核复用器监控

信号驱动型:异步的
调用者发送请求后 不等待返回结果 继续做自己的事情 对方第一步文件IO完成了后 第一步完成通知调用者 调用者等待数据从内核内存到自己的内存 第一段不阻塞(很慢95%时间) 第二段阻塞(很快)

所以自己可以在第一个阶段不断的接受请求,并发、
因为自己第一个阶段非阻塞 就可以一直接受请求
所以一个进程可以处理多个请求

每一个请求都会留一个特殊的回调位置
第一个结束了主进程必须停下来,不能接受请求了,被阻塞
等待数据从内核内存到进程内存 就可以响应给用户了

响应完成后继续接受请求
如果有其他的返回了就继续阻塞一会儿

即便返回的时候需要阻塞一会儿 但是很快
所以可以很快的响应多个请求

异步IO:
第一步第二步都不需要自己参与
即加载到进程内存后直接响应即可。不需要等待。

在这里插入图片描述
去饭店吃饭:
1.老板做面放到柜台上
2.自己端过来吃

形象的例子!!!!

1.老板做面,干等        阻塞
2.老板做面,抓耳挠腮  面好了 自己端过来  非阻塞
3.既想吃面,又想外面的肉夹馍。找一个显示屏。阻塞在显示屏上。
第一个做好了屏幕上显示。        复用型IO
4.老板做面,自己出去玩去了,老板做好了叫我。放在柜台上,自己端过来吃(这部还是阻塞的)       事件驱动型
5.老板做面,自己出去玩去了,老板做好放在桌子上,筷子也准备好了。就等着你吃了    异步的

httpd的preforx最多1024个进程 请求
nginx可以并发处理10000个并发请求 100K 1000K了现在
Nginx并不依赖线程处理线程
而是利用非常可扩展性的事件驱动架构和异步架构
只需要很少的内存资源就可以处理大量的并发

nginx的主要功能
在这里插入图片描述
dnat是四层隐藏
proxy是七层
解析应用层的 代理服务器收到后

Nginx

NGINX is a free, open-source, high-performance HTTP server and 
reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is 
known for its high performance, stability, rich feature set, 
simple configuration, and low resource consumption.

	NGINX is one of a handful of servers written to address the C10K problem. Unlike traditional servers, NGINX doesn’t rely on threads to handle requests. Instead it uses a much more scalable event-driven (asynchronous) architecture. This architecture uses small, but more importantly, predictable amounts of memory under load. Even if you don’t expect to handle thousands of simultaneous requests, you can still benefit from NGINX’s high-performance and small memory footprint. NGINX scales in all directions: from the smallest VPS all the way up to large clusters of servers.

	NGINX powers several high-visibility sites, such as Netflix, Hulu, Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga, Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN and many others.		
			
	Nginx的程序架构:
		master/worker
			一个master进程:
				负载加载和分析配置文件、管理worker进程、平滑升级
			一个或多个worker进程
				处理并响应用户请求
			缓存相关的进程:
				cache loader:载入缓存对象
				cache manager:管理缓存对象
				
		特性:异步、事件驱动和非阻塞
			并发请求处理:通过epoll/select
			文件IO:高级IO sendfile,异步,mmap

在这里插入图片描述
nginx作为普通的web-server(静态服务器)
在这里插入图片描述
一个主进程matser
多个worker进程–处理用户请求

master作用:
装载配置文件
启动worker进程
平滑升级

Nginx的程序架构:
		master/worker
			一个master进程:
				负载加载和分析配置文件、管理worker进程、平滑升级
			一个或多个worker进程
				处理并响应用户请求
			缓存相关的进程:
				cache loader:载入缓存对象
				cache manager:管理缓存对象
				
		特性:异步、事件驱动和非阻塞
			并发请求处理:通过epoll/select
			文件IO:高级IO sendfile,异步,mmap
			
		nginx模块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;
			模块分类:
				核心模块:core module
				标准模块:
					HTTP modules:
						Standard HTTP modules
						Optional HTTP modules
					Mail modules
					Stream modules:
						传输层代理
				3rd party modules
nginx的功用:
			静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)
			结合FastCGI/uwSGI/SCGI等协议反代动态资源请求;
			http/https协议的反向代理;
			imap4/pop3协议的反向代理;
			tcp/udp协议的请求转发;

部署一个最基本的nginx的服务器及其最基本的配置

1.什么是nginx?

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务

2.nginx工作原理

NGINX以高性能的负载均衡器,缓存,和web服务器闻名。
Nginx由内核和模块组成其中,内核完成的工作也非常简单,当它接到一个HTTP请求时,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

Nginx的模块直接被编译进Nginx,因此属于静态编译方式。启动Nginx后,Nginx的模块被自动加载,不像Apache,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。
在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

在这里插入图片描述
Nginx的模块从功能上分为如下三类:

Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx进程模型

Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。

nginx的进程模型如图所示:
在这里插入图片描述

在创建master进程时,先建立需要监听的socket(listenfd),然后从master进程中fork()出多个worker进程,如此一来每个worker进程多可以监听用户请求的socket。一般来说,当一个连接进来后,所有在Worker都会收到通知,但是只有一个进程可以接受这个连接请求,其它的都失败,这是所谓的惊群现象。nginx提供了一个accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。

(1)Nginx进程模式分类

在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。

Nginx启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。master进程主要用来管理worker进程。
(2)master进程说明及运行原理

master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。
(3)worker进程说明及运行原理

基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

Nginx处理HTTP请求流程

http请求是典型的请求-响应类型的的网络协议。http是文件协议,所以我们在分析请求行与请求头,以及输出响应行与响应头,往往是一行一行的进行处理。通常在一个连接建立好后,读取一行数据,分析出请求行中包含的method、uri、http_version信息。然后再一行一行处理请求头,并根据请求method与请求头的信息来决定是否有请求体以及请求体的长度,然后再去读取请求体。得到请求后,我们处理请求产生需要输出的数据,然后再生成响应行,响应头以及响应体。在将响应发送给客户端之后,一个完整的请求就处理完了。

在这里插入图片描述

https://www.cnblogs.com/xiangsikai/p/8438772.html

3.nginx的优点?

Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。

Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性

(1)适用于高并发
(2)可以做负载均衡服务器和HTTP服务器
(3)代码的特点
Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统
包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows
Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函
而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库
(4)可以作为代理服务器
作为邮件代理服务:Nginx 同时也是一个非常优秀的邮件代理服务

4.Nginx能做什么?

(1)反向代理
反向代理应该是Nginx做的最多的一件事了
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器
并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

(2)负载均衡
负载均衡也是Nginx常用的一个功能
负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等
从而共同完成工作任务,简单而言就是当有2台或以上服务器时,根据规则随机
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值