Nginx是如何做到高并发的?Nginx采用多进程(单线程)&多通道IO多路复用模型。Nginx,使用I/O多路复用技术,成为一个“并发事件驱动”的服务器。它实现了异步、非阻塞、使用epoll和大量的底层代码优化。如果服务器采用一个进程负责一个请求的方式,那么进程数就是并发数。一般情况下,会有很多进程一直在等待。而nginx采用的是一个master进程,多个woker进程。master进程主要负责收集和分发请求。每当请求到来时,master拉起一个worker进程来处理请求。同时master进程还负责监控woker的状态,确保高可靠的woker进程一般设置为与CPU核数一致。nginx的woker进程同时处理的请求数只受内存限制,可以同时处理多个请求。Nginx的异步非阻塞工作方式就是利用等待时间。当需要等待的时候,这些进程是空闲的,处于待命状态,所以少量的进程可以解决大量的并发问题。[info]题外话:这个和PHP扩展swoole的原理是一样的。每有一个请求进来,都会有一个worker进程去处理。但不是整个过程,到什么程度?处理可能发生阻塞的地方,比如将请求转发给上游(后端)服务器,等待请求返回。然后,加工工人很聪明。发送请求后,他会注册一个事件:“如果上游返回,告诉我,我继续做。”于是他去休息了。这个时候,如果有别的请求进来,他又可以快速的按这种方式处理。一旦upstreamserver返回,就会触发这个事件,worker会接手,请求会继续。为什么Nginx不使用多线程?Apache:创建多个进程或线程,每个进程或线程会为其分配CPU和内存(线程比进程小很多,所以worker支持比perfork更高的并发),并发过多会消耗服务器资源。Nginx:使用单线程异步非阻塞地处理请求(管理员可以配置Nginx主进程的工作进程数)(epoll),不会为每个请求分配cpu和内存资源,节省大量资源并减少大量CPU上下文切换。这就是Nginx支持更高并发的原因。配置调优1.调整worker_processes为Nginx要生成的worker数量。最佳实践是每个CPU运行一个工作进程。要了解系统中的CPU核心数,请输入grepprocessor/proc/cpuinfo|wc-l#或htophtop2。最大化worker_connectionsNginxweb服务器同时提供服务的客户端数量。当与worker_processes结合使用时,您将获得每秒可服务的最大客户端数Maximumclients/sec=Workerprocesses*Workerconnections为了最大限度地发挥Nginx的全部潜力,worker_processes应设置为一个核心可以运行的最大进程数一次数量为1024。3.启用Gzip压缩压缩文件大小,减少客户端http的传输带宽,从而提高页面加载速度。4.启用静态文件缓存要启用静态文件缓存以减少带宽并提高性能,您可以添加以下命令来限制计算机缓存网页的静态文件。详见第三点和第四点。《【nginx网站性能优化篇(1)】gzip压缩与expire浏览器缓存》5.Timeoutskeepaliveconnection减少了打开和关闭连接以获得最佳性能所需的CPU和网络开销要调整的变量:6.禁用access_logs访问日志记录,它会记录每个nginx请求,从而消耗大量CPU资源,降低nginx性能。完全禁用访问日志access_logoff;如果您必须具有访问权限,请启用访问日志缓冲access_log/var/log/nginx/access.logmainbuffer=16k7。fastcgitunefastcgi_connect_timeout600;fastcgi_send_timeout600;fastcgi_read_timeout600;fastcgi_buffer_size64k;fastcgi_buffers464k;fastcgi_busy_buffers_size128k;fastcgi_temp_file_write_size128k;fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;fastcgi_intercept_errorson;fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cachelevels=1:2keys_zone=cache_fastcgi:128minactive=1dmax_size=10g;[info]其实可以参考网上的lnmp一键压缩包,配置的很好。参考链接:https://www.toutiao.com/i6673...
