1.nginx通信模块?
Nginx Web服务器主要就是各种模块的工作。因此我们需要了解各种模块的大致功能及其分类。
一、模块分类及其作用
1、核心模块:HTTP模块、EVENT模块和MAIL模块等;
HTTP 模块:用来发布http web服务网站的模块。
event模块:用来处理nginx 访问请求,并进行回复。
mail 模块 :负责邮箱处理和发布的。
2、基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块;
HTTP Access模块: 用来进行虚拟主机发布访问模块,起到记录访问日志。
虚拟主机:nginx 中每一个虚拟主机就代表一个或者多个网站。
HTTP FastCGI模块:用于和PHP程序进行交互的模块,负责将来访问nginx 的PHP请求转发到后端的PHP上。
HTTP Proxy模块:配置反向代理转发的模块,负责向后端传递参数。
HTTP Rewrite模块:支持Rewrite 规则重写,支持域名跳转。
3、第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块、Limit_req模
块、Upstream check module等;
HTTP Upstream Request Hash模块:利用hash 算法进行负载均衡的模块。
HTTP Access Key模块:http 请求访问校验模块
Limit_req模块: http 请求限制模块
2.nginx为啥能高并发?
答:1.多进程
(1、Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
2、接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
3、 master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。)
2.IO多路复用
3.redis缓存失效策略?
缓存失效策略(FIFO 、LRU、LFU三种算法的区别)
当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据。常用的淘汰算法有下面几种:
FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。
4.分布式事务?
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,
分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
5.Kafka的ack机制?
Kafka的ack机制,指的是producer的消息发送确认机制,这直接影响到Kafka集群的吞吐量和消息可靠性。而吞吐量和可靠性就像硬币的两面,
两者不可兼得,只能平衡。
ack有3个可选值,分别是1,0,-1。
ack=1,简单来说就是,producer只要收到一个分区副本成功写入的通知就认为推送消息成功了。这里有一个地方需要注意,
这个副本必须是leader副本。只有leader副本成功写入了,producer才会认为消息发送成功。
ack=0,简单来说就是,producer发送一次就不再发送了,不管是否发送成功。
ack=-1,简单来说就是,producer只有收到分区内所有副本的成功写入的通知才认为推送消息成功了。
6.FastCGI是什么?
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要 行为是将CGI解释器进程保持在内存中并因此获得较高的性能。
众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存 中并接受FastCGI进程管理器调度,
则可以提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI的工作原理是:
1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。
Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,
请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。
在正常的CGI模式中,php-cgi.exe在此便退出了。
7.redis和memecache的区别?
1.Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,
通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。
在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。
2.内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,
由于其组合式的压缩,其内存利用率会高于Memcached。
3.性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。
而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,
但是比起Memcached,还是稍有逊色。
8.PHP7为什么比5快?
性能提升的原因?
1、存储变量的结构体变小,尽量使结构体里成员共用内存空间,减少引用,这样内存占用降低,变量的操作速度得到提升。
2、字符串结构体的改变,字符串信息和数据本身原来是分成两个独立内存块存放,php7尽量将它们存入同一块内存,提升了cpu缓存命中率。?
3、数组结构的改变,数组元素和hash映射表在php5中会存入多个内存块,php7尽量将它们分配在同一块内存里,降低了内存占用、
提升了cpu缓存命中率。
4、改进了函数的调用机制,通过对参数传递环节的优化,减少一些指令操作,提高了执行效率。
为什么PHP7的性能可以提高这么多?
- JIT
- Zval的改变
- 内部类型zend_string
- PHP数组的变化(HashTable和Zend Array)
- 函数调用机制(Function Calling Convention)
- 通过宏定义和内联函数(inline),让编译器提前完成部分工作