Nginx.conf 配置文件分为三部分,分别为main块、events块、http块(http块又包含server块和location块),如下图。
第一部分:main块(全局块)
main块主要是设置一些影响Nginx服务器整体运行的配置指令,主要包括:配置运行Nginx服务器的用户(组)、允许生成的 worker process数,进程PID存放路径、日志存放路径、类型以及配置文件的引入等。
# 配置nginx进程运行用户(组),nobody也是一个Linux用户,一般用于启动程序,没有密码
#user nobody; # 用户组
# 确定nginx是否以守护进程方式运行,主要用于开发期间
# daemon on | off
# daemon on; # 默认值
# 并发处理进程数量,通常等于cpu数量或者2倍cpu数量。
# 也可以将其设置为auto。这样Nginx自动根据核心数生成对应数量的worker进程
# worker_processes number | auto;
worker_processes 1; #默认值为1,意味着Nginx只运行一个worker
# nginx进程pid存放路径
#pid logs/nginx.pid;
# 存储错误日志
# error_log file [level]
error_log /usr/logs/nginx/error.log; # 绝对路径
#error_log logs/error.log error; # 默认配置。相对路径,nginx安装目录下
# nginx worker能打开的最多文件数量
worker_rlimit_nofile 65535
# 线程池
# thread_pool name threads=number [max_queue=number];
# thread_pool default threads=32 max_queue=65536; #默认值
一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与Nginx进程数相除,但是Nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
1.1 user 用户(组)
1.2 worker_processes
worker_processes 配置,是 Nginx 服务器并发处理服务的进程数量,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束,通常等于cpu数量或者2倍cpu数量。也可以配置成auto。
1.3 error日志
Nginx error日志可通过内置指令进行配置,既可以输出到本地,也可以输出给rsyslog或内存缓存区(通常用于调试),甚至可以发送给另一台服务器的rsyslog应用进行处理。
格式:error_log + 存储路径 + 错误级别(如果不定义,默认级别是error)
Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
存储路径分三类,本机存储、发送给rsyslog、本机memory
1.3.1 存储路径 - 本机存储 /path
注意配置的存储路径,nginx需要有读写权限,否则日志创建失败。
error_log /usr/logs/nginx/error.log; # 绝对路径
error_log logs/error.log notice; # 默认配置。相对路径,nginx安装目录下
1.3.2 存储路径 - syslog
该配置方式是将nginx error日志发送给本机或另一台服务器的rsyslog服务进行处理。
error_log syslog:server=47.93.88.999 debug;
# 或者是自定义
error_log syslog:server=47.93.88.999:515,facility=local1,severity=warn,tag=nginx_client warn;
server:指定syslog服务器的IP和端口。如未指定端口,则用UDP端口514。IP也可以写成域名,如果域名解析为多个IP地址,则使用第一个解析的地址。
facility:指定发送给syslog需要提供的实体/机构/服务器名称,默认是local7。可选择项有 “kern”, “user”, “mail”, “daemon”, “auth”, “intern”, “lpr”, “news”, “uucp”, “clock”, “authpriv”, “ftp”, “ntp”, “audit”, “alert”, “cron”, “local0”…“local7”。
severity:指定事件/日志级别。这里指的并不是nginx的错误日志级别,而是发送给rsyslog需要记录的日志级别。默认是info。
tag:标签/标识,也可以理解为是发送者/应用身份的标识。默认是nginx。
warn:这个warn是nginx的错误级别。指定要将什么级别的日志发送个rsyslog server。默认是error。
总结:哪台机器(facility)要将由谁(tag)产生的何类日志(nginx错误日志级别)发送给谁(server),并记录成什么级别(severity)。
1.3.3 存储路径 - memory
主要用于调试期间使用,将日志记录到内存缓冲区。
1.3.4 错误级别
nginx的错误级别分为 debug | info | notice | warn | error | crit | alert | emerg ,从左到右,级别从低到高。我们其他的各种编译器输出日志的逻辑差不多。级别越低输出的错误日志就会越多。生产环境建议设置在warn及以上。否则会有大量的IO请求,耗费系统资源。
1.4 worker_rlimit_nofile
Syntax: worker_rlimit_nofile number;
Default: —
Context: main
设置工作进程能打开的文件数量上限。理论上这个值应该是最多打开文件数(ulimit -n)与nginx工作进程相除。这里与最好与ulimit -n 或者limits.conf的值保持一致。ulimit -n 默认值是1024,如果不调整,worker_rlimit_nofile设置的值大于1024时将不起作用。
查看系统设置的最大打开文件数量值,使用ulimit -n 或ulimit -a命令。
[root@reader ~]# ulimit -n
65535 # 我这里已经设置过了
[root@reader ~]# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14445
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 65535 # 最大打开文件数量
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14445
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
设置最大文件打开数量值。在/etc/security/limits.conf配置文件最后增加如下两行代码。
* soft nofile 65535
* hard nofile 65535
1.5 线程池thread_pool
# in the 'main' context
thread_pool default threads=32 max_queue=65536;
# in the 'http', 'server', or 'location' context
aio threads=default;
Syntax: thread_pool name threads=number [max_queue=number];
Default: thread_pool default threads=32 max_queue=65536;
Context: main
定义线程池线程数量和最多等待请求数量。
thread_pool default threads=32 max_queue=65536; # max_queue可省略,其默认值是65536
这里定义了一个名为“default”,包含32个线程,任务队列最多支持65536个请求的线程池。如果任务队列过载,NGINX将拒绝请求并输出如下错误日志:
上面这行代码定义了一个名为“default”,包含32个线程,任务队列最多支持65536个请求的线程池,如果任务队列过载,nginx会拒绝请求并输出如下错误日志:
thread pool "NAME" queue overflow: N tasks waiting
如果出现上述错误,说明线程池的负载很高,可以尝试通过增加线程数来解决这个问题。一个进程/cpu最多不要超过50线程,可根据自己机器的压测结果进行调整。
最后要说明的是,可以配置多个相互独立的线程池,并在配置文件的不同位置使用它们来满足不同的用途:
# in the 'main' context
thread_pool one threads=1024 max_queue=3000;
thread_pool two threads=512 max_queue=3000;
thread_pool three threads=256 max_queue=3000;
http {
server {
location /one {
aio threads=one;
}
location /two {
aio threads=two;
}
location /three {
aio threads=three;
}
}
#...
}
第二部分:events块
第三部分:http块
http块中可以配置多个server块,每个server块中可以配置多个location块