起源:toutiao.com/i6698255904053133827
这是一位读者带回来的面试题
Nginx 是如何实现并发的?为什么 Nginx 不应用多线程?Nginx常见的优化伎俩有哪些?502谬误可能起因有哪些?
面试官心理剖析
次要是看应聘人员的对NGINX的基本原理是否相熟,因为大多数人多多少少都懂点NGINX,然而真正其明确原理的可能少之又少。明确其原理,能力做优化,否则只能照样搬样,出了问题也无从下手。
懂皮毛的人,个别会做个 Web Server,搭建一个 Web 站点;高级运维可能搞个 HTTPS 、配置一个反向代理; 中级运维定义个 upstream、写个正则判断;老鸟做个性能优化、写个ACL,还有可能改改源码(小编示意没有改源码的能力)。
面试题分析
Nginx 是如何实现高并发的?
异步,非阻塞,应用了epoll 和大量的底层代码优化。
如果一个server采纳一个过程负责一个request的形式,那么过程数就是并发数。失常状况下,会有很多过程始终在期待中。
而nginx采纳一个master过程,多个woker过程的模式。
- master过程次要负责收集、散发申请。每当一个申请过去时,master就拉起一个worker过程负责解决这个申请。
- 同时master过程也负责监控woker的状态,保障高可靠性
- woker过程个别设置为跟cpu外围数统一。nginx的woker过程在同一时间能够解决的申请数只受内存限度,能够解决多个申请。
- Nginx 的异步非阻塞工作形式正把当中的等待时间利用起来了。在须要期待的时候,这些过程就闲暇进去待命了,因而体现为少数几个过程就解决了大量的并发问题。
每进来一个request,会有一个worker过程去解决。但不是全程的解决,解决到什么水平呢?解决到可能产生阻塞的中央,比方向上游(后端)服务器转发request,并期待申请返回。那么,这个解决的worker很聪慧,他会在发送完申请后,注册一个事件:“如果upstream返回了,通知我一声,我再接着干”。于是他就劳动去了。
此时,如果再有request 进来,他就能够很快再按这种形式解决。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。
为什么 Nginx 不应用多线程?
Apache: 创立多个过程或线程,而每个过程或线程都会为其调配 cpu 和内存(线程要比过程小的多,所以worker反对比perfork高的并发),并发过大会耗光服务器资源。
Nginx: 采纳单线程来异步非阻塞解决申请(管理员能够配置Nginx主过程的工作过程的数量)(epoll),不会为每个申请调配cpu和内存资源,节俭了大量资源,同时也缩小了大量的CPU的上下文切换。所以才使得Nginx反对更高的并发。
Nginx常见的优化配置有哪些?
1)调整worker_processes
指Nginx要生成的worker数量,最佳实际是每个CPU运行1个工作过程。
理解零碎中的CPU外围数,输出
$ grep processor / proc / cpuinfo | wc -l
2)最大化worker_connections
Nginx Web服务器能够同时提供服务的客户端数。与worker_processes联合应用时,取得每秒能够服务的最大客户端数
最大客户端数/秒=工作过程*工作者连接数
为了最大化Nginx的全副后劲,应将工作者连贯设置为外围一次能够运行的容许的最大过程数1024。
3)启用Gzip压缩
压缩文件大小,缩小了客户端http的传输带宽,因而进步了页面加载速度
倡议的gzip配置示例如下:( 在http局部内)
4)为动态文件启用缓存
为动态文件启用缓存,以缩小带宽并进步性能,能够增加上面的命令,限定计算机缓存网页的动态文件:
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {expires 365d;}
5)Timeouts
keepalive连贯缩小了关上和敞开连贯所需的CPU和网络开销,获得最佳性能须要调整的变量可参考:
6)禁用access_logs
拜访日志记录,它记录每个nginx申请,因而耗费了大量CPU资源,从而升高了nginx性能。
齐全禁用拜访日志记录
access_log off;
如果必须具备拜访日志记录,则启用拜访日志缓冲
access_log /var/log/nginx/access.log主缓冲区= 16k
502报错可能起因有哪些?
- 1)FastCGI过程是否曾经启动
- 2)FastCGI worker过程数是否不够
- 3)FastCGI执行工夫过长
- 4)FastCGI Buffer不够
nginx和apache一样,有前端缓冲限度,能够调整缓冲参数
fastcgi_buffer_size 32k;fastcgi_buffers 8 32k;
- 5)Proxy Buffer不够
如果你用了Proxying,调整
proxy_buffer_size 16k;proxy_buffers 4 16k;
- 6)php脚本执行工夫过长
将php-fpm.conf的<value name="request_terminate_timeout">0s</value>
的0s改成一个工夫。
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!