## 简介
**Nginx是一个跨平台的Web服务器,可运行在Linux、FreeBSD、Solaris、AIX、Mac OS、 Windows等操作系统上**,并且它还可以使用当前操作系统特有的一些高效API来提高自己的性能
* 例如,对于高效处理大规模并发连接,**它支持Linux上的epoll**(epoll是Linux上处理大并 发网络连接的利器)、Solaris上的event ports和 FreeBSD上的kqueue等
* 又如,对于Linux,**Nginx支持其独有的sendfile系统调用**,这个系统调用可以高效地把硬 盘中的数据发送到网络上(不需要先把硬盘数据复制到用户态内存上再发送),这极大地减少了内核态与用户态数据间的复制动作
* 种种迹象都表明,**Nginx以性能为王**
* **Nginx的参考手册,在里面对每个模块都有介绍:**[http://nginx.org/en/docs/](http://nginx.org/en/docs/)
## 使用场景
1. 高性能的静态web服务器;
2. 反向代理(将请求转发到动态服务器);
3. 负载均衡;
## 与其他服务器的对比
* **来看看Nginx的竞争对手——Apache、Lighttpd、Tomcat、 Jetty、IIS**。它们都是Web服务器,或者叫做WWW(World Wide Web)服务器,相应地也都具备Web服务器的基本功能:基于REST架构风格,以统一资源描述符(URI)或者统一资源定位符(URL)作为沟通依据,通过HTTP为浏览器等客户端程序提供各种网络服务
* **由于这些Web服务器在设计阶段就受到许多局限,**例如当时的互联网用户规模、网络带宽、产品特点等局限,并且各自的定位与发展方向都不尽相同,**使得每一款Web服务器的特点与应用场合都很鲜明:**
* **Tomcat和Jetty面向Java语言**,先天就是重量级的Web服务器,它的性能与Nginx没有可比性,这里略过
* **IIS只能在Windows操作系统上运行**。Windows作为服务器在稳定性与其他一些性能上都 不如类UNIX操作系统,因此,在需要高性能Web服务器的场合下,IIS可能会被“冷落”
* **Apache的发展时期很长**,而且是目前毫无争议的世界第一大Web服务器。
* Apache有许多优点,如稳定、开源、跨平台等,但它出现的时间太长了,在它兴起的年代,互联网的产业规模远远比不上今天,所以它被设计成了一个重量级的、不支持高并发的 Web服务器。在Apache服务器上,如果有数以万计的并发HTTP请求同时访问,就会导致服 务器上消耗大量内存,**操作系统内核对成百上千的Apache进程做进程间切换也会消耗大量 CPU资源,并导致HTTP请求的平均响应速度降低,这些都决定了Apache不可能成为高性能 Web服务器,这也促使了Lighttpd和Nginx的出现**
* **Lighttpd和Nginx一样,都是轻量级、高性能的Web服务器**,欧美的业界开发者比较钟爱Lighttpd,而国内的公司更青睐Nginx,Lighttpd使用得比较少;
## Nginx的特点
> ### ①更快
>
> * 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应
> * 另一方面, 在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求
> ### ②高扩展性
>
> * Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极 低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须 在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理 完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新 的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不 同类型的模块,还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀 设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样 容易使用
> * Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都 是如此。这使得第三方模块一样具备极其优秀的性能,充分利用Nginx的高并发特性,因 此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
> ### ③高可靠性
>
> * 高可靠性是我们选择Nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多 家高流量网站都在核心服务器上大规模使用Nginx。Nginx的高可靠性来自于其核心框架代码 的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程 相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务
> ### ④低内存消耗
>
> * 一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这 是Nginx支持高并发连接的基础
> ### ⑤单机支持10万以上的并发连接
>
> * 这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大 公司、网站都需要应付海量并发请求,一个能够在峰值期顶住10万以上并发请求的Server, 无疑会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。 当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的
> ### ⑥热部署
>
> * master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以 在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就 更新配置项、更换日志文件等功能
> ### ⑦最自由的BSD许可协议
>
> * 这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它 还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。这吸引了无数开发者继 续为Nginx贡献自己的智慧
* 以上7个特点当然不是Nginx的全部,拥有无数个官方功能模块、第三方功能模块使得 Nginx能够满足绝大部分应用场景,这些功能模块间可以叠加以实现更加强大、复杂的功 能,有些模块还支持Nginx与Perl、Lua等脚本语言集成工作,大大提高了开发效率。这些特 点促使用户在寻找一个Web服务器时更多考虑Nginx;
## 总结
* 当然,选择Nginx的核心理由还是它能在支持高并发请求的同时保持高效的服务。
* 如果Web服务器的业务访问量巨大,就需要保证在数以百万计的请求同时访问服务时, 用户可以获得良好的体验,不会出现并发访问量达到一个数字后,新的用户无法获取服务, 或者虽然成功地建立起了TCP连接,但大部分请求却得不到响应的情况
* 通常,高峰期服务器的访问量可能是正常情况下的许多倍,若有热点事件的发生,可能 会导致正常情况下非常顺畅的服务器直接“挂死”。然而,如果在部署服务器时,就预先针对 这种情况进行扩容,又会使得正常情况下所有服务器的负载过低,这会造成大量的资源浪 费。因此,我们会希望在这之间取得平衡,也就是说,在低并发压力下,用户可以获得高速 体验,而在高并发压力下,更多的用户都能接入,可能访问速度会下降,但这只应受制于带 宽和处理器的速度,而不应该是服务器设计导致的软件瓶颈
* 事实上,由于中国互联网用户群体的数量巨大,致使对Web服务器的设计往往要比欧美 公司更加困难。例如,对于全球性的一些网站而言,欧美用户分布在两个半球,欧洲用户活 跃时,美洲用户通常在休息,反之亦然。而国内巨大的用户群体则对业界的程序员提出更高 的挑战,早上9点和晚上20点到24点这些时间段的并发请求压力是非常巨大的。尤其节假 日、寒暑假到来之时,更会对服务器提出极高的要求
* 另外,国内业务上的特性,也会引导用户在同一时间大并发地访问服务器。例如,许多 SNS网页游戏会在固定的时间点刷新游戏资源或者允许“偷菜”等好友互动操作。这些会导致 服务器处理高并发请求的压力增大
* 上述情形都对我们的互联网服务在大并发压力下是否还能够给予用户良好的体验提出了 更高的要求。若要提供更好的服务,那么可以从多方面入手,例如,修改业务特性、引导用 户从高峰期分流或者把服务分层分级、对于不同并发压力给用户提供不同级别的服务等。但 最根本的是,Web服务器要能支持大并发压力下的正常服务,这才是关键
* 快速增长的互联网用户群以及业内所有互联网服务提供商越来越好的用户体验,都促使 我们在大流量服务中用Nginx取代其他Web服务器。Nginx先天的事件驱动型设计、全异步的 网络I/O处理机制、极少的进程间切换以及许多优化设计,都使得Nginx天生善于处理高并发 压力下的互联网请求,同时Nginx降低了资源消耗,可以把服务器硬件资源“压榨”到极致
- NginX简述
- 什么是中间件
- NginX概述
- 选择NginX的理由
- NginX环境安装
- 四项确认
- NginX安装
- 安装
- 安装目录详解
- 编译参数详解
- Nginx主目录
- 基于NginX的中间件架构
- Nginx日志类型
- Nginx变量
- 常见NginX中间架构
- 静态资源web服务
- 概述
- 静态资源服务场景-CDN
- 浏览器缓存原理
- 跨站访问
- 防盗链
- 代理服务
- 概述
- 配置语法
- 其他配置语法
- 负载均衡调度器SLB
- 概述
- 配置
- 动态缓存
- ====分割线====
- Nginx初体验
- nginx简介
- 请求全流程
- nginx核心优势
- 安装第一个rpm包nginx
- Nginx进程结构与热部署
- 进程结构
- 信号量管理nginx
- 配置文件重载原理真相
- nginx热部署
- nginx模块化管理机制
- nginx编译安装的配置参数
- nginx配置文件结构
- 虚拟主机的分类
- Nginx核心指令基础应用
- main段核心参数用法
- events段核心参数用法
- HTTP段核心参数用法
- server_name
- server_name指令用法优先级
- root和alias的区别
- location的基础用法
- location指令中匹配规则的优先级
- 深入理解location中URL结尾的反斜线
- stub_status模块用法
- Nginx应用进阶
- connection和request
- 对connection做限制的limit_conn模块
- 对request处理速率做限制的limit_req模块
- 限制特定IP或网段访问的access模块
- 限制特定用户访问的auth_basic模块
- 基于HTTP响应状态码做权限控制的auth_request模块
- rewrite模块
- return指令
- rewrite指令
- return和rewrite指令执行顺序
- if指令
- autoindex模块用法
- Nginx的变量
- 变量分类
- TCP连接相关变量
- 发送HTTP请求变量
- 处理HTTP请求变量
- 反向代理
- 基础原理
- 动静分离
- nginx作为反向代理支持的协议
- 用于定义上游服务的upstream模块
- upstream模块指令用法详解
- 配置一个可用的上游应用服务器
- proxy_pass常见误区
- 代理场景下nginx接受用户请求包体的处理方式
- 代理场景下Nginx更改发往上游的用户请求
- 代理场景下Nginx与上游服务建立连接细节
- 基于fastcgi的反向代理
- 负载均衡
- 负载均衡基础
- 实现nginx对上游服务负载均衡
- 负载均衡hash算法
- 负载均衡ip_hash算法
- 负载均衡最少连接数算法
- 针对上游服务器返回异常时的容错机制
- Nginx缓存
- 缓存基础
- 缓存相关指令
- 缓存用法配置示例
- 配置nginx不缓存上游服务特定内容
- 缓存失效降低上游压力机制1-合并源请求
- 缓存失效降低上游压力机制2-启用陈旧缓存
- 第三方清除模块ngx_cache_purge介绍
- ngx_cache_purge用法配置示例
- Nginx和HTTPS
- https原理基础
- https如何解决信息被窃听的问题
- https如何解决报文被篡改以及身份伪装问题
- 配置私有CA服务器
- 组织机构向CA申请证书及CA签发证书
- 深入Nginx架构
- Nginx性能优化