Nginx基础

本文详细介绍了Nginx的基础特性和功能,包括其高性能、高并发性的原因,如事件驱动的I/O和异步操作机制。Nginx采用多进程工作模型,由Master进程和Worker进程组成,Master进程管理配置和Worker进程,Worker进程负责处理用户请求。文章还涵盖了Nginx的安装方法,包括包管理器安装和源码编译安装的步骤。
摘要由CSDN通过智能技术生成

一.Nginx 介绍

1.1 Nginx 介绍

Nginx(读作"engine X" /ɛndʒɪnˈɛks/)是一个 web 服务器,也可以用作反向代理服务、
负载均衡器、邮件代理服务和 HTTP 缓存服务。该软件由俄罗斯的 Igor Sysoev 开发,
并于 2004 年首次公开发布。同名的 nginx 是一家成立于 2011 年的公司,为开源的
nginx 提供支持以及开发和维护另一款付费软件 Nginx plus。

Nginx 是一款免费的开源软件,根据类似于 BSD 的许可协议发布。大部分 web 服务器
都使用 NGINX 作为负载均衡器。

2019 年 3 月,Nginx 公司被 F5 Networks 以 6.7 亿美元收购。截至 2019 年 8 月,
Netcraft 估计 Nginx 为 32%的活跃网站提供服务,排名第一,略高于 Apache 的 29%

2020 年元旦这天我又看了一下,到目前为止,Netcraft 估计的各软件的占有率如下在这里插入图片描述
活动的网站中占有率如下
在这里插入图片描述
Nginx 历经⼗⼏年的迭代更新(https://nginx.org/en/CHANGES), ⽬前功能已经⾮常完善
且运⾏稳定,另外 Nginx 的版本分为开发版、稳定版和过期版,Nginx 以功能丰富著称,它
既可以作为 http 服务器,也可以作为反向代理服务器或者邮件服务器,能够快速的响应静态
⽹⻚的请求,⽀持 FastCGI/SSL/Virtual Host/URLRwrite/Gzip/HTTP Basic Auth/http
或者 TCP 的负载均衡等功能,并且⽀持第三⽅的功能扩展。

另外,其在响应静态资源请求时所消耗内存 apache 少得多,平均处理请求数量时候 apache
的四倍。且国内的各大一线互联网公司如天猫、淘宝、⼩⽶、网易 163、京东和新浪等都在用
nginx 或者进行二次开发,如淘宝的 Tengine 就是基于 nginx 的二次开发软件。

1.2 Nginx 功能介绍

1.2.1 基础特性

基础特性
模块化设计,具有较好的扩展性
⾼可靠性
⽀持热部署:不停机更新配置⽂件,升级版本和更换⽇志⽂件
低内存消耗:10000 个 keep-alive 连接模式下的⾮活动连接,仅需 2.5M 内存

自 2004 年发布以来,nginx 一直专注于高性能、高并发性和低内存使用。另外,
在 I/O 操作层面上,其支持 event-driven 事件驱动的 I/O,POSIX AIO1 异步 I/O
mmap 内存映射和 sendfile 机制等等加速 I/O 的特性。这些特性都是其性能远胜
apache 的原因。

基本功能
静态资源的 web 服务器
http 协议反向代理服务器
pop3/imap4 协议反向代理服务器
FastCGI(LNMP),uWSGI(python)等协议
模块化(⾮ DSO),需要编译,如 zip,SSL 模块

1.2.2 Nginx 与 web 服务相关的功能

主要功能
支持虚拟主机(server)
⽀持 keep-alive 和管道连接(利⽤⼀个连接做多次请求)
访问⽇志(⽀持⽇志缓冲提⾼其性能)
`url rewirte 支持 URL 重写
支持路径别名
基于 IP 及⽤⼾的访问控制
⽀持速率限制及并发数限制
重新配置和在线升级⽽⽆须中断客⼾的⼯作进程

二.Nginx 工作模型

2.1 Nginx 内部架构

Linux 内部架构文章参考

2.1.1 Nginx 的工作模型

一般的 WEB 服务器处理请求要么是以多进程的方式,要么是以多线程的方式。我们知道
apache 的 prefork 模型就是使用多个进程去处理请求;其 worker 模型就是多个进程
和多个线程处理请求。

多进程模型:服务器每接收到⼀个客⼾端请求就有服务器的主进程⽣成⼀个⼦进程响应客
⼾端,直到⽤⼾关闭连接,这样的优势是处理速度快,各⼦进程之间相互独⽴,但是如果
访问过⼤会导致服务器资源耗尽⽽⽆法提供请求。

多线程⽅式:与多进程⽅式类似,但是每收到⼀个客⼾端请求会有服务进程派⽣出⼀个线
程来个客⼾⽅进⾏交互,⼀个线程的开销远远⼩于⼀个进程,因此多线程⽅式在很⼤程度
减轻了 web 服务器对系统资源的要求,但是多线程也有⾃⼰的缺点,即当多个线程位于
同⼀个进程内⼯作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,另外
,⼀旦主进程挂掉则所有⼦线程都不能⼯作了,IIS 服务器使⽤了多线程的⽅式,需要间
隔⼀段时间就重启⼀次才能稳定。

其它的工作模式都是在这两种工作方式上延伸和改进的。

而 Nginx 采用了多进程的组织模型,Nginx 工作时有一个 Master 进程和多个 Worker
进程共同完成所有的服务。Master 进程的工作偏向服务本身的管理,Worker 进程则负责
处理用户请求。Master 进程和 worker 进程的调用过程如下图。
在这里插入图片描述

主进程(Master process)的功能:
读取 Nginx 配置⽂件并验证其有效性和正确性(nginx -t)
建⽴、绑定和关闭 socket 连接
按照配置⽣成、管理和结束⼯作进程
接受外界指令,⽐如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应⽤新的配置
开启⽇志⽂件,获取⽂件描述符
不中断服务,实现平滑升级,升级失败进⾏回滚处理
编译和处理 perl 脚本
工作进程(Worker process)的功能:
接受处理客⼾的请求
将请求依次送⼊各个功能模块进⾏处理
IO 调⽤,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调⽤缓存数据
发送请求结果,响应客⼾的请求
接收主程序指令,⽐如重启、升级和退出等

2.1.2 Nginx 进程与外部环境的交互

在这里插入图片描述
如上图,主进程主要是管理自身服务的相关事务,如加载配置文件、创建和回收 Worker
进程及提供不停机更新等功能。而负责处理请求的工作进程则会和更多的外部环境交互
,工作进程面对客户端时通过 HTTP/HTTPS 协议接收请求,作为反向代理服务时工作
进程使用 FastCGI 协议和 PHP 等程序交互、使用 HTTP 协议将请求转发给其它服务
器或者使用 memcache 标准和缓存数据库交互、亦或使用 uWSGI 协议与 Python 程序
交互。面对磁盘和 I/O 时,工作进程使用相关的模块和特性与系统内核提供的特性交互,
比如:使用系统调用 select()或 poll()来实现 I/O 多路复用,使用事件驱动的 I/O
模型或使用 Linux 内核 2.6 版本后提供的异步 I/O(AIO)等特性来加速和优化 I/O 操作。

Nginx 之所以在处理大量的用户请求和高并发场景下的性能远胜 apache,就是因为其
代码实现参考了操作系统的实现并大量使用了异步事务处理机制,nginx 的异步操作是
通过模块化、事件通知、大量使用回调函数和调优计时器来实现的。总的来说,关键
的原则是尽可能的不阻塞。在 I/O 操作方面所支持的多种高级模型就是最好的例子,
甚至支持只有 linux 提供的 AIO 机制(POSIX 标准)。

因为 nginx 不会为每个连接派生一个进程或线程,所以在大多数情况下,内存使用是非常
保守和高效的。这样一来 nginx 也节约了 CPU 周期,因为不存在进程或线程的创建和销
毁的开销。nginx 所做的大部分工作是检查网络相关(网络套接字)和存储相关(文件描述符
是否可以执行异步 I/O)的状态,初始化新的连接,将它们添加到主运行循环中,然后异步
处理,直到完成。请求处理完成后连接被释放并从运行循环中删除。通过谨慎的使用系统调
用和如 poll 等支持接口的精确实现以及,nginx 通常可以在极端工作负载下消耗较低的
CPU 使用率。

由于 nginx 的进程并不随请求的数量变化而变化,所以在配置 nginx 时可以将工作进程
和 CPU 的某个核心绑定来优化性能和增强稳定性。在不同的工作负载下可以规定工作进程
的数量和处理器核心的比例关系来最大化利用 CPU 的处理性能。例如:如果请求的任务为
CPU 密集型的,如大量处理 TCP/IPl 连接、处理 SSL 加密事务或压缩大量文件,那么可
以将 Worker 进程数量设置为和 CPU 核心相同;如果负载和 I/O 操作强相关,如写如(
或读取)大量的数据到存储设备、或是进行繁重的代理工作,那 Worker 进程可以是 CPU
核心数量的 1.5~2 倍。

nginx 服务启动工作时在内存中运行了多个进程。有一个主进程和几个工作进程,还有一些
特殊用途的进程,特别是缓存加载器和缓存管理器。nginx 所有进程主要使用共享内存机制
进行进程间通信。主进程使用 root 用户运行。缓存加载器、缓存管理器和 Worker 进程使
用非特权用户运行。

2.2 Nginx 的进程之间通讯

服务启动过程中 Nginx 的⼯作进程是由主进程⽣成的,主进程通过系统调用
fork()函数,在 Nginx 服务器启动过程中主进程根据配置⽂件决定启动⼯作
进程的数量,然后建⽴⼀张全局的⼯作表⽤于存放当前未退出的所有的⼯作进
程信息,主进程⽣成⼯作进程后会将新⽣成的⼯作进程加⼊到⼯作进程表中,
而后建⽴⼀个单向的管道并将其传递给⼯作进程,该管道与普通的管道不同,
它是由主进程指向⼯作进程的单项通道,包含了主进程向⼯作进程发出的指令
、⼯作进程 ID、⼯作进程在⼯作进程表中的索引和必要的⽂件描述符等信息。

主进程与外界通过信号机制进⾏通信,当接收到需要处理的信号时,它通过管
道向相关的⼯作进程发送正确的指令,每个⼯作进程都有能⼒捕获管道中的可
读事件,当管道中有可读事件的时候,⼯作进程就会从管道中读取并解析指令,
然后采取相应的执⾏动作,这样就完成了主进程与⼯作进程的交互。

另外,⼯作进程之间的通信原理基本上和主进程与⼯作进程之间的通信是⼀样的,
只要⼯作进程之间能够取得彼此的信息,建⽴管道即可通信,但是由于⼯作进程
之间是完全隔离的,因此⼀个进程想要知道另外⼀个进程的状态信息就只能通过
主进程来设置了。
为了实现⼯作进程之间的交互,主进程在⽣成⼯作进程之后,会在⼯作进程表中
进⾏遍历,将该新进程的 ID 以及针对该进程建⽴的管道句柄传递给⼯作进程中的
其他进程,为⼯作进程之间的通信做准备,当⼯作进程 1 向⼯作进程 2 发送指令的
时候,⾸先在主进程给它的其他⼯作进程信息中找到 2 的进程 ID,然后将正确的
指令写⼊指向进程 2 的管道,⼯作进程 2 捕获到管道中的事件后,解析指令并进⾏
相关操作,这样就完成了⼯作进程之间的通信。
在这里插入图片描述

2.3 Nginx 模块介绍

Nginx 可以在编译时加入很多提供特定功能的模块,随后也支持动态加载模块(DSO)
核⼼模块:是 Nginx 服务器正常运⾏ 必不可少 的模块,提供 错误⽇志记录、
配置⽂件解析、事件驱动机制、进程管理等核⼼功能。

标准 HTTP 模块:提供 HTTP 协议解析相关的功能,如端⼝配置、⽹⻚编码设置、
HTTP 响应头设置 等等。

可选 HTTP 模块:主要⽤于扩展标准的 HTTP 功能,让 Nginx 能处理⼀些特殊的
服务,⽐如: Flash 多媒体传输、解析 GeoIP 请求、⽹络传输压缩、安全协议
SSL ⽀持等。

邮件服务模块:主要⽤于⽀持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP
协议和 SMTP 协议的⽀持。

第三⽅模块:是为了扩展 Nginx 服务器应⽤,完成开发者⾃定义功能,⽐如:
Json ⽀持、 Lua ⽀持等。

nginx ⾼度模块化,但其模块早期不⽀持 DSO 机制;1.9.11 版本后⽀持动态装载
和卸载模块。

核⼼模块:core module
标准模块:
    HTTP 模块:  ngx_http_*
                 HTTP Core modules   默认功能
                 HTTP Optional modules 需编译时指定
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值