一:什么是nginx
一个开源高性能,可靠的http中间件,代理服务
开源:源代码已公布,可以对源代码进行二次开发,淘宝的Tengine就是对nginx的二次开发,作为应对高并发量的服务器。
高性能:支持海量高并发的web-server服务
可靠:服务不容易蹦,比较稳定
二:和NGINX类似的http中间件
HTTPD:apache
IIS:微软
GWG:谷歌
三:为什么选择NGINX
1. IO多路复用
(1)IO复用
输入流: 只能从中读取数据,而不能向其写入数据。I
输出流:只能向其写入数据,而不能向其读取数据。O
操作系统处理IO流的方式一般为:
串行处理:前一个阻塞了,后面都得等
并行处理:前一个阻塞了,会继续处理其他,等不阻塞了,在接着执行
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机制
当我们请求一个文件的时候,它要经过内核空间,用户空间,然后在经过内核空间,然后在经过用户空间,然后达到socket,通过socket传递给response给用户。内核空间到用户空间是要进行切换的,上图进行了多次切换,但是静态文件,不要经过用户空间逻辑处理,直接通过内核空间进行传输。
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
# TODO