Code前端首页关于Code前端联系我们

Nginx是如何实现高并发的?了解原理和配置设置

terry 2年前 (2023-09-28) 阅读数 67 #未命名

Nginx如何实现高并发?

Nginx采用多进程(单线程)&多通道IO复用模型。 Nginx,利用I/O复用技术,成为一个“并发事件驱动”的服务器。它实现了异步、非阻塞,使用了epoll并进行了大量底层代码优化。

如果一台服务器使用一个进程负责一个请求,那么进程数就是并发数。正常情况下,会有很多进程在等待。

nginx 使用一个主进程和多个工作进程。

  • master进程主要负责收集和分发请求。当请求到达时,master 启动一个工作进程来处理该请求。
  • 同时master进程还负责监控waker的状态,以保证高可靠性
  • waker进程一般设置为与CPU核数相匹配。 nginx的waker进程可以同时处理的请求数量仅受内存限制,可以处理多个请求。

Nginx 的异步、非阻塞工作方式利用了等待时间。当需要等待的时候,这些进程就处于空闲状态,处于待命状态,所以几个进程就解决了大量的并发问题。

题外话:这个和PHP扩展swoole是一样的原理

Nginx 如何实现高并发?理解原理及其配置调优

每次有请求进来,都会有一个worker进程来处理。但这还不是全部过程。到什么程度?可能发生阻塞的过程,例如将请求转发到上游服务器(后端)并等待请求返回。嗯,处理这件事的工人非常聪明。发送请求后,他会注册一个事件:“如果上游返回,请告诉我,我会继续。”于是他就去休息了。此时,如果再有请求到来,他也可以通过这种方式快速处理。当上游服务器返回时,该事件将被触发,worker 将接管,并且请求将继续失败。

Nginx为什么不使用多线程?

Apache:创建多个进程或线程,每个进程或线程都会为其分配CPU和内存(线程比进程小很多,所以worker支持比perfork更高的并发)。太多的并发会耗尽服务器的资源。资源。

Nginx:使用单线程异步、非阻塞地处理请求(管理员可以配置Nginx主进程中的工作进程数量)(epoll)。不为每个请求分配CPU和内存资源,节省了大量资源。同时也减少了大量的CPU上下文切换。这就是Nginx支持更高并发的原因。

配置设置

1。调整worker_processes

指Nginx要生成的worker数量。最佳实践是每个进程运行 1 个工作进程中央处理器。输入

grep processor  /proc/cpuinfo  |  wc -l

# 或者htop
htop

2即可了解系统中CPU核心的数量。最大化worker_connections

Nginx Web 服务器可以同时服务的客户端数量。与worker_processes结合使用时,您可以获得每个进程可以服务的最大客户端数量第二个

最大。客户端/秒 = 工作进程 * 工作连接数

为了最大限度地发挥 Nginx 的全部潜力,worker_processes 应尽可能设置为 core 允许运行的最大进程数为 1024。

3。启用Gzip压缩

可以压缩文件大小并减少客户端http传输带宽,从而提高页面加载速度。

4。启用静态文件缓存

启用静态文件缓存可减少带宽并提高性能。可以添加以下命令来限制电脑缓存网页上的静态文件

第三点和第四点具体见之前《【nginx网站性能优化篇(1)】gzip压缩与expire浏览器缓存》

5。超时

保持活动连接可减少打开和关闭连接所需的 CPU 和网络开销。调整以获得最佳性能的变量:

client_body_timeout 12;

client_header_timeout 12;

keepalive_timeout 15;

发送超时 10;

6。禁用 access_logs

访问日志记录,它会记录每个 nginx 请求,因此会使用大量 CPU 资源,从而降低 nginx 性能。

完全禁用访问日志记录

access\_log off;

如果必须具有访问日志记录,请启用访问日志缓冲区

access\_log /var/log/nginx/access.log主缓冲区= 16k

7。 fastcgi调优

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门