起源: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开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!