乐趣区

关于java:面试官Nginx-是如何实现并发的为什么-Nginx-不使用多线程

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

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

退出移动版