1.Nginx(engine-x)由俄罗斯开发者Igor Sysoev开发,最初于2004年发布,主要用于解决C10K问题(即同时处理上万个并发连接)。其设计目标是实现高并发、低延迟以及高效利用硬件资源。Nginx不仅是一个静态内容服务器,还支持动态脚本语言如PHP、Python等,并具备负载均衡、缓存、重写URL等功能。
-
一款高新能、轻量级Web服务软件
-
稳定性高
-
系统资源消耗低
-
对HTTP并发连接的处理能力高
-
单台物理服务器可支持30 000~50 000个并发请求
2. 与Apache比较
Apache:同步多进程模型:一个连接对应一个进程(高稳定)
1.rewrite更强大(rewrite主要功能是实现统一资源定位符URL的跳转)
2.模块多,基本想到的都可以找到
3.少bug,更加稳定(nginx相对较多)
4.PHP支持比较简单(nginx需要配合其他后端用)
5.处理动态请求更有优势(nginx更适合静态与反向)
Nginx:异步非阻塞模型:多个连接(万级别)对应一个进程(高性能)
1.轻量级,采用C编写,占用更少的内存与资源
2.抗并发/高并发,以epoll and kqueue 作为开发模型,负载能力高,高并发下能够保持 低资源低消耗高性能(apache在PHP处理慢或前端压力很大时,容易出现进程数飙升 从而拒绝服务)
3.处理静态文件好,静态处理性能比apache高三倍以上
4.设计高度模块化,编写模块相对简单
5.配置简洁,正则配置更简单,且更改完可以使用 -t 测试(apache配置复杂,重启时发 现出错,会很崩溃)
6.作为负载均衡服务器,支持七层负载均衡,可以有效防止ddos攻击
7.本身是一个反向代理服务器,也可以作为邮件代理服务器使用
8.支持热部署,支持在线升级
3.工作场景
正向代理: 代理的客户端
通过代理服务器来访问服务器的过程 就叫 正向代理。
需要在客户端配置代理服务器进行指定网站访问
反向代理: 代理的服务端
客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,只需要把请求发送给反向代理服务器反向代理服务器去选择目标服务器获取数据后,再返回给客户端,反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。
影响用户体验的因素
-
#客户端
-
客户端硬件配置
-
客户端网络速率
-
客户端与服务端距离
-
#服务器
-
服务端网络速率
-
服务端硬件配置
-
服务端架构设计
-
服务端应用程序工作模式
-
服务端并发数量
-
服务端响应文件大小及数量 buffer cache
-
服务端I/O压力
3.常用功能
负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
Nginx给出来三种关于负载均衡的方式:
轮询法(默认方法)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
weight权重模式(加权轮询)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
ip_hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
web缓存
Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。
4.基础特性
-
模块化设计,较好的扩展性
-
高可靠性
-
支持热部署:不停机更新配置文件,升级版本,更换日志文件
-
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
-
event-driven, aio, mmap,sendfile
5.Web 服务相关的功能
-
虚拟主机(server)
-
支持 keep-alive 和管道连接(利用一个连接做多次请求)
-
访问日志(支持基于日志缓冲提高其性能)
-
url rewirte
-
路径别名
-
基于IP及用户的访问控制
-
支持速率限制及并发数限制
-
重新配置和在线升级而无须中断客户的工作进程
6.Nginx 进程结构
-
web请求处理机制
-
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
-
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
-
主进程(master process)的功能:
对外接口:接收外部的操作(信号) 对内转发:根据外部的操作的不同,通过信号管理 Worker 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程 读取Nginx 配置文件并验证其有效性和正确性 建立、绑定和关闭socket连接 按照配置生成、管理和结束工作进程 接受外界指令,比如重启、升级及退出服务器等指令 不中断服务,实现平滑升级,重启服务并应用新的配置 开启日志文件,获取文件描述符 不中断服务,实现平滑升级,升级失败进行回滚处理 编译和处理perl脚本
工作进程(worker process)的功能:
所有 Worker 进程都是平等的 实际处理:网络请求,由 Worker 进程处理 Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源, 增加上下文切换的损耗 接受处理客户的请求 将请求依次送入各个功能模块进行处理 I/O调用,获取响应数据 与后端服务器通信,接收后端服务器的处理结果 缓存数据,访问缓存索引,查询和调用缓存数据 发送请求结果,响应客户的请求 接收主程序指令,比如重启、升级和退出等
7.nginx 模块
-
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
-
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
-
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
-
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
-
Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向
-
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
核心模块:core module标准模块:HTTP 模块: ngx_http_*HTTP Core modules #默认功能HTTP Optional modules #需编译时指定Mail 模块: ngx_mail_*Stream 模块 ngx_stream_*第三方模块