`

Linux下的工作模型以及Nginx工作原理

 
阅读更多
Web服务器主要任务就是处理来自客户端的请求,一般情况下Web服务器处理并发连接请求的工作模型有以下几种方式:

1、单线程web服务器(Single-threaded web servers)

此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的性能问题。(即一次只能处理一个请求)



2、多进程/多线程web服务器

此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。(即每个进程只能响应一个请求,并且一个进程对应一个线程)



3、I/O多路复用web服务器

为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构———即同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。(这种架构可以理解为一个进程可以生成多个线程,每个请求交给一个线程进行处理)



4、多路复用多线程web服务器

将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。(这种架构可以理解为有多个进程,并且一个进程又生成多个线程,每个线程处理一个请求)



linux下常用的I/O模型(这里借用下在网上查阅的资料,感觉还好理解):

先引入select和epoll概念:

select和epoll是两个处理I/O模型的机制,可以加速请求处理,2者处理方式不同:通俗的讲,select机制是对没有处理好的I/O请求在一段时间内进行检测,并将其状态通知给用户,即有没有完成都会通知。而epool机制则是在该I/O请求完成后才通知给用户。



在Unix/Linux下共有五种I/O模型,分别是:

1)阻塞I/O

2)非阻塞I/O

3)I/O复用(select和poll)

4)信号驱动I/O(SIGIO)

5)异步I/O(Posix.1的aio_系列函数)



对以上模型的比较:

阻塞I/O:

应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示



非阻塞I/O:

我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。



I/O复用(select和poll):

I/O复用模型会用到select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。



信号驱动I/O(SIGIO):

首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。



异步I/O(Posix.1的aio_系列函数):

当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作



回顾下apache的工作模块:

prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。

worker:多进程,一个进程可以生成多个线程,每个线程响应一个请求。

event:一个进程,每个进程响应多个用户请求,它是基于事件实现的。



基于事件机制的特性:

一个进程响应多个用户请求,利用run-loop机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过select或epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。





对于高并发请求的实现:

1、基于线程:即一个进程生成多个线程,每个线程响应用户的每个请求。如worker模型

2、基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。如event模型



web服务器工作流程:

我们知道web服务器是工作在用户空间的,用户空间通过系统调用来与内核打交道。

用户请求-->送达用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源(在此过程中就牵涉到了以上几种模型的运用)



传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。


另一种高性能web服务器/web服务器反向代理:Nginx同(Engine X)

nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环(run-loop)机制进行处理,而每个worker可以并行处理数千个的并发连接及请求。



Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。



主进程主要完成如下工作:

1. 读取并验正配置信息;

2. 创建、绑定及关闭套接字;

3. 启动、终止及维护worker进程的个数;

4. 无须中止服务而重新配置工作特性;

5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;

6. 重新打开日志文件;

7. 编译嵌入式perl脚本;



worker进程主要完成的任务包括:

1. 接收、传入并处理来自客户端的连接;

2. 提供反向代理及过滤功能;

3. nginx任何能完成的其它任务;

如果负载以CPU密集型应用为主,如SSL或压缩应用,则worker数应与CPU数相同;如果负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为CPU个数的1.5或2倍



Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。



在nginx内部,进程间的通信是通过模块的pipeline或chain实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过FastCGI或uwsgi协议与upstream服务器通信,以及与memcached建立会话等。



缓存机制:

我们知道,用户请求不止要请求静态内容,反而大多数请求的都是动态类的网页,在请求动态内容时,php服务器要和mysql打交道,如果请求数量太多,这势必会导致响应用户请求的速度变慢,为了解决这一问题,我们还要引入缓存的概念。



在这里我们引入一个加速缓存的工具:Memcached

Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。



Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:

1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;

2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;

3. 各服务器间彼此无视:不在服务器间进行数据同步;

4. O(1)的执行效率

5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;



Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。

存储类命令:set, add, replace, append, prepend

获取数据类命令:get, delete, incr/decr

统计类命令:stats, stats items, stats slabs, stats sizes

清理命令: flush_all

转自:http://www.linuxidc.com/Linux/2012-11/74598.htm
分享到:
评论

相关推荐

    linux下的nginx+tomcat负载均衡简单原理

    "Linux 下的 Nginx+Tomcat 负载均衡简单原理" Linux 下的 Nginx+Tomcat 负载均衡简单原理是指通过 Nginx 服务器来实现 Tomcat 服务器集群的负载均衡,以提高网站的可用性和性能。本文将对 Linux 下的 Nginx+Tomcat ...

    LINUX-nginx

    **Nginx工作原理** Nginx采用事件驱动的异步非阻塞模型,主要由master进程和worker进程组成。master进程负责管理worker进程,接收来自操作系统的信号,启动、停止worker进程,加载或重新加载配置文件。worker进程则...

    nginx1.20.1Linux版.zip

    Nginx 1.20.1是该软件的一个稳定版本,针对Linux操作系统进行了优化,以确保在Linux环境下高效运行。 **一、Nginx 的架构与工作原理** Nginx 采用主进程(Master Process)和工作进程(Worker Process)的多进程...

    nginx离线部署所需所有依赖包

    在IT行业中,Nginx是一款广泛应用的开源Web服务器,以其高性能、稳定性以及模块化设计而闻名。当在没有网络连接的环境...通过理解Nginx的工作原理和离线部署流程,你可以有效地在任何环境下搭建和管理自己的Web服务器。

    linux下的nginx.rar

    Nginx的工作原理基于事件驱动模型,能够在处理高并发请求时展现出优秀的性能,因此在互联网行业中被广泛部署作为静态资源服务器和动态请求的反向代理。 Nginx的核心组件包括以下几个部分: 1. **主进程(Master ...

    linux下nginx的安装

    在Linux环境下,Nginx是一款广泛应用的开源Web服务器,以其高性能、稳定性以及模块化设计而著名。本篇文章将深入探讨如何在Linux系统中安装Nginx,包括源码编译安装和使用包管理器安装两种常见方法。 首先,让我们...

    C语言 Linux Nginx 线程池

    Nginx通常采用事件驱动模型,如epoll(Linux下的I/O多路复用),以处理大量的并发连接。然而,在某些处理密集型任务时,如数据库查询或复杂的计算,直接在工作进程中执行可能导致阻塞,这时线程池的概念就显得尤为...

    nginx1.18 nginx1.18 nginx1.18

    在使用 Nginx 1.18 的过程中,理解其配置语法和工作原理至关重要,这将有助于优化服务器性能,解决可能出现的问题,并充分利用其功能。通过持续学习和实践,你可以成为熟练驾驭 Nginx 的专业人士。

    nginx实战-张晏

    2. Nginx工作原理:深入理解Nginx的事件模型,如epoll、kqueue等,以及其非阻塞I/O多路复用的工作机制,这有助于优化服务器性能。 二、Nginx反向代理 3. 反向代理基础:阐述反向代理的概念,Nginx如何作为前端...

    NGINX 0.1版代码

    在NGINX的早期版本,如0.1版,其代码结构相对简单,是初学者深入理解其工作原理的良好起点。本文将对NGINX 0.1版的源代码进行简要分析,以帮助读者了解其核心组件和设计理念。 1. **模块化架构** NGINX的核心设计...

    linux_nginx

    标题“Linux_Nginx”揭示了我们即将探讨的是关于Linux操作系统下的Nginx服务器的使用和配置。Nginx是一款高性能、轻量级的HTTP和反向代理服务器,以其高并发处理能力、低内存占用以及丰富的模块化设计而受到广泛青睐...

    nginx的window和Linux安装包

    Nginx采用事件驱动模型,通过epoll(Linux)或IOCP(Windows)实现高效的异步非阻塞I/O操作。它作为反向代理服务器,可以分发请求到后端多个服务器,提高系统的负载均衡能力。 **Nginx的主要功能** 1. **静态资源...

    Nginx安装配置.rar

    **Nginx安装配置** Nginx是一款高性能的Web服务器,常用于反向代理、负载...记得在安装过程中关注每一个步骤,参考提供的"nginx安装步骤.docx"文档和"2 Nginx工作原理及安装配置.ts"视频,以便更好地掌握Nginx的使用。

    nginx-0.0.1源代码

    - Nginx 使用事件驱动模型处理网络连接,它通过epoll(Linux)、kqueue(FreeBSD)等系统调用来实现异步非阻塞I/O操作,有效减少了等待I/O操作完成时的资源消耗。 - 这种模型使得 Nginx 可以同时处理大量并发连接...

    nginx源码学习资料

    通过使用epoll(Linux)、kqueue(FreeBSD)等高效I/O复用技术,Nginx可以有效地管理大量并发连接,避免了传统的多线程模型中的上下文切换开销。 **2. 模块化结构** Nginx的核心功能是高度模块化的,包括HTTP、SMTP...

    nginx核心详解

    本篇文档旨在深入解析Nginx的原理和内部机制,帮助读者理解其核心功能和工作方式。 Nginx的进程模型是其高效运行的关键之一。它采用主-工作进程模型,分为监控进程和工作进程。主进程(监控进程)主要负责管理子...

    nginx-1.5.17

    本文将深入探讨Nginx的特性、工作原理以及如何配置和优化Nginx以满足各种应用场景。 一、Nginx的工作原理 1. 异步非阻塞I/O模型:Nginx采用事件驱动的架构,通过epoll(Linux)或kqueue(FreeBSD)等高性能I/O复用...

    nginx原码版本0.9.5

    Nginx 0.9.5 是其历史版本之一,发布于2007年,虽然这个版本相对比较旧,但了解它的内部工作原理和结构对于深入理解 Nginx 的发展和设计思想至关重要。 ### 1. Nginx 架构 Nginx 采用事件驱动的异步非阻塞模型,...

    nginx-release-1.21.4.zip

    在Linux系统上,一般会将其安装在`/usr/local/nginx`目录下,然后通过命令行启动、停止和重启Nginx服务。例如,`/usr/local/nginx/sbin/nginx`用于启动Nginx,`nginx -s reload`用于重新加载配置,`nginx -s stop`...

Global site tag (gtag.js) - Google Analytics