Nginx基础知识介绍
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Nginx概述
Nginx是免费的、开源的、高性能的HTTP和正向/反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器。
Nginx官网:
http://nginx.org nginx的其它的二次发行版:
Tengine:
由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。
它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
从2011年12月开始,Tengine成为一个开源项目,官网 http://tengine.taobao.org/
OpenResty:
基于Nginx与Lua语言的高性能Web平台。章亦春带领开发,官网:http://openresty.org/cn/ Nginx解决C10K问题(10K Connections):
http://www.ideawu.net/blog/archives/740.html
二.Nginx功能介绍
Nginx早期核心功能:
静态的web资源服务器html,图片,js,css,txt等静态资源
结合FastCGI(交给php程序处理)/uWSGI(交给python程序处理)/SCGI等协议反向代理动态资源请求
http/https协议的反向代理
imap4/pop3协议的反向代理
tcp/udp协议的请求转发(反向代理)
1>.基础特性
特性:
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
event-driven,aio,mmap,sendfile
基本功能:
静态资源的web服务器
http协议反向代理服务器
pop3/imap4协议反向代理服务器
FastCGI(LNMP),uWSGI(python)等协议
模块化(非DSO),如zip,SSL模块
2>.和web服务相关的功能
虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
三.Nginx组织结构
web请求处理机制:
()多进程方式:
服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
()多线程方式:
与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间(一般2-3个月左右)就重启一次才能稳定。
1>.组织模式
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
主进程(master process)的功能:
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本 工作进程(woker process)的功能:
接受处理客户的请求
将请求以此送入各个功能模块进行处理
IO调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
2>.进程间通信
工作进程是有主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单项通道,包含了主进程向工作进程发出的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。接受处理客户的请求将请求以此送入各个功能模块进行处理IO调用,获取响应数据与后端服务器通信,接收后端服务器的处理结果缓存数据,访问缓存索引,查询和调用缓存数据发送请求结果,响应客户的请求接收主程序指令,比如重启、升级和退出等 工作进程之间的通信原理基本上和主进程与工作进程之间的通信是一样的,只要工作进程之间能够取得彼此的信息,建立管道即可通信,但是由于工作进程之间是完全隔离的,因此一个进程想要直到另外一个进程的状态信息就只能通过主进程来设置了。
为了实现工作进程之间的交互,主进程在生成工作进程只之后,在工作进程表中进行遍历,将该新进程的ID以及针对该进程建立的管道句柄传递给工作进程中的其他进程,为工作进程之间的通信做准备,当工作进程1向工作进程2发送指令的时候,首先在主进程给它的其他工作进程工作信息中找到2的进程ID,然后将正确的指令写入指向进程2的管道,工作进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了工作进程之间的通信。
四.Nginx模块介绍
核心模块:
是Nginx服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能 标准HTTP模块:
提供HTTP协议解析相关的功能,比如:端口配置、网页编码设置、HTTP响应头设置 等等 可选HTTP模块:
主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,比如:Flash多媒体传输、解析GeoIP请求、网络传输压缩、安全协议SSL支持等 邮件服务模块:
主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持 第三方模块:
是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如:Json支持、Lua支持等
官方还有有很多支持nginx模块这里没有列出来,如下图所示。 博主推荐阅读:
http://nginx.org/en/docs/
五.Nginx版本选择
1>.nginx的官方文档
博主推荐阅读:
https://nginx.org/en/CHANGES
2>.nginx的版本选择
以"nginx-1.14.2"版本为例:
nginx表示产品名称
1.14.2表示对应的版本号,.14表示对应的大版本号,而后面的2表示该版本已经被更新过3次了,即1.14.0,1.14.,1.14.。
生产环境中我们建议大家使用长期支持版本
本次nginx项目介绍均基于nginx1..2版本介绍。
一般情况下,长期支持版"Legacy versions"已经符合大多数企业使用了,除非你用到了特别新的功能,那就得根据相应版本编译安装了。 博主推荐阅读:
http://nginx.org/en/download.html
3>.nginx的官方文档
博主推荐阅读:
http://nginx.org/en/docs/
4>.下载预编译好的安装包(一般用于rpm/yum方式安装)
博主推荐阅读:
http://nginx.org/en/linux_packages.html
六.Nginx安装
博主推荐阅读:
https://www.cnblogs.com/yinzhengjie/p/12031651.html