2.3.4 事件类配置项

下面是事件类配置项的相关介绍。

(1)是否打开accept锁

语法:accept_mutex[on|off]

默认:accept_mutext on;

accept_mutex是Nginx的负载均衡锁,本书会在第9章事件处理框架中详述Nginx是如何实现负载均衡的。这里,读者仅需要知道accept_mutex这把锁可以让多个worker进程轮流地、序列化地与新的客户端建立TCP连接。当某一个worker进程建立的连接数量达到worker_connections配置的最大连接数的7/8时,会大大地减小该worker进程试图建立新TCP连接的机会,以此实现所有worker进程之上处理的客户端请求数尽量接近。

accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但worker进程之间的负载会非常不均衡,因此不建议关闭它。

(2)lock文件的路径

语法:lock_file path/file;

默认:lock_file logs/nginx.lock;

accept锁可能需要这个lock文件,如果accept锁关闭,lock_file配置完全不生效。如果打开了accept锁,并且由于编译程序、操作系统架构等因素导致Nginx不支持原子锁,这时才会用文件锁实现accept锁(14.8.1节将会介绍文件锁的用法),这样lock_file指定的lock文件才会生效。

注意 在基于i386、AMD64、Sparc64、PPC64体系架构的操作系统上,若使用GCC、Intel C++、SunPro C++编译器来编译Nginx,则可以肯定这时的Nginx是支持原子锁的,因为Nginx会利用CPU的特性并用汇编语言来实现它(可以参考14.3节x86架构下原子操作的实现)。这时的lock_file配置是没有意义的。

(3)使用accept锁后到真正建立连接之间的延迟时间

语法:accept_mutex_delay Nms;

默认:accept_mutex_delay 500ms;

在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。这个accept锁不是阻塞锁,如果取不到会立刻返回。如果有一个worker进程试图取accept锁而没有取到,它至少要等accept_mutex_delay定义的时间间隔后才能再次试图取锁。

(4)批量建立新连接

语法:multi_accept[on|off];

默认:multi_accept off;

当事件模型通知有新连接时,尽可能地对本次调度中客户端发起的所有TCP请求都建立连接。

(5)选择事件模型

语法:use[kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];

默认:Nginx会自动使用最适合的事件模型。

对于Linux操作系统来说,可供选择的事件驱动模型有poll、select、epoll三种。epoll当然是性能最高的一种,在9.6节会解释epoll为什么可以处理大并发连接。

(6)每个worker的最大连接数

语法:worker_connections number;

定义每个worker进程可以同时处理的最大连接数。