Nginx面试题
Nginx是一个高性能的HTTP和反向代理服务器,及电子邮件代理服务器,同时也可以作为反向代理服务器来实现负载均衡。
二、为什么要使用Nginx?
因为Nginx具有跨平台、配置简单、非阻塞、高并发连接等特点!
Nginx的优势:
- 内存消耗小:开启10个Nginx才占150M内存,Nginx处理静态文件好,耗费内存小;
- 内置的健康检查功能:如果有一个服务器宕机,Nginx会将这台宕机的服务器移出集群;
- 节省带宽:支持Gzip压缩,可以添加到浏览器本地进行缓存;
- 稳定性高:宕机的概率非常小;
- 接收用户请求是异步的(采用epoll模型):浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力,一边接收web服务器的返回数据,一边发送给浏览器客户端, 网络依赖性比较低,只要ping通就可以负载均衡,可以有多台nginx服务器 使用dns做负载均衡,事件驱动;
三、Nginx的功能?
主要功能:
- 可以作为Web服务器(代替Apache,对PHP需要fastcgi处理器支持);
- 可以作为反向代理服务器;
- 可以实现负载均衡;
- 可以配置虚拟主机;
- fastcgi:Nginx本身不支持PHP等语言,但是它可以通过fastcgi来将请求转交到某些语言或框架处理;
四、Nginx是如何实现高并发的?
Nginx服务主要由一个master进程和多个work进程,而work进程就是用来处理客户端请求。
当一个客户端请求到达Nginx服务器时,这时Nginx服务会调用work进程来处理客户端的请求,但不是全程处理,处理可能发生阻塞的地方,比如向后端服务器转发客户端请求,并不会等待请求返回。那么此时这个处理的work进程会继续处理其他的请求,一旦后端服务器返回结果后,就会触发这个事件,work进程才会接收并将返回结果转交到客户端。
五、Nginx如何处理惊群问题?
惊群简单来说就是多个进程或线程都在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上降低了系统性能。
Nginx处理惊群的大致思路:不让多个进程在同一时间监听接受连接的socket,而是让每个进程轮流监听,这样当有连接到达时,就只有一个进程在监听那肯定就不会存在惊群的问题。
具体的做法:利用一把进程间锁,每个进程中都尝试获得这把锁,如果获取成功监听socket加入wait集合中,并设置超时时间等待连接到来,没有获得锁的进程则将监听socket从wait集合中去除。
六、为什么Nginx性能这么高?
主要是因为它的事件处理机制:异步非阻塞事件处理机制:应用了epoll模型,提供了一个队列,排列解决。
七、Nginx是如何处理一个请求的?
首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面先初始化好这个监控的socket,再进行listen,然后再fork出多个子进程出来, 子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体,接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就处理完成了!
八、Nginx的负载均衡算法有哪些?
nginx的upstream目前支持四种方式的分配:
- 轮询:每个请求按照时间顺序逐一分配到不同的后端服务器中,如果后端服务器发生故障,将自动去除;
- weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的场景;
- ip_hash:每个请求按访问的ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话的问题;
- fair(第三方):根据后端服务器的响应时间来分配请求,响应时间短的优先分配;
- url_hash(第三方):根据URL的hash结果分配;+
九、Nginx与Apache的区别?
Nginx与Apache相比有以下优势:
- 轻量级:同样起web 服务,比apache 占用更少的内存及资源;
- 抗并发:nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;
- 高度模块化的设计:编写模块相对简单;
- 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程;
- 处理静态页面的速度至少是Apache的三倍以上;
一般来说,需要性能的 web 服务,使用 nginx ;如果不需要性能只求稳定,更考虑 apache !
十、fastcgi与cgi的区别?
cgi:
web服务器会根据请求的内容,然后会fork一个新进程来运行外部c程序(或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。
fastcgi:
web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
十一、从哪些方面来对nginx进行优化?
- 配置nginx的proxy缓存;
- 对静态页面开启压缩功能,如br压缩或者gzip压缩;
- 调整nginx运行工作进程个数,最多开启8个,8个以上话性能就不会再提升了,而且稳定性变得更低,所以8个足够用了;
- 调整nginx运行CPU的亲和力;
- 修改nginx最多可打开的文件数,若超过系统限制的最多打开文件数(ulimit -n命令查看系统的最多打开文件数),还需要修改系统默认的文件数;
- 修改单个worker的最大连接数;
- 开启高效传输;
- 设置连接超时时间,以便保护服务器资源,因为建立连接也是需要消耗资源的;
- 优化fastCGI的一个超时时间,也可以根据实际情况对其配置缓存动态页面;
- expires缓存调优,主要针对图片、css、js等元素更改较少的情况下使用。
- 配置防盗链;
- 优化内核参数,如进程可以同时打开的最大句柄数;
具体内容可以参考nginx面试题
———————— 本文至此结束,感谢阅读 ————————