Nginx服务之核心配置

纸上得来终觉浅,绝知此事要躬行。

Nginx服务之核心配置 Nginx服务之核心配置

1. 主配置相关

1.1 正常运行必备的配置

【1】user USERNAME [GROUPNAME];

  • 作用域
    • main
  • 含义解释
    • 指定运行worker进程的user和group
    • 如果省略group,nginx会使用与user相同的组名
user nginx;
user nginx nginx;

【2】pid /path/to/pid_file;

  • 作用域
    • main
  • 含义解释
    • 指定nginx运行使用的pid文件
  • 默认值
    • pid /run/nginx.pid;
pid /var/run/nginx/nginx.pid;
# 文件里面包含对应的PID值
$ cat /var/run/nginx/nginx.pid
2743

【3】worker_rlimit_nofile number;

  • 作用域
    • main
  • 含义解释
    • 指定一个worker进程所能够打开的最大文件句柄数
    • 默认值为1024,通常无法满足我们的需求,需要修改
    • 用于在不重启主进程的情况下增大该限制
worker_rlimit_nofile 10240;

【4】worker_rlimit_core size;

  • 作用域
    • main
  • 含义解释
    • 修改工作进程的core文件尺寸的最大值限制,通常不做修改
    • 用于在不重启主进程的情况下增大该限制
worker_rlimit_core 65535;

【5】thread_pool name threads=number [max_queue=number];

  • 作用域
    • main
  • 含义解释
    • 线程池可以使worker进程不阻塞的读写文件
    • name参数用于定义线程池的名称
    • threads参数用于定义线程池中的线程数量
    • max_queue参数可以限制多少数量的任务可以在队列中等待
    • 版本1.7.11之后,该指令才可以使用
  • 默认值
    • thread_pool default threads=32 max_queue=65536;
# 如果线程池中所有的线程很很繁忙忙,新请求进来之前就需要排队等待了
1. 此时max_queue参数可以限制多少数量的任务可以在队列中等待
1. 默认情况下,队列的最大等待任务数量为65536个,超出时就会导致队列溢出抛出错误
thread_pool wsescape threads=32 max_queue=65536;

【6】include file|mask;

  • 作用域
    • 任意位置
  • 含义解释
    • 将一个文件或者匹配指定mask的文件包含到配置中去
    • 被包含的文件应由语法正确的指令和块组成
# main
include /etc/nginx/modules-enabled/*.conf;

1. http
include /etc/nginx/mime.types;

1. http
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

【7】env variable[=value];

  • 作用域
    • main
  • 含义解释
    • 一般情况下,不用设置
    • 默认情况下,nginx会删除从父进程继承的除TZ变量以外的所有环境变量
    • 该指令允许nginx保留某些继承的环境变量,改变它们的值或者创建新的环境变量
    • 这些变量将在热升级nginx执行文件时被继承、被ngx_http_perl_module模块使用、被工作进程使用
    • TZ变量总是被继承,并且可被ngx_http_perl_module模块使用, 除非明确配置不允许这样
  • 默认值
    • env TZ;
# Nginx环境变量是由nginx内部设置和使用,用户不应直接设置它
env MALLOC_OPTIONS;
env PERL5LIB=/data/site/modules;
env OPENSSL_ALLOW_PROXY_CERTS=1;

1.2 优化性能相关的配置

【1】worker_processes number|auto;

  • 作用域
    • main
  • 含义解释
    • 设置master启用的worker线程个数,通常设置为物理CPU核心数减1
    • 从nginx1.3.8开始支持auto参数,表示nginx会自动检测进行合理的分配
    • 最优值取决于许多因素,包括 CPU 核的数量、数量存储数据的硬盘驱动器、加载模式等
  • 默认值
    • worker_processes 1;
worker_processes auto;

【2】worker_cpu_affinity auto|cpumask ...;

  • 作用域
    • main
  • 含义解释
    • 绑定worker进程至指定的CPU上
    • 默认情况下,工作进程不绑定到任何特定的CPU上的
    • 绑定进程不能避免进程间切换,但是至少可以保证该进程的缓存不会失效
# 绑定工作进程到指定的CPU集合
1. 每个CPU集合使用一个标记允许使用的CPU的位图来表示,需要为每个工作进程分别设置CPU集合
worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

1. 如果位数不够表示了,可以使用更多的位数
worker_processes    6;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;
# 适合于超线程的机器
1. 将每个工作进程分别绑定至不同的CPU
1. 将第一个工作进程绑定至CPU0/CPU2,将第二个工作进程绑定至CPU1/CPU3
worker_processes    2;
worker_cpu_affinity 0101 1010;

【3】ssl_engine device;

  • 作用域
    • main
  • 含义解释
    • 在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备
ssl_engine ssl-speed-hr;

【4】timer_resolution interval;

  • 作用域
    • main
  • 含义解释
    • 计时器解析度:降低此值可以减少gettimeofday()的调用次数
    • 默认情况下,每收到一个内核事件,nginx都会调用一次gettimeofday()方法
    • 在x86-64系统上,gettimeofday()代价已经很小,可以忽略此配置
timer_resolution 100ms;

【5】worker_priority number;

  • 作用域
    • main
  • 含义解释
    • 定义worker进程的调度优先级
    • 与nice命令基本一致,number为负数代表优先级更高
    • 范围为-20, 19对于值为100, 139
  • 默认值
    • worker_priority 0;
# 调为负值的时候,可以让CPU优先处理nginx的进行请求
worker_priority -10;

【6】worker_shutdown_timeout time;

  • 作用域
    • main
  • 含义解释
    • 配置worker进程的优雅的关闭时长,过期后将尝试关闭所有当前打开的连接之后重启
    • 版本1.11.11之后,该指令才可以使用
worker_shutdown_timeout 100s;

【7】pcre_jit on | off;

  • 作用域
    • main
  • 含义解释
    • 开启或禁止在配置解析阶段为正则表达式使用即时编译(PCRE JIT)技术,可以显著提升正则表达式的处理速度
    • 从PCRE 8.20版本开始,可用PCRE的--enable-jit编译选项打开JIT功能
    • 当使用PCRE源码库编译nginx时(--with-pcre=), 应该使用nginx的--with-pcre-jit编译选项开启JIT支持
  • 默认值
    • pcre_jit off;
pcre_jit on;

1.3 event 事件相关的配置

【1】events { ... }

  • 作用域
    • main
  • 含义解释
    • 提供配置上下文,以解析那些影响连接处理的指令
events {
    accept_mutex on;
    accept_mutex_delay 100ms;
    worker_connections 10240;
    ...
}

【2】accept_mutex on|off;

  • 作用域
    • events
  • 含义解释
    • master进程将请求调度至各worker进程时用的负载均衡锁
    • 如果使用,nginx的多个worker进程将以串行方式轮流响应新请求
    • 而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不再将请求调度此worker
    • 否则,新请求将通报给所有worker进程,如果新请求数量较少,某些worker进程可能只是在浪费系统资源
    • 必须开启accept_mutex才能使用rtsig事件模型
  • 默认值
    • accept_mutex on;
accept_mutex off;

【3】accept_mutex_delay time;

  • 作用域
    • events
  • 含义解释
    • 使用accept_mutex时,发现某个worker进程正在工作,自身需要等待多久重新开始尝试接入新请求
  • 默认值
    • accept_mutex_delay 500ms;
accept_mutex_delay 100ms;

【4】lock_file file;

  • 作用域
    • main
  • 含义解释
    • nginx使用锁机制来实现accept_mutex,并将访问串行化到共享内存
    • 定义accept_mutex使用的锁文件位置
  • 默认值
    • lock_file logs/nginx.lock;
lock_file /etc/nginx/lock/nginx.lock;

【5】multi_accept on|off;

  • 作用域
    • events
  • 含义解释
    • 是否允许一次性地响应多个用户请求,默认为off模式
    • 使用kqueue事件模式时,可忽略这条指令,因为 kqueue 可以报告有多少新连接等待接入
    • 使用 rtsig 事件模式将自动开启 multi_accept
  • 默认值
    • multi_accept off;
multi_accept on;

【6】use method;

  • 作用域
    • events
  • 含义解释
    • 定义nginx使用的事件模型
    • 通常不需要明确设置,因为nginx默认会使用最高效的方法
use epoll;

【7】worker_connections number;

  • 作用域
    • events
  • 含义解释
    • 设置每个worker进程可以响应的最大并发请求数
    • 请求数量 = work_processes * worker_connections
    • 需要记住,这个数量包含所有连接而不仅仅是和客户端的连接
    • 实际的并发连接数是不能超过打开文件的最大数量限制的,这个限制可以用worker_rlimit_nofile指令修改
  • 默认值
    • worker_connections 512;
worker_connections 10240;

【8】worker_aio_requests number;

  • 作用域
    • events
  • 含义解释
    • 在使用epoll事件模型下使用aio时, 可以设置单个工作进程未处理的异步I/O操作的最大数量
    • 只在版本1.1.4和1.0.7可以使用该指令
  • 默认值
    • worker_aio_requests 32;
worker_aio_requests 64;

1.4 调试/定位相关的配置

部分参数设置需要在编译nginx时使用了--with-debug选项才有效

【1】daemon on|off;

  • 作用域
    • main
  • 含义解释
    • 是否以守护进程方式启动nginx服务,调试时设置为off,运行时设置为on
    • 不运行为守护进程,会将日志等信息输出到控制台,主要用于开发和调试时才使用
  • 默认值
    • daemon on;
daemon off;

【2】master_process on|off;

  • 作用域
    • main
  • 含义解释
    • 是否以master/worker模型来运行nginx服务
    • 调试时可以设置为off,表示由master直接接受用户请求
  • 默认值
    • master_process on;
master_process off;

【3】error_log file [level];

  • 作用域
    • main、http、server、location
  • 含义解释
    • 错误日志文件及其级别,出于调试的目的可以使用debug级别
    • 但此级别只有在编译nginx时使用了--with-debug选项才有效
    • level的值可以为debug|info|notice|warn|error|crit|alert|emerg,默认为error
    • 输出可以为文件(file)、标准输出(stderr)、日志服务器(syslog)、内存空间(memory)
  • 默认值
    • error_log logs/error.log error;
# 文件
error_log /var/logs/error.log info;

1. 标准输出
error_log stderr error;

1. 日志服务器
1. 格式:syslog:server=address{,parameter=value}
error_log syslog:server=192.168.100.10 warn;

1. 内存空间
error_log memory:10240;

2. 虚拟主机相关

Nginx必须使用虚拟机来配置站点,且每个虚拟主机使用一个server {}段配置,非虚拟主机的配置或公共配置,需要定义在server之外和http之内。

2.1 常规运行相关的配置

【1】http { ... }

  • 作用域
    • main
  • 含义解释
    • 为HTTP服务器提供配置
http {
    server {
        listen 8080;
        server_name www.wsescape.com;
        root "/nginx/web";
    }
}

【2】server {}

  • 作用域
    • http
  • 含义解释
    • 表示开始设置虚拟主机的配置
    • Nginx没有明显分隔基于 IP 地址(IP-based)和基于主机名(name-based)这两种类型的虚拟主机, 而是用listen指令描述虚拟主机接受连接的地址和端口,用server_name指令列出虚拟主机的所有主机名
http {
    server {
        listen 8080;
        server_name www.wsescape.com;
        root "/nginx/web";
    }
}

【3】listen address[:port];

  • 作用域
    • server
  • 含义解释
    • 定义虚拟主机监听的地址和端口
    • 对于IP协议,这个地址就是address和port
    • 对于UNIX域套接字协议,这个地址就是path
  • 默认值
    • listen *:80|*:8000;
# IPv4地址的表示方式
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;

1. IPv6地址(0.7.36版)用方括号来表示
listen [::]:8000;
listen [fe80::1];

1. UNIX域套接字(0.8.21版)则使用“unix:”前缀
listen unix:/var/run/nginx.sock;

1. 配置服务器可以处理HTTP和HTTPS请求
listen 80;
listen 443 ssl;

1. 配置带参数的listen
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;

1. 在这些操作系统上(Linux 2.4+)可以使用keepidle,keepintvl和keepcnt参数来配置
1. 空闲超时(TCP_KEEPIDLE)、探测次数(TCP_KEEPCNT)、探测时间间隔(TCP_KEEPINTVL)
1. 设置空闲超时为30分钟,设置探测次数为10次,保留探测时间间隔为系统默认值
so_keepalive=30m::10
# 第一种表达方式
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

1. 第二种表达方式
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

1. 第三种表达方式
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
版本0.8.21以前,default_server参数的名称为default
版本0.7.14以前,才可以使用ssl参数,配置服务器可以处理HTTP和HTTPS请求
版本1.9.5以前,才可以使用http2参数,配置服务器可以支持HTTP/2协议
版本1.3.15-1.9.4之间,可以支持谷歌开发的SPDY协议,基本不用
版本1.5.12以前,才可以使用proxy_protocol参数,允许指定所有连接在该端口上接受应该使用代理协议
# (1) default_server参数
如果listen指令带有default_server参数,当前虚拟主机将成为指定address:port的默认虚拟主机。
如果listen指令后没有带default_server参数,那么第一个监听address:port的虚拟主机将作为这个地址的默认虚拟主机。

1. (2) setfib=number参数
这个参数(0.8.44)为监听套接字设置关联路由表FIB,当前这个参数仅工作在FreeBSD上

1. (3) fastopen=number参数
使“TCP快开放”的监听套接字(1.5.8)和连接队列的最大长度限制,尚未完成了三方握手
建议不要启用该参数特性,除非服务器可以处理接收相同的SYN包不止一次的数据

1. (4) backlog=number参数
为系统调用listen()设置backlog参数,用以限制未接受(Accept)连接的队列的最大长度
FreeBSD和Mac的操作系统下,backlog的默认值是-1,在其他操作系统中,backlog的默认值是511

1. (5) rcvbuf=size参数
为监听套接字设置接收缓冲区大小(SO_RCVBUF参数)

1. (6) sndbuf=size参数
为监听套接字设置发送缓冲区大小(SO_SNDBUF参数)

1. (7) deferred参数
指示在Linux系统使用延迟的accept()

1. (8) bind参数
指示nginx为设置的address:port单独调用一次bind()。这是因为当有多条listen指令监听不同地址下的
相同端口,而其中一条listen指令监听了这个端口的所有地址(*:port)时,nginx只会为*:port调用一次
bind()绑定套接字。需要留意的是,这种情况下,nginx会调用getsockname()系统调用来确定接受请求的
套接字地址。 如果为某个address:port定义了参数backlog、rcvbuf、 sndbuf、accept_filter、
deferred或者so_keepalive, nginx总会为这个地址单独调用一次bind()绑定套接字。

1. (9) ipv6only=on|off参数
这个参数(0.7.42)决定监听在通配地址[::]上的IPv6套接字是只支持IPv6连接,还是同时支持IPv6和IPv4连接
这个参数默认打开,并且只能在nginx启动时设置
在1.3.4版本以前,如果省略此参数,那么操作系统的套接字设置将生效

1. (10) ssl参数
本参数(0.7.14)与套接字相关的系统调用无关,但是它可以指定从这个端口接受的连接应该以SSL模式工作
本参数在某服务器同时处理HTTP和HTTPS请求时,可以使配置更为紧凑。

1. (11) so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]参数
这个参数(1.1.11)为监听套接字配置“TCP keepalive”行为,如果省略此参数设置将对此端口生效
如果参数值设置为on,监听套接字的SO_KEEPALIVE属性将被开启
如果参数值设置为off,监听套接字的SO_KEEPALIVE属性将被关闭

【4】server_name name ...;

  • 作用域
    • server
  • 含义解释
    • 设置虚拟主机名
    • 可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以~开头)
    • 当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较
  • 默认值
    • server_name "";
# 匹配比较优先顺序
(1) 先做精确匹配:如www.escape.com
(2) 左侧通配符匹配:如*.escape.com
(3) 右侧通配符匹配:如www.abc.com, www.*
(4) 正则表达式匹配:如~^.*.escape.com$
# 设置单个虚拟主机名称
server {
    server_name .example.com;
}
1. 设置多个虚拟主机名称
server {
    server_name www.example.com ~^wwwd+.example.com$;
}

【5】server_names_hash_bucket_size size;

  • 作用域
    • http
  • 含义解释
    • 设置主机名哈希桶大小,其默认值取决于处理器的缓存线长度
    • 为了实现快速主机查找,nginx使用hash表来保存主机名
    • 另一篇文档设置哈希表详细介绍了如何设置哈希表
  • 默认值
    • server_names_hash_bucket_size 32|64|128;
server_names_hash_bucket_size 64;

【6】server_names_hash_max_size size;

  • 作用域
    • http
  • 含义解释
    • 设置主机名哈希表的最大容量
  • 默认值
    • server_names_hash_max_size 512;
server_names_hash_max_size 1024;

【7】location [ = | ~ | ~* | ^~ ] uri { ... }

  • 作用域
    • server、location
  • 含义解释
    • 还有一种表达方式:location @name { ... }
    • 允许根据用户请求的URI来匹配指定的各location以进行访问配置
    • 匹配到时,将被location块中的配置所处理,比如http://www.wsescape.com/images/logo.gif
    • 使用=前缀可以定义URI和路径的精确匹配,如果匹配,则终止路径查找
    • 前缀@定义了命名路径,这种路径不在一般的请求处理中使用, 而是用在请求重定向中
# 匹配比较优先顺序:字符字面量最精确匹配、正则表达式检索(由第一个匹配到所处理)、按字符字面量
(1) =:精确匹配
(2) ~:正则表达式模式匹配,匹配时区分字符大小写
(3) ~*:正则表达式模式匹配,匹配时忽略字符大小写
(4) ^~: URI前半部分匹配,不检查正则表达式
location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* .(gif|jpg|jpeg)$ {
    [ configuration E ]
}

2.2 文件路径相关的匹配

【1】root path;

  • 作用域
    • http、server、location、if in location
  • 含义解释
    • 设置Web资源路径,用于指定请求的根文档目录
  • 默认值
    • root html;
# /index.html将由/www/htdocs/index.html文件来响应
location / {
    root /www/htdocs;
}

1. /images/b.html将由/data/w3/images/b.html文件来响应
location /images/ {
    root /data/w3;
}

【2】alias path;

  • 作用域
    • location
  • 含义解释
    • 只能用于location中,用于路径别名
# /i/top.gif将由/data/w3/images/top.gif文件来响应
location /i/ {
    alias /data/w3/images/;
}

1. /images/b.html将由/data/w3/b.html文件来响应
location /images/ {
    alias /data/w3/;
}

1. /images/b.html将由/data/w3/images/b.html文件来响应
location /images/ {
    alias /data/w3/images/;
}

location ~ ^/users/(.+.(?:gif|jpe?g|png))$ {
    alias /data/w3/images/$1;
}

【3】index file ...;

  • 作用域
    • http、server、location
  • 含义解释
    • 定义默认页面,可参跟多个值,列表中的最后一个元素可以是一个带有绝对路径的文件
    • 模块ngx_http_index_module处理以斜线字符/结尾的请求
  • 默认值
  • index index.html;
location / {
    index index.$geo.html index.0.html /index.html;
}
# 需要注意的是,index文件会引发内部重定向,请求可能会被其它location处理
1. 如下面这个例子中,请求“/”实际上将会在第二个location中作为“/index.html”被处理
location = / {
    index index.html;
}

location / {
    ...
}

【4】error_page code ... [=[response]] uri

  • 作用域
    • http、server、location、if in location
  • 含义解释
    • 定义错误页面重定向
    • 当对于某个请求返回错误时,如果匹配上了error_page指令中设定的code,则重定向到新的URI中
# 一般的设置方式
error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

1. 可以使用=response语法改变响应状态码,响应的如果是404的话返回给用户200页面
error_page 404 =200 /empty.gif;

1. 也可以使用本指令对错误处理进行重定向
error_page 403      http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;

1. 如果内部跳转时无需改变URI,可以将错误处理转到一个命名路径
location / {
    error_page 404 = @fallback;
}

location @fallback {
    proxy_pass http://backend;
}

【5】try_files file ... uri;

  • 作用域
    • server、location
  • 含义解释
    • 还有一种表达方式:try_files file ... =code;
    • 自左至右尝试读取指定的路径,在第一次找到即停止并返回,如果所有路径均不存在,则返回最后一个URI
    • 文件路径是根据root指令和alias指令,将file参数拼接而成
    • 可以在名字尾部添加斜线以检查目录是否存在,比如$uri/
# $uri表示请求的路径
location /images/ {
    try_files $uri /images/default.gif;
}
location = /images/default.gif {
    expires 30s;
}
# /documents/a.html请求,先查找/docu/a.html,在查找/temp.html
location ~* ^/documents/(.*)$ {
    root /www/htdocs;
    try_files $uri /docu/$1 /temp.html;
}

1. 从0.7.51版本开始,最后一个参数也可以是code
location / {
    try_files $uri $uri/index.html $uri.html =404;
}
# 下面是代理Mongrel的例子
location / {
    try_files /system/maintenance.html
              $uri $uri/index.html $uri.html
              @mongrel;
}

location @mongrel {
    proxy_pass http://mongrel;
}

1. 下面是Drupal用FastCGI的例子
location / {
    try_files $uri $uri/ @drupal;
}

location ~ .php$ {
    try_files $uri @drupal;
    fastcgi_pass ...;
    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
    fastcgi_param QUERY_STRING    $args;
    ... other fastcgi_param's
}

location @drupal {
    fastcgi_pass ...;
    fastcgi_param SCRIPT_FILENAME /path/to/index.php;
    fastcgi_param SCRIPT_NAME     /index.php;
    fastcgi_param QUERY_STRING    q=$uri&$args;
    ... other fastcgi_param's
}

2.3 网络连接相关的设置

【1】keepalive_timeout timeout [header_timeout];

  • 作用域
    • http、server、location
  • 含义解释
    • 保持连接的超时时长
    • 第一个参数设置客户端的长连接在服务器端保持的最长时间,在此时间客户端未发起新请求则长连接关闭
    • 第二个参数为可选项,设置Keep-Alive: timeout=time响应头的值
    • 可以为这两个参数设置不同的值
  • 默认值
    • keepalive_timeout 75s;
keepalive_timeout 360s;

【2】keepalive_requests number;

  • 作用域
    • http、server、location
  • 含义解释
    • 在一次长连接上允许承载的最大请求数,请求数超过此值时长连接将关闭
    • 在0.8.0版本之后才可以使用该指令
  • 默认值
    • keepalive_requests 100;
keepalive_requests 1000;

【3】keepalive_disable none|browser ...;

  • 作用域
    • http、server、location
  • 含义解释
    • 对指定的浏览器禁止使用长连接
    • 浏览器可以为:msie6 | safari | none,值为none表示为所有浏览器开启长连接功能
  • 默认值
    • keepalive_disable msie6;
keepalive_disable none;

【4】tcp_nodelay on|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 对keepalive连接是否使用TCP_NODELAY选项,仅在将连接转变为长连接的时候才被启用
    • TCP_NODELAY选项的功能就是响应报文不经过内核直接返回给客户端,加载网站的响应速度
    • 一般在upstream发送响应到客户端时也会启用
  • 默认值
    • tcp_nodelay on;
tcp_nodelay off;

【5】client_header_timeout time;

  • 作用域
    • http、server
  • 含义解释
    • 读取http客户端请求首部的超时时长
    • 如果客户端在这段时间内没有传送完整的头部到服务器,将返回错误408(Request Time-out)给客户端
  • 默认值
    • client_header_timeout 60s;
client_header_timeout 10s;

【6】client_body_timeout time;

  • 作用域
    • http、server、location
  • 含义解释
    • 读取http请求包体的超时时长
    • 超时是指相邻两次读操作之间的最大时间间隔,而不是整个请求正文完成传输的最大时间
    • 如果客户端在这段时间内没有传输任何数据,服务器将返回408(Request Time-out)错误到客户端
  • 默认值
    • client_body_timeout 60s;
client_body_timeout 10s;

【7】send_timeout time;

  • 作用域
    • http、server、location
  • 含义解释
    • 服务器发送响应的超时时长
    • 超时仅指两次相邻写操作之间的时间间隔,而非整个响应的传输时间
    • 如果客户端在这段时间中没有收到任何数据,连接将关闭
  • 默认值
    • send_timeout 60s;
send_timeout 10s;

2.4 对客户端请求的限制

【1】client_max_body_size size;

  • 作用域
    • http、server、location
  • 含义解释
    • 设置允许客户端请求正文的最大长度,请求的长度由Content-Length请求头指定
    • 如果请求的长度超过设定值,服务器将返回错误413(Request Entity Too Large)到客户端
    • 将size设置成0可以使nginx不检查客户端请求正文的长度
  • 默认值
    • client_max_body_size 1m;
client_max_body_size 2m;

【2】limit_except method ... { ... }

  • 作用域
    • location
  • 含义解释
    • 指定对范围之外的其它方法的访问控制
    • HTTP方法可选值有GET、HEAD、 POST、 PUT、 DELETE、 OPTIONS、PATCH等
    • 指定method为GET方法的同时,nginx会自动添加HEAD方法
    • 由ngx_http_access_module和ngx_http_auth_basic_module模块的指令来限制访问
# 请留意该例子将对除GET和HEAD方法以外的所有HTTP方法的请求进行访问限制
limit_except GET {
    allow 192.168.1.0/32;
    deny  all;
}

【3】limit_rate rate;

  • 作用域
    • http、server、location、if in location
  • 含义解释
    • 限制向客户端传送响应的速率限制,参数rate的单位是字节/秒,设置为0将关闭限速
    • 如果进行连接限速时,某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍
  • 默认值
    • limit_rate 0;
# 也可以利用$limit_rate变量设置流量限制
server {
    if ($slow) {
        set $limit_rate 4k;
    }
    ...
}

【4】limit_rate_after size;

  • 作用域
    • http、server、location、if in location
  • 含义解释
    • 设置不限速传输的响应大小,当传输量大于此值时,超出部分将限速传送
  • 默认值
    • limit_rate_after 0;
location /flv/ {
    flv;
    limit_rate_after 500k;
    limit_rate       50k;
}

2.5 文件操作优化的设置

【1】sendfile on|off;

  • 作用域
    • http、server、location、if in location
  • 含义解释
    • 开启或关闭使用sendfile()调用
  • 默认值
    • sendfile off;
# 从0.8.12版本开始可以使用aio预装数据sendfile()
location /video/ {
    sendfile       on;
    tcp_nopush     on;
    aio            on;
}

【2】aio on|off|threads[=pool];

  • 作用域
    • http、server、location
  • 含义解释
    • 是否启用异步文件 I/O(AIO)功能
    • 在0.8.11版本之后才可以使用该指令
  • 默认值
    • aio off;
location /video/ {
    aio            on;
    output_buffers 1 64k;
}
# 从Linux内核2.6.22版开始也可以使用AIO,但必须同时开启directio,否则读取将是阻塞的
1. 在Linux上,directio指令只在读取的块的边界对齐512字节(在XFS上是4K字节)时才有用
location /video/ {
    aio            on;
    directio       512;
    output_buffers 1 128k;
}

1. 如果在Linux上同时使用AIO和sendfile
1. AIO用于大于或等于directio指令指定的文件,sendfile用于小于directio指令指定的文件或directio未设置
location /video/ {
    sendfile       on;
    aio            on;
    directio       8m;
}

1. 在1.7.11版本之后,文件读取也可以使用多线程,实现真正的无阻塞进程
1. 默认情况下,多线程功能是未开启的,需要在编译的时候通过--with-threads参数指定
location /video/ {
    sendfile       on;
    aio            threads;
}

【3】open_file_cache off|max=N [inactive=time];

  • 作用域
    • http、server、location
  • 含义解释
    • 是否打开文件缓存功能
    • 可缓存打开文件描述符的大小和修改时间、目录查找结果、文件查找时的错误结果
    • max设置缓存中元素的最大数量,当缓存溢出时,使用最近最少使用(LRU)算法删除缓存中的元素
    • inactive设置超时,在这段时间内缓存元素如果没有被访问,将从缓存中删除,默认超时是60秒
    • 如果设置为off则关闭缓存
  • 默认值
    • open_file_cache off;
open_file_cache          max=1000 inactive=20s;
open_file_cache_valid    30s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;

【4】open_file_cache_errors on|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 开启或者关闭缓存文件找不到或没有权限访问等相关信息
  • 默认值
    • open_file_cache_errors off;
open_file_cache_errors on;

【5】open_file_cache_min_uses number;

  • 作用域
    • http、server、location
  • 含义解释
    • 设置在由open_file_cache指令的inactive参数配置的超时时间内,文件应该被访问的最小次数
    • 如果访问次数大于等于此值,文件描述符会保留在缓存中,否则从缓存中删除
  • 默认值
    • open_file_cache_min_uses 1;
open_file_cache_min_uses 10;

【6】open_file_cache_valid time;

  • 作用域
    • http、server、location
  • 含义解释
    • 设置检查open_file_cache缓存的元素的时间间隔,默认为60s
  • 默认值
    • open_file_cache_valid 60s;
open_file_cache_valid 30s;

2.6 对客户端请求的处理

【1】ignore_invalid_headers on | off;

  • 作用域
    • http、server
  • 含义解释
    • 控制是否忽略非法的请求头字段名,默认为on
    • 合法的名字是由英文字母、数字、下划线和连字符组成,由underscores_in_headers指令控制
    • 可以在默认虚拟主机的server层中定义一次,那么监听在相同地址和端口的所有虚拟主机上都生效
  • 默认值
    • ignore_invalid_headers on;
ignore_invalid_headers on;

【2】log_not_found on|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 是否将文件找不到的信息也记录进在错误日志(error_log)中去
  • 默认值:
    • log_not_found on;
log_not_found on;

【3】log_subrequest on|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 是否将文件找不到的信息也记录进在错误日志(access_log)中去
  • 默认值:
    • log_subrequest off;
log_subrequest off;

【4】resolver address ... [valid=time];

  • 作用域
    • http、server、location
  • 含义解释
    • 指定nginx使用的DNS服务器地址,多台的话以轮询方式
    • 可以指定域名或者IP地址,如果未指定端口,则使用53端口
    • 可以缓存名字解析的结果,默认情况下,缓存时间为解析响应中的TTL字段的值,也允许通过valid参数覆盖
    • 在1.1.9版本以前,不可能调节缓存时间,nginx总会将响应缓存5分钟
resolver 127.0.0.1 [::1]:5353;
resolver 127.0.0.1 [::1]:5353 valid=30s;

【5】resolver_timeout time;

  • 作用域
    • http、server、location
  • 含义解释
    • 为名字解析设置超时
  • 默认值
    • resolver_timeout 30s;
resolver_timeout 5s;

【6】server_tokens on | off;

  • 作用域
    • http、server、location
  • 含义解释
    • 开启或关闭在错误信息的Server响应头中输出nginx版本号
  • 默认值
    • server_tokens on;
server_tokens on;

【7】chunked_transfer_encoding on|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 允许关闭HTTP/1.1中的分块传输编码
    • 在客户端软件不支持分块传输编码的时候,这条指令才有用
  • 默认值
    • chunked_transfer_encoding on;
chunked_transfer_encoding on;

2.7 内存及磁盘资源分配

【1】client_body_buffer_size size;

  • 作用域
    • http、server、location
  • 含义解释
    • 设置读取客户端请求正文的缓冲容量大小
    • 如果请求正文大于缓冲容量,整个正文或者正文的一部分将写入临时文件
    • 缓冲大小默认等于两块内存页的大小,在x86平台、其他32位平台和x86-64平台,这个值是8K
    • 在其他64位平台,这个值一般是16K
  • 默认值
    • client_body_buffer_size 8k|16k;
client_body_buffer_size 8k;

【2】client_body_in_file_only on|clean|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 决定nginx是否将客户端请求正文整个存储在磁盘文件中
    • 非off表示存储,即使包体大小为0也会创建一个磁盘文件
    • 当指令值设置为on时,请求处理结束后不会删除临时文件
    • 当指令值设置为clean时,请求处理结束后会删除临时文件
  • 默认值
    • client_body_in_file_only off;
client_body_in_file_only on;

【3】client_body_in_single_buffer on|off;

  • 作用域
    • http、server、location
  • 含义解释
    • 决定nginx将整个客户端请求正文保存在一块缓冲区中
    • 这条指令推荐在使用$request_body变量时使用,可以节省引入的拷贝操作
  • 默认值
    • client_body_in_single_buffer off;
client_body_in_single_buffer on;

【4】client_body_temp_path path [level1 [level2 [level3]]];

  • 作用域
    • http、server、location
  • 含义解释
    • 定义存储客户端请求正文的临时文件的目录
    • 支持在指定目录下多达3层的子目录结构
  • 默认值
    • client_body_temp_path client_body_temp;
# 1表示只使用一个数字,2表示使用两个数字的组合
1. 存储临时文件的路径是/spool/nginx/client_temp/7/45/00000123457
client_body_temp_path /spool/nginx/client_temp 1 2;

【5】client_header_buffer_size size;

  • 作用域
    • http、server
  • 含义解释
    • 设置读取客户端请求头部的缓冲容量,默认为1k
    • 如果请求中含有的cookie很长或者请求来自WAP的客户端,可能请求头不能放在1K的缓冲中
    • 如果从请求行或者某个请求头开始不能完整的放在这块空间中,那么nginx将按照large_client_header_buffers指令的配置分配更多更大的缓冲来存放
  • 默认值
    • client_header_buffer_size 1k;
client_header_buffer_size 2k;

【6】large_client_header_buffers number size;

  • 作用域
    • http、server
  • 含义解释
    • 设置读取客户端请求超大请求的缓冲最大数量和每块缓冲的容量
    • HTTP请求行的长度不能超过一块缓冲的容量,否则nginx返回错误414(Request-URI Too Large)到客户端
    • 每个请求头的长度也不能超过一块缓冲的容量,否则nginx返回错误400(Bad Request)到客户端
    • 缓冲仅在必需是才分配,默认每块的容量是8K字节
    • 即使nginx处理完请求后与客户端保持入长连接,nginx也会释放这些缓冲
  • 默认值
    • large_client_header_buffers 4 8k;
large_client_header_buffers 4 8k;

【7】connection_pool_size size;

  • 作用域
    • http、server
  • 含义解释
    • 允许微调为每个连接分配的内存,默认为256
    • 这条指令对nginx的性能影响非常小,一般不应该使用
  • 默认值
    • connection_pool_size 256;
connection_pool_size 512;

【8】request_pool_size size;

  • 作用域
    • http、server
  • 含义解释
    • 允许对每个请求的内存分配进行细调,默认为4k
    • 这条指令对性能影响很小,通常情况下不应使用
  • 默认值
    • request_pool_size 4k;
request_pool_size 2k;

3. 高级配置相关

Nginx的高级配置会涉及到虚拟主机配置、访问控制、用户认证等。

3.1 基于 IP 地址的访问控制

主要事项

  • ngx_http_access_module模块提供限制某些IP地址的客户端访问
  • 也可以通过用户名/密码或JWT来实现限制访问,使用satisfy指令就能同时通过IP地址和密码来限制访问
  • 在规则很多的情况下,使用ngx_http_geo_module模块变量更合适

提供指令

  • allow
    • 语法格式:allow address|CIDR|unix:|all;
    • 含义解释:允许指定的网络地址访问
    • 作用范围:http、server、location、limit_except
  • deny
    • 语法格式:deny address|CIDR|unix:|all;
    • 含义解释:拒绝指定的网络地址访问
    • 作用范围:http、server、location、limit_except