nginx:学习二

一:什么是nginx

一个开源高性能可靠的http中间件,代理服务

开源:源代码已公布,可以对源代码进行二次开发,淘宝的Tengine就是对nginx的二次开发,作为应对高并发量的服务器。

高性能:支持海量高并发的web-server服务

可靠:服务不容易蹦,比较稳定

二:和NGINX类似的http中间件

HTTPD:apache

IIS:微软

GWG:谷歌

三:为什么选择NGINX

1. IO多路复用

(1)IO复用

输入流: 只能从中读取数据,而不能向其写入数据。I
输出流:只能向其写入数据,而不能向其读取数据。O

 

 操作系统处理IO流的方式一般为:

串行处理:前一个阻塞了,后面都得等

并行处理:前一个阻塞了,会继续处理其他,等不阻塞了,在接着执行

nginx:学习二_第1张图片

 IO复用就是让一个socket作为复用去完成I/O流的请求,上图是多线程模式

IO多路复用

下面举一个例子,模拟一个tcp服务器处理30个客户socket。
假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:

1. 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主,全班都会被耽误。
这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
2. 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。
这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。
这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。

 

select 模型

poll模型

epoll模型

(2)轻量级

功能模块少,代码模块化

(3)cpu的亲和 

CPU affinity 是一种调度属性(scheduler property), 它可以将一个进程"绑定" 到一个或一组CPU上.

在SMP(Symmetric Multi-Processing对称多处理)架构下,Linux调度器(scheduler)会根据CPU affinity的设置让指定的进程运行在"绑定"的CPU上,而不会在别的CPU上运行. 

Linux调度器同样支持自然CPU亲和性(natural CPU affinity): 调度器会试图保持进程在相同的CPU上运行, 这意味着进程通常不会在处理器之间频繁迁移,进程迁移的频率小就意味着产生的负载小。

因为程序的作者比调度器更了解程序,所以我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起,所有设置CPU亲和性可以使某些程序提高性能。

 

 关于cpu的切换,见:https://www.cnblogs.com/winclpt/articles/10873024.html

是一种把CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,获得更好的性能。

自己理解:一般情况下,一个进程可以每一个cpu上进行执行,假如进程A在CPU核心一执行,执行到一半的时候,又跑到CPU核心二上去执行,那么在CPU核心一上保存的上下文的要加载到CPU二上,

如果一会又跑到CPU核心三上去执行,又要加载一遍上下文,那么每次加载都是需要消耗时间和内存资源,因此这种形式下比较消耗系统的资源,也比较耗时。

知识点:cpu的cache miss  

知识点:进程调度  https://www.cnblogs.com/luxiaolong-lxl/p/process.html

(4)sendfile机制

nginx:学习二_第2张图片

当我们请求一个文件的时候,它要经过内核空间,用户空间,然后在经过内核空间,然后在经过用户空间,然后达到socket,通过socket传递给response给用户。内核空间到用户空间是要进行切换的,上图进行了多次切换,但是静态文件,不要经过用户空间逻辑处理,直接通过内核空间进行传输。

nginx:学习二_第3张图片

sendfile:0拷贝的传输模式,把文件的传输只通过内核空间,传给socket,然后响应给用户

做动静分离中,处理静态文件,ngnix的处理能力就特别强,原因是0拷贝的传输模式。

四:Nginx的安装

Mainline Version  开发版本  用于测试和学习

Stable Version 稳定版本 用于企业项目部署

Legacy Vsersion 历史版本

(1)安装必备组件

sudo yum install yum-utils

(2)要设置yum存储库,请创建名为/etc/yum.repos.d/nginx.repo的文件,其中包含以下内容:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

 

修改 $releasever为centos的版本号,我这里是7

nginx:学习二_第4张图片

 

 

 

 

 

 

 

# TODO

 

你可能感兴趣的:(nginx:学习二)