上章节给出了一个完整的 nginx 配置示例,本章节将介绍 nginx.conf 配置中的 events 模块。
events 模块中包含了 nginx 中所有处理连接的设置,常用配置项如下:
#user nobody; worker_processes 1; # ... events { use epoll; accept_mutex on; multi_accept on; worker_connections 20000; client_header_buffer_size 4k; open_file_cache max=2000 inactive=60s; open_file_cache_valid 60s; open_file_cache_min_uses 1; }
下面将逐一介绍 events 中的配置,如下:
use 指令用来指定要使用的连接处理方法。通常不需要显式指定它,因为 nginx 默认会使用最有效的方法。
“use epoll;” 指定使用 epoll 的 I/O 模型来处理连接,与 apache 类似,nginx 针对不同的操作系统,有不同的事件模型
(1)标准事件模型
Select、poll 属于标准事件模型,如果当前系统不存在更有效的方法,nginx 会选择 select 或 poll
(2)高效事件模型
Kqueue:用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X。注意:使用双处理器的 MacOS X 系统使用 kqueue 可能会造成内核崩溃。
Epoll:用于 Linux 内核 2.6+ 版本的系统。
/dev/poll:用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
Eventport:用于 Solaris 10.。注意:为了防止出现内核崩溃的问题,有必要安装安全补丁
使用 cat /proc/version 命令,可以查看 Linux 的版本信息:
$ cat /proc/version Linux version 2.6.32-504.23.4.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) )
用来设置网路连接序列化,防止惊群现象发生,默认为 on。
什么是惊群现象?
惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。
设置是否允许同时接受多个网络连接,只能在 events 模块设置。
Nginx 服务器的每个工作进程可以同时接受多个新的网络连接,但是需要在 nginx.conf 配置文件中配置,此指令默认为关闭(multi_accept on),即默认为一个工作进程只能一次接受一个新的网络连接,打开后可同时接受多个链接。
设置工作进程的最大连接数,理论上每台 Nginx 服务器的最大连接数为 worker_processes*worker_connections。其中,worker_processes 为指定的工作进程数量。
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为系统分页大小。
在 Linux 系统下查看分页可以使用如下命令:
hxstrive@ubuntu:~/Desktop$ getconf PAGESIZE 4096
上面显示,Ubuntu 20.04 LTS 默认分页大小为 4K。
配置缓存,为打开的文件指定缓存,默认是没有启用的。max 参数指定缓存最大数量,建议和打开文件数一致。inactive 参数指经过多长时间文件没有被请求(或没有被使用)后删除缓存。打开文件最大数量为我们在 main 配置的 worker_rlimit_nofile 参数,worker_rlimit_nofile 参数用来为工作进程设置文件描述符的限制。
配置多长时间检查一次缓存的有效信息。如果有一个文件在 inactive 时间内一次都没被使用,它将被从缓存移除。
配置缓存中的文件在 open_file_cache 指令中的 inactive 参数(open_file_cache max=2000 inactive=60s;)指定的时间内文件的最少使用次数。如果超过这个数字,文件描述符一直是在缓存中打开的。如果有一个文件在 inactive 时间内一次没被使用,它将被从缓存移除。