Nginx 介绍

什么是 Nginx?

  • Nginx 读作 “engine-ex”。
  • Nginx 是由俄罗斯程序员 Igor Sysoev 编写,2004年10月作为一个试图回答公众发布 C10K 问题。其中 C10k 是同时管理 10,000 个连接的挑战。Nginx 采用了事件驱动和异步架构,此设计使 Nginx 成为可扩展、高性能的服务器。
  • 它是一个开源、轻量级和高性能的 Web 服务器,也用作 HTTP、HTTPS、SMTP、IMAP、POP3 协议的反向代理服务器,另一方面,它也用作 IMAP、POP3 和 IMAP 的 HTTP 负载均衡器、HTTP 缓存和电子邮件代理。
  • 简而言之,我们可以说 Nginx 是一种用于处理并发请求的软件。

为什么要使用 Nginx?

Nginx 最重要的功能是反向代理和负载均衡,反向代理将允许我们在端口 80 上托管多个域名,同时使用不同的语言编写后端服务,负载均衡可以把多个提供相同功能的后端服务配置成彼此冗余。

Nginx 负责访问日志、黑名单、负载平衡和提供静态文件访问,后台 Web 服务则可专注于业务逻辑处理,Nginx 是动静分离架构的入口程序。

Nginx 支持高并发,内存占用小。

Nginx 支持配置文件动态修改。

Nginx 是如何工作的?

Nginx进程

nginx 在启动后,会以 daemon 的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程,worker 进程以非 root 用户运行,可以在配置文件中配置运行 worker 进程的用户。

master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。

worker 进程则是处理基本的网络事件。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。

总结其主要功能分别如下:

主进程(master process)的功能:

  1. 读取 Nginx 配置文件并验证其有效性和正确性
  2. 按照配置启动、管理和关闭工作进程
  3. 接受外界指令,比如重启、升级及关闭服务器等指令
  4. 不中断服务,实现平滑升级,重启服务并应用新的配置
  5. 开启日志文件

工作进程(woker process)的功能:

  1. 接收处理客户端的请求
  2. 将请求以此送入各个功能模块进行处理
  3. IO 调用,获取响应数据
  4. 与后端服务器通信,接收后端服务器的处理结果
  5. 缓存数据,访问缓存索引,查询和调用缓存数据
  6. 发送请求结果,响应客户端的请求
  7. 接收主程序指令,比如重启、升级和退出等


master 进程:负责加载和分析配置文件、管理 worker 进程,平滑升级
worker 进程:接收客户端请求、将请求一次送入各模块过滤、I/O 调用、数据缓存、发送响应
cache相关进程:cache loader (缓存索引重建)与 cache manager( 缓存索引管理)组成
--Cache loader 在 Nginx 服务启动后由主进程生成,根据本地磁盘上缓存建立索引元数据库后退出。
--Cache manager 在元数据更新完成后,对元数据是否过期做出判断。

Nginx的模块结构

Nginx 的各种功能和操作都由模块来实现。Nginx 由内核和一系列模块组成,内核提供web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。Nginx 的模块从结构上分为核心模块、基础模块和第三方模块。 

核心模块: HTTP 模块、EVENT 模块和 MAIL 模块 

基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块 

第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块。

这样的设计使 Nginx 方便开发和扩展,Nginx的模块默认编译进 nginx 中,如果需要增加或删除模块,需要重新编译 nginx,这一点不如 Apache 的动态加载模块方便,最新版本 Nginx 已经支持动态模块