Nginx(engine X)是一个轻量级的Web服务器,它能反向代理服务器及电子邮件代理服务器,在一个BSD-like协议下发行,由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,Nginx相较于Apache具有占有内存少,并发能力强等优势。nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。
在2002年,lgor Sysoev开始开发Nginx。他开发Nginx的目的是为了解决C10K问题,所谓C10K问题,指让服务器可以同时处理一万次并发请求。Nginx在2004年发布了第一个正式版本,它使用异步,事件驱动架构。
Nginx的官方站点:nginx.org
Nginx比较有名的两个开发版Openresty和Tengine
Nginx特性:
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲;
- 无缓存的反向代理加速,简单的负载均衡和容错;
- FastCGI,简单的负载均衡和容错;
- 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待;
- 支持SSL和TLSSNI;
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率。它支持内核Poll模型,能经受高负载的考验,官方测试报告表明能支持高达5万个并发连接数,而在实际的运作中,是可以支持二万至四万个并发连接。
Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持1万个没有活动的连接,它只占2.5M内存,就稳定性而言,nginx比lighthttpd更胜一筹。
Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
Nginx与Apache、Lighttpd的比较:
|----------|-------|--------|----------| | server | Nginx | Apache | Lighttpd | | Proxy | 非常好 | 非常好 | 一般 | | Rewriter | 非常好 | 好 | 一般 | | Fcgi | 好 | 不好 | 非常好 | | 热部署 | 支持 | 不支持 | 不支持 | | 系统压力比较 | 很小 | 很大 | 比较小 | | 稳定性 | 非常好 | 好 | 不好 | | 安全性 | 一般 | 好 | 一般 | | 技术支持 | 很少 | 非常好 | 一般 | | 静态文件处理 | 非常好 | 一般 | 好 | | 反向代理 | 非常好 | 一般 | 一般 |
在相对比较大的网站,节约下来的服务器成本无疑是客观的。而有些小型网站往往服务器不多,如果采用Apache这类传统Web服务器,似乎也还能撑过去。但有其很明显的弊端:Apache在处理流量爆发的时候很容易过载,这样的情况下采用Nginx最为合适;
建议方案:
Apache 后台服务器(主要处理php及一些功能请求)
Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)
Lighttpd 图片服务器
Nginx程序架构:
传统的基于进程和线程的模型在处理并发连接的时候针对每个连接会调用一个独立的进程或线程,并且阻塞在网络或I/O操作上面。根据应用程序的不同,它们对内存和CPU的使用效率非常低。产生一个新的进程或线程需要一个新的运行时环境,包括堆和栈的分配,以及运行时的上下文。因此需要额外的CPU开销来创建这些环境,过多的线程以及上下文切换最终会导致性能的下降。所有这些状况在Apache上都可以见到。因此,这是一个在提供丰富普遍适用的功能特性以及服务器资源优化之间的权衡。
早些时候,Nginx希望为动态增长的网站获得更好的性能,并且密集高效的使用服务器资源,所以其使用了另外一个模型。它实际上受到了不断发展的在不同操作系统上开发高级事件驱动的启发,最终一个模块化,事件驱动,异步,单线程,非阻塞的架构成为Nginx代码的基础。
Nginx大量使用多路复用和事件通知,并且给不同的进程分配不同的任务。数量有限的单线程进程(Worker)高效的循环处理连接。每个worker进程每秒可以处理数千个并发连接和请求。
Nginx架构图:
Nginx分为Master/Worker两级结构,Master进程负责加载配置文件、管理worker进程、平滑升级、创建,绑定并关闭套接字启动子进程等,开始、终止保持配置中的worker进程数目;在线升级更新配置,日志文件更替;一个或多个Worker进程负责处理并响应用户请求,提供核心功能,反代,负载均衡等绝大多数功能;缓存加载进程负责检测磁盘上的缓存项并填充Nginx内存数据库。本质上缓存加载进程替Nginx提供一个存储在磁盘上的目录结构中的文件实例。
Nginx使用量了event模型和异步IO机制,多请求进程处理和对于专门硬件的加速IO过程,加速了相应处理过程,能够轻松处理数以万计的请求。
Nginx的模块类型:
核心模块:core module
标准模块:
Standard HTTP modules 标准http模块
Optional HTTP modules 其他可选的http模块
Mail modules 邮件模块
Stream modules 流模块
3rd party modules(第三方模块)