共计 2155 个字符,预计需要花费 6 分钟才能阅读完成。
这是一位读者带回来的面试题
Nginx 是如何实现并发的?为什么 Nginx 不应用多线程?Nginx 常见的优化伎俩有哪些?502 谬误可能起因有哪些?
面试官心理剖析
次要是看应聘人员的对 NGINX 的基本原理是否相熟,因为大多数人多多少少都懂点 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 改成一个工夫
起源:toutiao.com/i6698255904053133827/