Nginx 概述
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器。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网站用户有:百度BWS、新浪、网易、腾讯等
web 服务器 -- 高性能 --> 对比Apache 并发量高(5-10倍) --> 轻量级 --> 代码上
反向代理服务器
- 什么是代理 - 中间人 | 代替某个人去处理
- 正向代理 - 只能用于客户端 - 家里NAT共享上网(路由器) - 个人使用VPN -> 代理设备代替客户端发送请求,保护了客户端信息
- 反向代理 - 用于服务器 - 集群架构|缓存 - Nginx | squid等 -> 代理设备代替服务器进行请求的接收 -> 吧请求发送给真实服务器(RS),进而保护了RS的信息
-代理的作用是什么 --> 安全
Nginx官方网站
Nginx:http://nginx.org/
Mainline 主线版本 -- 奇数版本 - 开发&测试版本 --> 开发团队 - 二次开发
Stable 稳定版本 -- 偶数版本 - 稳定&生产 - 中小企业
Lengacy 历史版本 -- 偶数版本 - 稳定的
最新架构 - 选择最新稳定的 --> Nginx (中小企业源码 - 大企业yum) --> Nginx支持YUM安装-EPEL源
如何选择版本 --> 多个稳定 选谁? --> 1、具体业务 - 某个版本是否支持 --> 2、会选择距离现在半年左右的稳定版本 --> 3、两个稳定版本之间的检测(半年-1年)
了解Tengine
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。(可以这样理解:淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,但是由于Nginx官方相应慢或者不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循GPL的原则上进行二次开发,于是就出了现在的Tengine这个版本)。 - Tengine 适用于电商网站
LNMP工作原理
Nginx 本身只支持静态页面的处理,当客户端访问php页面的时候,nginx会将php转到php-fpm也处理,
php-fpm服务会把php页面解析成html文件给nginx处理,nginx返回给客户端处理
这里需要结合Apache的工作,对PHP文件处理过程的区别
1:Nginx是通过php-fpm这个服务来处理php文件
2:Apache是通过libphp5.so这个模块来处理php文件
Apache:
Nginx:
Apache的libphp5.so随着apache服务器一起运行,而Nginx和php-fpm是各自独立运行,所以在服务的运行过程中,Nginx和php-fpm都需要分别启动!
Nginx特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx相对于Apache优点如下:
- 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s,标准配置即可:CPU:8C,MEM:16G,Disk:600G(2*300G - SAS - RAID1或者 0);性能相当于Apache的5-10倍
- 负载均衡及反向代理性能非常强; CDN = 代理+缓存 = Nginx
- 系统内存和CPU占用率低;
- 可对后端服务进行健康检查; [后端的web服务器是否或者,不具备高可以]
- 支持PHP cgi方式和FastCGI方式;
- 可以作为缓存服务器、邮件代理服务器;
- 配置代码简洁且容易上手。
Nginx工作原理 -- 配置文件讲解
Nginx WEB服务器最主要就是各种模块的工作,模块从结构上分为核心模块、基础模块和第三方模块,其中三类模块分别如下:
- 核心模块:HTTP模块、EVENT模块和MAIL模块等;
- 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块;
- 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块、Limit_req模块等;
Nginx的模块从功能上分为如下三类。
- Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作,Handlers处理器模块一般只能有一个;
- Filters (过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出;
- Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件(nginx.conf)将客户端(用户)的请求映射到一个location block(配置段|区域),而location是Nginx配置中的一个指令,用于匹配用户访问的URL路径,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作,如图所示:
Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是Linux内核2.6以后才出现的,Nginx采用epoll模型,异步非阻塞,而apache采用的是select模型:
Select特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。
epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高。
Nginx默认以80端口监听在服务器上,并且启动一个master进程,同时有master进程生成多个工作进程,当浏览器发起一个HTTP连接请求,每个进程都有可能处理这个连接,怎么做到的呢?怎么保证同一时刻一个HTTP请求被一个工作进程处理呢。
首先每个worker进程都是从Master进程fork出来,在Master进程里面,建立好需要listen的socket(listenfd)之后,会fork出多个worker进程。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。
当一个worker进程在accept这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,再返回给客户端,最后才断开连接,这样形成一个完整的请求流程。如图14-2所示:
继续阅读

我的微信
这是我的微信扫一扫
评论