Nginx进程配置指令详解
Nginx 的进程配置指令包含在 Nginx 核心代码及事件模块代码中,按配置指令设定的功能可分为进程管理、进程调优、进程调试、事件处理 4 个部分。
1、进程管理
Nginx 本身是一款应用软件,在其运行时,用户可对其运行方式、动态加载模块、日志输出等使用其内建的基础配置指令进行配置,指令说明如下表所示。
表:进程管理指令
其中,pcre_jit 需要 Nginx 在配置编译时加上 --with-pcre-jit 参数;error_log 的日志级别可以为如下值:debug、info、notice、warn、error、crit、alert、emerg。
在 Linux 系统中,可用如下命令查看当前系统支持的 OpenSSL 加速引擎信息。
openssl engine -t
2、进程调优
Nginx 是按照事件驱动架构设计的。每个外部请求都以事件的形式被工作进程(Worker Process)响应,并发完成各种功能的操作处理。Nginx 工作进程的性能依赖于硬件和操作系统的配置,在实际应用场景中,用户需要按照硬件、操作系统或应用场景需求的侧重点进行相应的配置调整。
Nginx 的进程调优配置指令如下面表格中所示。
表:线程池指令
配置样例如下:
thread_pool pool_1 threads=16; 具体参数说明如下。
- thread_pool 也可以编写在 http 指令域中;
- threads 参数定义了线程池的线程数;
- max_queue 参数指定了等待队列中的最大任务数,在线程池中所有线程都处于繁忙状态时,新任务将进入等待队列。等待队列中的最大任务数为 65536;
- 线程池指令需要在编译配置时增加 --with-threads 参数。
表:定时器方案指令
配置样例如下:
timer_resolution 100ms; 在因频繁调用时间函数引发的资源消耗不大的场景中可不设定该指令。
表:工作进程优先级指令
配置样例如下:
worker_priority -5; worker_priority 指令值的取值范围是 -20~19,数值越小,优先级越高,获得的 CPU 时间就越多。配置生效后可以通过如下命令查看,输出结果如下图所示。
ps axo command,pid,ni | grep nginx | grep -v grep
图:Nginx 工作进程
表:工作进程数指令
配置样例如下:
worker_processes auto; 工作进程数指令的指令值有两种类型,分别为数字和 auto。指令值为 auto 时,Nginx 会根据 CPU 的内核数生成等数量的工作进程。
表:工作进程 CPU 绑定指令
配置样例如下:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 指令值是用 CPU 掩码来表示的,使用与 CPU 数量相等位数的二进制值来表示。单个 CPU 用单个二进制值表示,多个 CPU 组合可用二进制值相加来表示。如配置样例所示,CPU 有 8 个核,分别表示绑定了从第 0 核到第 7 核的 CPU。CPU 核数是从 0 开始计数的。
指令值除了可以是 CPU 掩码外,还可以是 auto。当指令值为 auto 时,Nginx 会自动进行 CPU 绑定。
配置样例如下:
worker_processes auto;
worker_cpu_affinity auto; 工作进程与 CPU 核数也可以是多种对应组合,指令语句如下: worker_processes 4;
worker_cpu_affinity 01 10 01 10; # 表示把第1、3工作进程绑定在2核CPU的第0核,第2、4工作
进程绑定在2核CPU的第1核
worker_processes 2;
worker_cpu_affinity 0101 1010; # 表示把第1工作进程绑定在CPU的第0核和第2核,第2工作进程
绑定在CPU的第1核和第3核
工作进程 CPU 绑定指令仅适合于 FreeBSD 和 Linux 操作系统。
表:工作进程开文件数指令
配置样例如下:
worker_rlimit_nofile 65535;
表:工作进程关闭等待时间指令
配置样例如下:
worker_shutdown_timeout 10s;
表:设置互斥锁文件指令
配置样例如下:
lock_file logs/nginx.lock;
3、进程调试
Nginx 调整配置或运行发生异常时,为了及时获知工作进程在事件处理过程中发生的问题,可通过获取内存中各状态机、变量等数据的内容进行调试。Nginx 为用户提供了一些调试用的配置指令,方便用户进行进程调试。配置指令如下面表格中所示。
表:主进程指令
配置样例如下:
master_process off; 当只由主进程处理请求时,调试进程会更加方便。
表:调试点控制指令
配置样例如下:
debug_points stop;
表:工作目录指令
配置样例如下:
working_directory logs 可以使用工具 objdump、GDB 进行文件分析。
表:调试文件大小指令
配置样例如下:
worker_rlimit_core 800m;
4、事件处理
Nginx 是采用事件驱动式架构处理外部请求的,这一架构使得 Nginx 在现有硬件架构下可以处理数以万计的并发请求。通过事件处理指令的配置可以让 Nginx 与实际运行的硬件及系统进行有效的适配,从而发挥更加高效的并发处理能力。Nginx 的事件处理指令编辑在 events 指令域中,如下面表格中所示。
表:工作进程并发数指令
配置样例如下: events {
worker_connections 65535;
} Linux 系统下,因为每个网络连接都将打开一个文件描述符,Nginx 可处理的并发连接数受限于操作系统的最大打开文件数,同时所有工作进程的并发数也受 worker_rlimit_nofile 指令值的限制。
表:事件处理机制选择指令
配置样例如下:
events {
use epoll;
} Nginx 支持的事件模型有 select、poll、kqueue、epoll、/dev/poll、eventport。
表:互斥锁指令
配置样例如下:
events {
accept_mutex on;
} 在 Nginx 1.11.3 版本之前,互斥锁指令是默认开启的。
表:互斥锁等待时间指令
配置样例如下:
events {
accept_mutex_delay 300ms;
}
表:多请求支持指令
配置样例如下:
events {
multi_accept on;
}
表:未完成异步操作最大数指令
配置样例如下:
events {
worker_aio_requests 128;
}
表:调试指定连接指令
配置样例如下:
events {
debug_connection 127.0.0.1;
debug_connection localhost;
debug_connection 192.0.2.0/24;
debug_connection ::1;
debug_connection 2001:0db8::/32;
debug_connection unix:;
...
} 该指令需要 Nginx 在编译时通过--with-debug
参数开启。
5、指令配置样例
本节指令的配置样例如下。
daemon on; # 以守护进程的方式运行Nginx
pid logs/nginx.pid; # 主进程ID记录在logs/nginx.pid中
user nobody nobody; # 工作进程运行用户为nobody
load_module "modules/ngx_http_xslt_filter_module.so"; # 加载动态模块ngx_http_xslt_
filter_module.so
error_log logs/error.log debug; # 错误日志输出级别为debug
pcre_jit on; # 启用pcre_jit技术
thread_pool default threads=32 max_queue=65536; # 线程池的线程数为32,等待队列中的最大
任务数为65536
timer_resolution 100ms; # 定时器周期为100毫秒
worker_priority -5; # 工作进程系统优先级为-5
worker_processes auto; # 工作进程数由Nginx自动调整
worker_cpu_affinity auto; # 工作进程的CPU绑定由Nginx自动调整
worker_rlimit_nofile 65535; # 所有工作进程的最大连接数是65535
worker_shutdown_timeout 10s; # 工作进程关闭等待时间是10秒
lock_file logs/nginx.lock; # 互斥锁文件的位置是logs/nginx.lock
working_directory logs # 工作进程工作目录是logs
debug_points stop; # 调试点模式为stop
worker_rlimit_core 800m; # 崩溃文件大小为800MB
events {
worker_connections 65535; # 每个工作进程的最大连接数是65535
use epoll; # 指定事件模型为epoll
accept_mutex on; # 启用互斥锁模式的进程调度
accept_mutex_delay 300ms; # 互斥锁模式下进程等待时间为300毫秒
multi_accept on; # 启用支持多连接
worker_aio_requests 128; # 完成异步操作最大数为128
debug_connection 192.0.2.0/24; # 调试指定连接的IP地址和端口是192.0.2.0/24
}