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 内核架构
Apache运行原理
MySQL运行原理
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