一.Nginx简单介绍

Nginx是由俄罗斯人Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的十分轻量级的HTTP服务器。Nginx它的发音为“engine X” ,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器。

Nginx专为性能优化而开发,性能是其最重要的考量实现上非常注重效率。它支持内核Poll模型,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。

Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。

例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。

就稳定性而言nginx比lighthttpd更胜一筹。Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

二.Nginx优势

IO多路复用epoll模型

1什么是IO复用?

IO复用:由内核提供的一种同时监控多个文件描述符状态的功能。

例如:当进程需要操作多个IO相关描述符时,服务器程序要同时查看监听socket和大量业务socket是否有数据到来,需要内核能够监控许多描述符,一旦这些描述符就绪就主动告诉进程哪些描述符就绪,站在进程的角度上,就不需要挨个查看每个文件的描述符。

2.什么是IO多路复用?

多个描述符的I/O操作都能在一个线程内并发交替的顺序完成

3.IO多路复用epoll

实现方式有三种:

select

缺点:能够监视文件描述符的数量存在最大限制;线性扫描效率低下

优点:windows、linux都支持

epoll

优点:没有最大并发连接限制;效率提升,不是轮询的方式

轻量级

1.功能模块少

2.代码模块少

3.CPU亲和

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

4.可以高并发

官方测试Nginx能够支撑5万并发连接,实际生产环境中只能抗住2-4万的并发

采用最新的epoll和kqueue网络I/O模型,而传统的Apache 使用的select模型,消耗CPU比较高。

5.内存消耗少

6.稳定性高

用于方向代理

Nginx的基本功能

1.处理静态文件

2.反向代理加速

3.通过fastcgi,简单的负载均衡和容错。

4.SSL 支持

5.模块化

.Nginx应用场景

1.静态请求

2.反向代理

3.负载均衡

4.资源缓存

5.安全防护

6.访问限制IP

7.访问认证

Nginx代理

1.Nginx的正向代理

正向代理换言之,就是客户端知道目标主机地址,目标服务器只需要知道哪个代理服务器,不清楚来自哪个具体的客户端,正向代理屏蔽了或隐藏了真实客户端信息

2.Nginx的反向代理服务器

客户端请求的是代理服务器,并不住地后端的目标服务器

三.Nginx的结构解析

进程操作

nginx在启动后,在unix系统中会以daemon(服务)的方式在后台运行,后台进程包含一个master进程和多个worker进程。

我们只需要与master进程通信就行了。master进程会接收来自外界发来的信号,再根据信号做不同的事情。所以我们要控制nginx,只需要通过 kill 向 master 进程发送信号就行了。

比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。

master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。

新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。

事件模型

现在,我们知道了当我们在操作nginx的时候,nginx内部做了些什么事情,那么,worker进程又是如何处理请求的呢?我们前面有提到,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是用的异步非阻塞

首先,请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据。具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧。

非阻塞就是,事件没有准备好,马上返回EAGAIN,告诉你,事件还没准备好呢,慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。

所以,才会有了异步非阻塞的事件处理机制,具体到系统调用就是 select/poll/epoll/kqueue 这样的系统调用。它们提供了一种机制,让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。

这种机制正好解决了我们上面的两个问题,拿 epoll 为例(在后面的例子中,我们多以 epoll 为例子,以代表这一类函数),当事件没准备好时,放到epoll 里面,事件准备好了,我们就去读写,当读写返回 EAGAIN 时,我们将它再次加入到 epoll 里面。这样,只要有事件准备好了,我们就去处理它,只有当所有事件都没准备好时,才在 epoll 里面等着。

这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。

与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多的并发数,只是会占用更多的内存而已。

一个是基于轮询的,一个是基于事件的。apache 想知道5个孩子饿不饿,需要一个个去问,问到谁饿了就知道了。nginx 想知道5个孩子饿不饿,注册一个回调,谁饿了就自己报道一声,调用一下事件。可以这么理解。

四.Nginx的启动顺序

启动顺序

post-read  1读取请求内容阶段,nginx读取并解析完请求头之后就立即开始运行;

server-rewrite  2.server请求地址重写阶段;

find-config   3.配置查找阶段,用来完成当前请求与location配重块之间的配对工作;

rewrite   4.location请求地址重写阶段,当ngx_rewrite指令用于location中,就是再这个阶段运行的;

post-rewrite    5.请求地址重写提交阶段,当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话;

preaccess   6.访问权限检查准备阶段,ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度;

access   7.权限检查阶段,ngx_access在这个阶段运行,配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法;

post-access   8.访问权限检查提交阶段;

try-files    9.配置项try_files处理阶段;

content    10.内容产生阶段,是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP响应内容的;

log   11.日志模块处理阶段;

每一个阶段上能够注冊handler。处理请求就是执行每一个阶段上注冊的handler。Nginx模块提供的配置指令仅仅会一般仅仅会注冊并执行在当中的某一个处理阶段。

比方,set指令属于rewrite模块的,执行在rewrite阶段,deny和allow执行在access阶段。

子请求

Nginx中从客户端访问的叫主请求,他被nginx这个程序来逐步处理。还有一种内部的请求,叫子请求。

比如下面这个,将请求交给foo和bar的区块去处理。

location /main {
echo_location /foo; #echo_location发送子请求到指定的location
echo_location /bar;
}
location /foo {
echo foo;
}
location /bar {
echo bar;
} #curl http://127.0.0.1/main
#返回 foo
# bar

Nginx结构原理全解析的更多相关文章

  1. 属性动画 ValueAnimator 运行原理全解析

    最近下班时间都用来健身还有看书了,博客被晾了一段时间了,原谅我~~~~ 提问环节 好,废话不多说,之前我们已经分析过 View 动画 Animation 运行原理解析,那么这次就来学习下属性动画的运行 ...

  2. (转)Apache和Nginx运行原理解析

    Apache和Nginx运行原理解析 原文:https://www.server110.com/nginx/201402/6543.html Web服务器 Web服务器也称为WWW(WORLD WID ...

  3. Java并发原理层面:ReentrantLock中lock()、unlock()全解析

    一.前言 Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持. 二.AQS源码对于lock.lock()的实现 2.1 AQ ...

  4. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  5. Nginx工作原理和优化、漏洞

    1.  Nginx的模块与工作原理 第三方模块:HTTP Upstream Request Hash模块.Notice模块和HTTP Access Key模块. 图1-1展示了Nginx模块常规的HT ...

  6. Nginx 工作原理和优化、漏洞

    1.  Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(locat ...

  7. Nginx工作原理和优化、漏洞(转)

    查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -Vnginx version: nginx/1.2.3built by gc ...

  8. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  9. Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡

    转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...

随机推荐

  1. java web 在线编辑Excel -- x-spreadsheet

    --- x-spreadsheet --- 文档 https://hondrytravis.com/x-spreadsheet-doc/ <%@ page language="java ...

  2. OPA-Gatekeeper实验:对特定用户的更新时间窗口做限制

    实验目的 OPA-Gatekeeper可以在Kubernetes 中,通过策略来实现一些额外的管理.安全方面的限制,例如:限制特定用户在 Namespace 中的行为权限 本次实验将在test命名空间 ...

  3. [luogu3706]硬币游戏

    (可以参考洛谷4548,推导过程较为省略) 定义$g_{i}$表示随机$i$次后未出现给定字符串的概率,$f_{k,i}$表示随机$i$次后恰好出现$s_{k}$(指第$k$个字符串)的概率,设两者的 ...

  4. vue的常用指令

    https://www.bootcdn.cn/ 前端资源库 <!-- 常用内置指令 v:text : 更新元素的 textContent v-html : 更新元素的 innerHTML v-i ...

  5. Redis 很屌,不懂使用规范就糟蹋了

    这可能是最中肯的 Redis 使用规范了 码哥,昨天我被公司 Leader 批评了. 我在单身红娘婚恋类型互联网公司工作,在双十一推出下单就送女朋友的活动. 谁曾想,凌晨 12 点之后,用户量暴增,出 ...

  6. CF932F Escape Through Leaf

    CF932F Escape Through Leaf 首先, $ O(n^2) $ dp 是很显然的,方程长这样: \[dp[u] = min\{dp[v] + a_u\times b_v\} \] ...

  7. NOIP2021 游记

    不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分释迦牟尼脚绽莲花菩提达摩你真伟大天上天下唯我独尊如来佛祖太上老君耶稣耶稣 ...

  8. BZOJ3971 [WF2013]Матрёшка

    *XXXIV. BZOJ3971 [WF2013]Матрёшка 摘自 DP 做题记录 II 例题 XXXIV. 仍然是神仙区间 DP. 直接设状态 \(f_{i,j}\) 表示区间 \([i,j] ...

  9. fping (比ping更强大的ping工具)

    Fping程序类似于ping(ping是通过ICMP(网络控制信息协议InternetControl Message Protocol)协议回复请求以检测主机是否存在).Fping与ping不同的地方 ...

  10. Python基础之流程控制if判断

    目录 1. 语法 1.1 if语句 1.2 if...else 1.3 if...elif...else 2. if的嵌套 3. if...else语句的练习 1. 语法 1.1 if语句 最简单的i ...