Nginx从放弃到入门:Nginx概念(1)

  • A+
所属分类:运维技术

Nginx从放弃到入门:Nginx概念(1)

这篇文章只是单纯的介绍nginx以及一些相关概念,有的概念在实际应用中不会用到,不理解也没有关系,这并不影响我们学习nginx,我们会在以后的文章中介绍怎样实际使用nginx。

 

Nginx是什么

如果你知道http协议和httpd是什么,那你就会很容易理解nginx是什么了,所以,如果你对httpd还不了解,强烈建议从httpd开始学习,有了httpd的相关基础知识以后,再来了解nginx,就会事半功倍了。

 

httpd相关文章请参考本站文章: Apache Httpd

 

说白了Nginx就是一个HTTP服务器,也可以当做反向代理服务器,可以反代httpd,反代邮件服务器,通过fcgi协议反代动态内容等。

 

百度百科的解释如下:

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

 
 

我们可以登录nginx的官网,查看相关信息,官网地址:nginx.org,登录后点击下图中的连接即可查看官网wiki。

Nginx从放弃到入门:Nginx概念(1)

 

查看官网的wiki,官网自己对NGINX的解释如下。

Nginx从放弃到入门:Nginx概念(1)

可以看到,nginx官网自我标榜的是配置简单,资源消耗低,而且说明了自己能够解决c10k问题,它使用了事件驱动异步架构模型,所以消耗小,性能高。

 
 

此处我们提到了 一个概念:c10k,那么什么是c10k呢。

所谓c10k问题,指的是服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是c10k这个名字的由来)。由于硬件成本的大幅度降低和硬件技术的进步,如果一台服务器同时能够服务更多的客户端,那么也就意味着服务每一个客户端的成本大幅度降低,从这个角度来看,c10k问题显得非常有意义。

说白了,c10k问题就是并发的问题。

提到c10k问题,就要提到对应的各种IO模型,了解了这些IO模型后,会明白c10k问题是怎么得到解决的,但是IO模型这种纯理论的东西,我们能够使用到的很少,因为理论比较绕,反而会打击我们学习nginx的信心,所以,我们不准备在这里研究他们,我们只要知道一些相关概念名词即可。

那么下面,我们只是列出一些相关概念,如果现在不能理解这些概念,对学习使用nginx也没有太大的影响,当然我们还是建议先搞定httpd以后,再来研究nginx,在实际使用nginx以后,再回过头来理解这些概念,也是可以的。

首先,我们要明确以下概念

1、所有数据只有在内存中才能被使用。

2、内核使用的内存空间与用户进程使用的内存空间是分开的,内核所使用的内存是出于保护模式的,决不允许用户空间的进程直接随意的访问,我们可以称内核使用内存空间为内核空间,而每个用户空间进程又有自己的线性地址空间,也就是说,多个用户进程之间是隔离的,它们意识不到其他进程的存在,用户进程以为内存中只有它自己本身与内核。

 
 

当用户空间的进程需要操作数据时,通过系统调用想内核发起请求,内核需要将数据从硬盘中取得后加载到内核自己的内存空间中,然后将数据从内核内存中拷贝到用户进程对应内存空间中,用户进程才能使用对应的数据,这段话描述的就是一次IO请求的大概过程。

 
 

一次IO请求,都会由两阶段组成:

第一步:等待数据,即数据从磁盘到内核内存;

第二步:复制数据,即数据从内核内存到进程内存;

除了上述的大概过程,我们还要了解一些术语,这样方便我们更加详细的理解IO。

阻塞/非阻塞的概念:

阻塞和非阻塞的概念主要反映了调用者(用户进程)在等待结果返回之前所处的状态;

阻塞:blocking,调用结果返回之前,调用者被挂起;

非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起;

同步/异步的概念:

同步和异步的概念主要反映了被调用者消息通知机制;

消息通知:

同步:调用者等待被调用者返回消息;

异步:被调用者通过状态通知或回调机制通知 调用者,告诉调用者,被调用者的运行状态;

但是上述的 "阻塞/非阻塞" 和 "同步/非同步" 的概念往往不会分开说,经常会将他们组合到一起,比如   同步阻塞 或 同步非阻塞。

我们说回到Nginx,官网已经说明Nginx使用的是 "事件驱动异步架构的IO模型",所以,当我们在linux中使用Nginx时,我们要提到事件驱动模型在linux中的实现:epoll。

linux中,对event-driven(事件驱动模型)的实现称为epoll,所以,如果想让Nginx在Linux中能够愉快的运行,则需要确保linux中存在epoll的系统调用,而这个系统调用存在于libevent包中。

所以,对应Nginx的关键词为:事件驱动、异步、非阻塞。

 

Nginx的架构、特性、功能

从下图,可以看出Nginx的架构、功能、特性,当然,看不懂没关系,下图的大概意思就是nginx能当做web服务器,能做反代,了解即可。

Nginx从放弃到入门:Nginx概念(1)

 

Nginx的程序架构:

master/worker,类似于httpd的eventMPM

一个master进程:

负载加载配置文件、管理worker进程、平滑升级

一个或多个worker进程

处理并响应用户请求

缓存相关的进程:

cache loader:载入缓存对象

cache manager:管理缓存对象

 

Nginx的特性:异步、事件驱动、非阻塞

并发请求处理:通过kevent/epoll/select

文件IO:高级IO sendfile,异步,mmap

nginx高度模块块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载;

早期不支持动态装卸载模块。近期开始支持DSO(动态装卸载)机制了。使用load_module 来加载。

模块分类:

核心模块:core module

标准模块:

Standard HTTP modules

Optional HTTP modules

Mail modules

Stream modules

第三方模块:

3rd party modules

 

Nginx的功用:

静态的web资源服务器;

结合FastCGI/uwSGI/SCGI等协议反向代理动态资源请求;

http/https协议的反向代理;

imap4/pop3协议的反向代理;

tcp/udp协议的反向代理;

 

以上就是nginx的相关概念的一些总结,我们会在以后的文章中介绍如何实际使用nginx。

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:20   其中:访客  14   博主  6

    • avatar jerma 0

      已经看过博主很多文章了,每个系列都受益良多,博主辛苦了

        • avatar 朱双印 Admin

          @jerma 请继续保持~~哈哈~共勉~~

        • avatar Alex 1

          期待你的nginx系列的文章!加油!

          • avatar 小土豆 4

            为啥我不能选表情

              • avatar 朱双印 Admin

                @小土豆 评论框右下角就可以插入表情哦,表情是一些对应的代码,不用修改,直接发出就行了,小土豆常来,加油~~

              • avatar lbys 0

                哥 招小弟么 哈哈

                • avatar 秋酷 1

                  期待更新+100

                  • avatar Jackor 2

                    朱大大,求更哦~

                    • avatar vitus 0

                      博主,”Nginx是什么”这块最后讲到“事件驱动模型在linux的实现:epool”这句话的epool是不是”epoll”,还是epool也是一种模型?

                        • avatar 朱双印 Admin

                          @vitus 感谢客官指正,笔误已修改,常来~

                        • avatar 小生 0

                          坐等博主更新,最近一直在看你的博客,受益非浅啊 :mrgreen:

                          • avatar 我的电脑 3

                            :smile: 什么时候再更新nginx

                              • avatar 朱双印 Admin

                                @我的电脑 最近总是在加班,所以暂时没有空更新文章,请见谅,nginx应该会与http同时更新,因为http的东西比较多,所以暂时不会联系更新nginx,客官可以关注微信公众号,当有nginx的相关更新时,会第一时间得知的,加油~

                              • avatar Russell 0

                                博主,运用的文章什么时候写啊,

                                  • avatar 朱双印 Admin

                                    @Russell 因为httpd的文章还没有写,在考虑是不是httpd的文章和nginx的文章同步进行,还是先写httpd,再写nginx。
                                    它们的知识很多都是可以通用的,只是配置方面不同,但是前面的好多坑还没有填,准备填完这些坑,就开始写nginx和httpd的。
                                    客官可以关注”实用运维笔记”微信公众号,当有你想要阅读的文章发布时,会第一时间得知~

                                  • avatar echo 6

                                    希望博主 能把nginx系列更新起走
                                    话说回复表情我居然不会用

                                      • avatar 朱双印 Admin

                                        @echo 必须的,哈哈,在你写评论的时候,右侧有两个按钮,其中一个是个小笑脸,点那个就能添加表情 :mrgreen:

                                        • avatar drgcaosheng 4

                                          @echo 再次看到兄弟!哈哈

                                            • avatar echo 6

                                              @drgcaosheng 哈哈 反到是很久没看到你了