Nginx的底层工作原理

一、Nginx工作原理

  • nginx以高性能的负载均衡器,缓存,和web服务器闻名。
  • Nginx由内核和模块组成,当它接到一个HTTP请求时,仅仅通过查找配置文件将客户端请求映射到一个location block,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
  • 因此模块可以看做Nginx真正的劳动工作者。
  • 通常一个location中的指令会涉及一个handler模块和多个filter模块。
  • handler模块负责处理请求,完成响应内容的生成,
  • 而filter模块对响应内容进行处理。
  • Nginx的模块直接被编译进Nginx,因此属于静态编译方式。

二、什么是 FastCGI

  • FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。
  • 多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。
  • FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,安全性也很差,现在已经很少使用了。

三、Nginx+FastCGI运行原理

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。

四、Nginx+PHP-FPM

  • PHP-FPM是管理FastCGI的一个管理器,它作为PHP的插件存在,
  • Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,而这里的IP地址和端口就是FastCGI进程监听的IP地址和端口。

五.请解释 Nginx 如何处理 HTTP 请求?

  • 首先,Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在 Nginx 的 Master 进程里面先初始化好这个监控的Socket
  • 然后,再 fork出多个子进程出来。子进程会竞争 accept 新的连接。
  • 此时,客户端就可以向 nginx 发起连接了。
  • 当客户端与nginx进行三次握手,与 nginx 建立好一个连接后。
  • 此时,某一个子进程会 accept 成功,得到这个建立好的连接的 Socket ,
  • 然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。
  • 接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。
  • 最后,Nginx 或客户端来主动关掉连接,到此,一个连接就OK了。

六.Nginx 有哪些负载均衡策略?

负载均衡,即是代理服务器将接收的请求均衡的分发到各服务器中。
Nginx 默认提供了 3 种负载均衡策略:

  • 1、轮询(默认)round_robin
  • 2、IP 哈希 ip_hash
  • 3、最少连接 least_conn

七.请列举 Nginx 和 Apache 之间的不同点?

  • Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存
  • (线程要比进程小的多,所以 worker 支持比 perfork 高的并发),
  • 并发过大会榨干服务器资源。
  • Nginx: 采用单线程来异步非阻塞处理请求
  • 管理员可以配置 Nginx 主进程的工作进程的数量)(epoll),
  • 不会为每个请求分配 cpu 和内存资源,节省了大量资源,
  • 同时也减少了大量的 CPU 的上下文切换。所以才使得 Nginx 支持更高的并发。



PHP的底层工作原理

  • PHP 是解释型语言,其执行过程需先编译成中间代码,再经由特定的虚拟机,翻译成特定的指令被执行。
  • 其执行过程如下:PHP 代码 => Token => 抽象语法树 => Opcodes => 执行
  • PHP7 内核架构

cdn nginx 原理 nginx底层原理_PHP




Apache运行原理

cdn nginx 原理 nginx底层原理_PHP_02




MySQL运行原理

cdn nginx 原理 nginx底层原理_cdn nginx 原理_03

1.连接器管理、Mysql缓存、分析器、优化器、执行器

  • 1、连接器管理
  • 2、Mysql缓存
    mysql请求首先看缓存数据,key为sql语句value为查询的结果,如果存在则直接返回。如果没有则直接往下走。
    注意:mysql缓存对于一些静态数据比较适合,对于实时性高的数据最好不要使用。
  • 3、分析器
    对你执行的sql语句进行解析,首先是词法分析包括一些关键字识别,然后语法分析,查看这条语句是否符合mysql语句
  • 4、优化器
    通过你的语句分析,发现那些查询命中索引,还有表之间的连接顺序等
  • 5、执行器
    通过上面一系列的验证,使用引擎提供的接口。经过不断的执行将查询的结果存放在结果集中,通过explain可以看到执行器具体扫描了多少行。

2.redo log和binlog两个日志模块

  • redo log(InnoDB特有的日志模块) 重做日志文件,用于记录事务操作的变化,记录修改后的值,不管事务是否提交。保证数据的完整性
  • binlog 归档日志文件,用于记录对mysql数据库执行更改的所有操作。binlog是追加写,不会覆盖之前的。

3.sql语句的执行流程

update tb_area SET area_name = “beijing” WHERE area_id = 1

  • 首先执行器通过id查到这条记录(搜索树或者查找数据页) ,并加载到内存中。
  • 然后对这条记录的area_name调用引擎写入接口,进行修改。
  • 修改内存中的值,同时更新redolog告知执行器完成写入(状态置为prepare),可以提交事务,执行器将这条操作记录记录在binlog,写入磁盘
  • 完成上述一系列的操作,执行器调用事务提交接口(redolog状态置为commit),完成更新操作。
  • 注意:Mysql的redolog模块写入拆成2步走,prepare和commit,称为两阶段提交。
  • 整个过程为1、redolog的prepare状态 2、binlog的写入 3、redolog的commit状态,保证Mysql的可靠性。
  • 如果binlog没有写入并没有提交事务回滚
  • 如果binlog写入事务没提交,数据库回复后自动完成commit