作为一款高性能的HTTP服务器软件,Nginx的核心 功能就是应对HTTP请求的处理。由于具体硬件、操作 系统及应用场景的不同,需要Nginx在对HTTP请求的处 理方法上进行不同的调整,为了应对这些差异,Nginx 提供了多种配置指令,让用户可以根据实际的软硬件及使用场景进行灵活配置。
Nginx的配置指令很多,为了方便理解和使用,可 以按照其在代码中的分布,将其分为核心配置指令和模块配置指令两大类。核心配置指令分为事件核心配置指令和HTTP核心配置指令,事件核心配置指令主要 是与Nginx自身软件运行管理及Nginx事件驱动架构有 关的配置指令;HTTP核心配置指令是对客户端从发起 HTTP请求、完成HTTP请求处理、返回处理结果,到关 闭HTTP连接的完整过程中的各个处理方法进行配置的配置指令。模块配置指令是在每个Nginx模块中对所在 模块的操作方法进行配置的配置指令。
1.配置文件解析
Nginx默认编译安装后,配置文件都会保存 在/usr/local/nginx/conf目录下,在配置文件目录 下,Nginx默认的主配置文件是nginx.conf,这也是 Nginx唯一的默认配置入口。
1.1 配置文件目录
[root@ansible01 nginx]# tree /etc/nginx/
/etc/nginx/
├── conf.d
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf
fastcgi_params | Nginx在配置FastCGI代理服 务时会根据fastcgi_params文件的配置向FastCGI服务 器传递变量,该配置文件现已由fastcgi.conf代替 |
fastcgi.conf | 为了规范配置指令 SCRIPT_FILENAME的用法,引入FastCGI变量传递配 置 |
mime.types | MIME类型映射表,Nginx会根据服 务端文件后缀名在映射关系中获取所属文件类型,将 文件类型添加到HTTP消息头字段“Content-Type” 中 |
nginx.conf | Nginx默认的配置入口文件 |
scgi_params | Nginx在配置SCGI代理服务时会 根据scgi_params文件的配置向SCGI服务器传递变量 |
uwsgi_params | Nginx在配置uWSGI代理服务时 会根据uwsgi_params文件的配置向uWSGI服务器传递变 量 |
koi-utf、koi-win、win-utf | 这3个文件是 KOI8-R编码转换的映射文件,因为Nginx的作者是俄罗 斯人,在Unicode流行之前,KOI8-R是使用最为广泛的 俄语编码 |
1.2 配置文件结构
main | 全局域 | Nginx 的根级别指令区域。该区域的配置指令是全局有效的,该指令名为隐性显示,nginx.conf 的整个文件内容都写在该指令域中 |
events | 指令域 | Nginx事件驱动相关的配置指令域 |
http | 指令域 | Nginx HTTP 核心配置指令域,包含客户端完整 HTTP 请求过程中每个过程的处理方法的配置指令 |
server | 指令域 | Nginx 用来定义服务 IP、绑定端口及服务相关的指令区域 |
location | 指令域 | 对用户 URI 进行访问路由处理的指令区域 |
stream | 指令域 | Nginx 对 TCP 协议实现代理的配置指令域(负载均衡) |
types | 指令域 | 定义被请求文件扩展名与 MIME 类型映射表的指令区域 |
if | 指令域 | 按照选择条件判断为真时使用的配置指令域 |
打开系统默认的nginx.conf文件,可以看到整个 文件的结构如下:
[root@ansible01 nginx]# cat /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}http {log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 4096;include /etc/nginx/mime.types;default_type application/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;server {listen 80;listen [::]:80;server_name 11.0.1.18;# root /usr/share/nginx/html;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {root /usr/share/nginx/html;index index.html index.htm;}location /shell {root /usr/share/nginx/;index index.html;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /usr/share/nginx/$fastcgi_script_name;include fastcgi_params;}error_page 404 /404.html;location = /404.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }}
由上述配置文件可以看出,配置文件中的指令和 指令值是以类似于key-value的形式书写的。写在配置 文件全局域的指令是Nginx配置文件的核心指令,主要 是对Nginx自身软件运行进行配置的指令。其中, events和http所包含的部分分别为事件指令域和HTTP 指令域,指令域内的指令则明确约定了该区域内的指 令的应用范围。server指令域被包含于http指令域 中,同时又包含了location指令域,各指令域中的共 用范围逐层被上层指令域限定,可见各指令域匹配的 顺序是由外到内的。Nginx的配置指令按照内部设定可 以同时编写在不同指令域中,包含在最内层的指令将 对外层同名指令进行指令值覆盖,并以最内层指令配 置为最终生效配置。
2.Nginx的进程核心配置指令
Nginx的进程核心配置指令包含在Nginx核心代码 及事件模块代码中,按配置指令设定的功能可分为进程管理、进程调优、进程调试、事件处理4个部分。
2.1 进程管理
Nginx本身是一款应用软件,在其运行时,用户可 对其运行方式、动态加载模块、日志输出等使用其内 建的基础配置指令进行配置,指令说明如下表所示:
指令 | 默认值 | 指令说明 |
daemon | on | 用于设定nginx进程是否以守护进程的方式在后台运行,on为启用,off为不启用 |
pid | logs/nginx.pid | 设定保存nginx主进程ID的文件路径 |
user | nobody nobody | 用于设定nginx启动后,主进程唤起的工作进程运行的用户以及用户组 |
load_module | - | 加载动态模块的指令 |
include | - | 加载外部配置文件 |
error_log | logs/error.log error | 指定错误日志文件路径及文件名 |
pcre_jit | off | 用于设定在配置文件中的正则表达式是否使用pcre_jit技术,off为不适用,on为使用 |
ssl_engine | - | 指定使用的OpenSSL加速引擎名称 |
pcre_jit需要Nginx在配置编译时加上--withpcre-jit参数。
error_log的日志级别可以为如下值:debug、 info、notice、warn、error、crit、alert、emerg。
在Linux系统中,可用如下命令查看当前系统支持 的OpenSSL加速引擎信息。
[root@ansible01 nginx]# openssl engine -t
2.2 进程调优
Nginx是按照事件驱动架构设计的。每个外部请求 都以事件的形式被工作进程(Worker Process)响 应,并发完成各种功能的操作处理。Nginx工作进程的 性能依赖于硬件和操作系统的配置,在实际应用场景 中,用户需要按照硬件、操作系统或应用场景需求的 侧重点进行相应的配置调整。Nginx的进程调优配置指令如下表所示:
2.2.1 线程池指令
名称 | 线程池指令 |
指令 | thread_pool |
作用域 | main |
默认值 | thread_pool default threads=32 max_queue=65536; |
指令说明 | 线程池配置指令,允许调整默认线程池或创建新的线程池,用于读取和发送文件的场景中。在线程池中所有线程都繁忙时,新的请求任务将在队列中等待,默认情况下,等待队列中的最大任务数是65536。使用线程池机制时,通过配置该指令,可以在因读取和发送文件引发阻塞的场景中提升nginx读取和发送文件的处理功能 |
#配置样式如下:
thread_pool pool_1 threads=16;
具体参数说明如下:
thread_pool也可以编写在http指令域中
threads参数定义了线程池的线程数
max_queue参数指定了等待队列中的最大任务 数,在线程池中所有线程都处于繁忙状态时,新任务 将进入等待队列。等待队列中的最大任务数为65536
·线程池指令需要在编译配置时增加--with-threads参数
2.2.2 定时器方案指令
名称 | 定时器指令 |
指令 | timer_resolution |
作用域 | main |
默认值 | - |
指令说明 | nginx中的处理事件超时管理方案有两种,一种是设定一个定时器,每过一段时间就对所有超时事件进行一次扫描;另一种是先计算出距离当前时间最近的将要发生超时事件的时间,然后等待这个时间之后再去进行一次超时检测。默认配置下使用第二种超时检测方案,该方案是依据事件超时时间与当前时间的时间差进行检测的,所以每次事件返回都需要进行新的检测时间计算,在I/O事件比较多的场景下,这会导致频繁地调用时间函数gettimeofday进行计算并更新下次检测的时间,资源消耗相对较高。而设置一个指定的时间值启用第一种方案时,nginx内置的事件超时检测定时器会在指定时间周期内进行事件超时检测,无须调用时间函数gettimeofday更新时间,资源消耗相对较低。 |
#配置样例如下:
timer_resolution 100ms;
在因频繁调用时间函数引发的资源消耗不大的场 景中可不设定该指令
2.2.3 工作进程优先级指令
名称 | 工作进程优先级指令 |
指令 | worker_priority |
作用域 | main |
默认值 | () |
指令说明 | 工作进程优先级设定指令,可以通过该指令设定工作进程在Linux系统中的优先级(nice值) |
#配置样例如下:
worker_priority -5;
worker_priority指令值的取值范围是-20~19, 数值越小,优先级越高,获得的CPU时间就越多。配置生效后可以通过如下命令查看:
[root@ansible01 nginx]# ps axo command,pid,ni | grep nginx | grep -v grep
nginx: worker process 4163 0
nginx: worker process 4164 0
nginx: master process /usr/ 129572 0
2.2.4 工作进程数指令
名称 | 工作进程数指令 |
指令 | worker_processes |
作用域 | main |
默认值 | 1 |
可配置选项 | number或auto |
指令说明 | 依据nginx架构可知,工作进程数量的最佳配置是小于或等于CPU内核的数量,通过该指令可以手动设置工作进程的数量,该指令也支持auto指令值,由nginx自动分配 |
#配置样例如下:
worker_processes auto;
工作进程数指令的指令值有两种类型,分别为数 字和auto。指令值为auto时,Nginx会根据CPU的内核 数生成等数量的工作进程。
2.2.5 工作进程CPU绑定指令
名称 | 工作进程CPU绑定指令 |
指令 | worker_cpu_affinity |
作用域 | main |
默认值 | - |
可配置选项 | cpumark或auto |
指令说明 | nginx工作进程处于高效的工作状态是因为充分利用了进程与CPU的亲缘性,使每个工作进程均可固定在一个CPU上运行。该指令可以手动进行工作进程与CPU的绑定,当然也可以通过设定指令值auto交由nginx自动分配 |
#配置样例如下:
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核
2.2.6 工作进程开文件数指令
名称 | 工作进程开文件数指令 |
指令 | worker_rlimit_nofile |
作用域 | main |
默认值 | - |
指令说明 | 设置nginx所有工作进程同时打开文件的最大数量,默认为操作系统的文件打开数 |
#配置样例如下:
worker_rlimit_nofile 65535;
2.2.7 工作进程关闭等待时间指令
名称 | 工作进程关闭等待时间指令 |
指令 | worker_shutdown_timeout |
作用域 | main |
默认值 | - |
指令说明 | 设置nginx正常关闭工作进程的超时时间,当超过设定的时间时,nginx主进程将强制关闭所有已经打开的连接,以便关闭工作进程 |
#配置样例如下:
worker_shutdown_timeout 10s;
2.2.8 设置互斥锁文件指令
名称 | 设置互斥锁文件指令 |
指令 | lock_file |
作用域 | main |
默认值 | logs/nginx.lock; |
指令说明 | 设置互斥锁文件指令,在开启accept_mutex进程调试模式或使用共享内存的场景下,需要用到互斥锁机制。在一些支持原子操作的操作系统中,可使用共享内存实现互斥锁。在不支持原子操作的系统环境下,需要通过该指令指定一个互斥锁文件 |
#配置样例如下:
lock_file logs/nginx.lock;
2.3 进程调试
Nginx调整配置或运行发生异常时,为了及时获知 工作进程在事件处理过程中发生的问题,可通过获取 内存中各状态机、变量等数据的内容进行调试。Nginx 为用户提供了一些调试用的配置指令,方便用户进行 进程调试。配置指令如下表所示:
2.3.1 主进程指令
名称 | 主进程指令 |
指令 | master_process |
作用域 | main |
默认值 | on |
可配置选项 | on或off |
指令说明 | nginx默认是以一个主进程管理多个工作进程的工作方式,设定指令值为off时,nginx将只运行一个主进程来处理所有请求 |
#配置样例如下:
master_process off;
2.3.2 调试点控制指令
名称 | 调试点控制指令 |
指令 | debug_points |
作用域 | main |
默认值 | - |
可配置选项 | stop或abort |
指令说明 | 该指令用于进程调试点的控制,当指令值为stop时,nginx在执行到内部调试点时就会发出SIGSTOP信号,方便用户进行调试;当指令值为abort时则会停止进程并创建corefile |
#配置样例如下:
debug_points stop;
2.3.3 工作目录指令
名称 | 工作目录指令 |
指令 | working_directory |
作用域 | main |
默认值 | - |
指令说明 | 在Linux操作系统中,当进程执行出错或收到终止信号时,操作系统会将执行进程过程中,内存中的内容存储到一个文件中,该文件被称为崩溃文件(corefile),当nginx进程发生这种状况时也会生成一个崩溃文件,该崩溃文件中包含当时的堆栈及寄存器等信息,方便用户排查问题产生的原因。该指令用于设定工作进程保存崩溃文件的目录,在nginx程序崩溃时向该目录中写入崩溃文件,nginx进程需要被设定有目录的写权限 |
#配置样例如下:
working_directory logs
崩溃文件可以使用工具objdump、GDB进行文件分析。
2.3.4 调试文件大小指令
名称 | 调试文件大小指令 |
指令 | worker_rlimit_core |
作用域 | main |
默认值 | - |
指令说明 | 该指令是崩溃文件大小的设置指令,因为崩溃文件会存储非常详细的信息,数据量很大,很容易把磁盘空间占满,因此需要合理的限制崩溃文件的文件大小 |
#配置样例如下:
worker_rlimit_core 800m;
2.4 时间处理
Nginx是采用事件驱动式架构处理外部请求的,这 一架构使得Nginx在现有硬件架构下可以处理数以万计 的并发请求。通过事件处理指令的配置可以让Nginx与 实际运行的硬件及系统进行有效的适配,从而发挥更 加高效的并发处理能力。Nginx的事件处理指令编辑在 events指令域中,如下表所示:
2.4.1 工作进程并发数指令
名称 | 工作进程并发数指令 |
指令 | worker_connections |
作用域 | events |
默认值 | 512 |
指令说明 | 每个nginx工作进程可处理并发链接的最大数 |
#配置样例如下:
events {worker_connections 65535;
}
Linux系统下,因为每个网络连接都将打开一个文 件描述符,Nginx可处理的并发连接数受限于操作系统 的最大打开文件数,同时所有工作进程的并发数也受 worker_rlimit_nofile指令值的限制。
2.4.2 事件处理机制选择指令
名称 | 事件处理机制选择指令 |
指令 | use |
作用域 | events |
默认值 | - |
指令说明 | nginx内部有多种事件处理机制模型,以下简称事件模型,默认情况下,nginx会自动选择一种高效的事件模型,用户可以通过该指令自行选择事件模型进行事件处理 |
#配置样例如下:
events {use epoll;
}
Nginx支持的事件模型有select、poll、kqueue、 epoll、/dev/poll、eventport。
2.4.3 互斥锁指令
名称 | 互斥锁指令 |
指令 | accept_mutex |
作用域 | events |
默认值 | off |
可配置选项 | on或off |
指令说明 | 设置是否启用互斥锁模式的进程调度 |
#配置样例如下:
events {accept_mutex on;
}
2.4.4 互斥锁等待时间指令
名称 | 互斥锁等待时间指令 |
指令 | accept_mutex_delay |
作用域 | events |
默认值 | 500ms |
指令说明 | nginx工作进程在互斥锁模式下需要不断地争抢互斥锁,没有互斥锁的工作进程如果争抢不到互斥锁,会在等待事件结束后执行下一轮争抢。通过该指令可以将抢锁等待时间设置为一个较短的时间,以提高进程争抢互斥锁的频率 |
#配置样例如下:
events {accept_mutex_delay 300ms;
}
2.4.5 多请求支持指令
名称 | 多请求支持指令 |
指令 | multi_accept |
作用域 | events |
默认值 | off |
可配置选项 | on或off |
指令说明 | 默认情况下,每个工作进程一次只接受一个新连接,如果开启该指令,则每个工作进程将接受所有的新连接 |
#配置样例如下:
events {multi_accept on;
}
2.4.6 未完成异步操作最大数指令
名称 | 未完成异步操作最大数指令 |
指令 | worker_aio_requests |
作用域 | events |
默认值 | 32 |
指令说明 | 用于设置当在epoll事件模型下使用AIO时,单个工作进程未完成异步I/0操作的最大数 |
#配置样例如下:
events {worker_aio_requests 128;
}
2.4.7 调试指定连接指令
名称 | 调试指定连接指令 |
指令 | debug_connection |
作用域 | events |
默认值 | off |
可配置选项 | address或CIDR或unix; |
指令说明 | 对指定的客户端连接开启测试日志 |
#配置样例如下:
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参数 开启。
2.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
}