全局配置置与顶层配置块
nginx.conf从整体上讲分全局配置main, 顶层配置块及子配置块。放在配置文件中,不用{}括起来的部分是全局配置,第一层用{}括起来的是顶层配置块,在顶层配置块中,再用{}括起来的是子配置块。顶层配置块目前有http 、event 、stream。
main 全局配置
全局配置是Nginx在运行时与具体业务功能(如HTTP服务或者E-mail服务代理)无关的一些参数,如工作进程数、运行的身份等。全局配置在配置文件最外层。
1.工作进程数
语法:worker_processes number I auto;
默认:worker_process 1;
配置块: 全局。
说明:在配置文件的全局main 部分,管理进程接收任务并将请求分配给工作进程处理,工作进程是实际的处理进程。工作进程的个数可以设置为CPU 的核数(grep ^processor/proc/cpuinfoIwe -1),也可以是auto值,如果开启了ss l 和gzip 更应该设置成与逻辑CPU数量一样甚至为2 倍,可以减少I/ O 操作。如果Nginx服务器还有其他服务,可以考虑适当减少。
2.绑定工作进程到指定的CPU 内核
语法:worker cpu affinity cpumask[ cpumask .. ·]
默认:无。
配置块:全局。
说明:如果CPU 非常繁忙,不一定会把每一个工作进程分配到一个核心上,通过本指令手工指定会得到真正的并发(仅对Linux有效)。例如:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
3.工作进程最大打开文件数
语法:worker rlimit nofile number;
默认: 元。
配置块: 全局。
说明: 改变工作进程最大打开文件数,修改配置无须重启管理进程。
4. 工作进程的当前工作路径
语法:worker_directory directory;
默认: 无。
配置块: 全局。
说明: 定义当前工作进程的工作路径,主要用于生成coredump 文件, 工作进程所在用
户和组需要对工作目录有写权限。
5. 工作进程优先级
语法:worker_priority number;
默认:worker_priority O;
配置块: 全局。
说明: 定义工作进程的优先级,取值范围为-20 ~ +20 。
6. coredump 文件最大尺寸
语法:worker rlimit core size;
默认:无。
配置块:全局。
说明:定义工作进程cored ump 文件尺寸,改动无须重启管理进程。
7 . 是否以守护进程方式运行Nginx
语法:daemon onloff;
默认:daemon on ;
配置块: 全局。
说明:指明是否以守护进程方式运行Nginx ,默认为打开。
8. 是否以master_process 方式工作
语法:master_process onloff;
默认:master process on;
配置块:全局。
说明:指明工作进程是否马上启动,主要用于Nginx 深度开发使用,不是常规配置功能项。
9. error 日志设置
语法:error log /path/file level;
默认:error_log logs/error.log err;
配置块: main 、http 、mail 、stream 、server 、location
说明:设置日志文件路径名,还可以设置要写入的错误级别。
10. 定义环境变量
语法:env VARIVAR=Value;
配置块:全局。
说明:直接设置操作系统上的环境变量。例如:
env MACCOC OPTIONS;
env PERLSLIB=/data/site/modules;
env OPENSSL ALLOW PROXY CERTS=l;
11. 引用其他配置文件
语法:include / path/file;
默认: 元。
配置块: any
说明:文件名可以是绝对路径,也可以是相对路径,如果是相对路径,就是nginx.conf所在的路径。例如:
include mime.types;
include /usr/local/ip_limit.conf;
12. 锁定文件
语法:lock file file;
默认:lock file logs/nginx.lock;
配置块:全局。
说明: Nginx 使用锁定文件实现accept_mutex 。在多数系统上,这个锁用原子操作实现,则这个值就被忽略掉了。这个配置在使用lock file 机制的系统上使用。
13 . 设置pid 文件路径
语法:pid path/file;
默认:pid logs/nginx.pid;
配置块: main 。
说明:设置保存管理进程ID 的文件,用于使用进程ID 操作Nginx 的环境。
14. 设置工作进程运行时的用户及用户组
语法:user username[groupn 缸ne];
默认:user nobody;
配置块: main 。
说明:指定工作进程工作时的用户和用户组,主要在Linux 和UNIX 上使用。
15. SSL 硬件加速
语法:ssl一engine device;
说明:如果服务器上有SSL 硬件加速设备,可以通过配置实现硬件加速。可以使用Open SSL 命令查看是否有硬件设备:openssl engine -t;
16. 工作进程中多线程读和写的线程池
语法:thread_pool name threads=number [max_queue=number];
默认:thread pool default threads=32 max queue=65535;
配置块: main 。
说明:这条指令从1.7.1 l 版本出现,定义工作进程中对文件读和写时用到的线程池。threads 参数定义线程池中线程的数量。max_queue 限制允许在队列中等待的任务,默认是65 536 个任务。队列超出时,任务将返回一个错误信息。
17. 工作进程时间频率
语法:timer resolution interval;
默认: 无。
配置块: main 。
说明:早期的Linux 中, gettimeofday 是一个系统调用,需要进行一次核心态和用户态的切换,所以需要限制。现在的内核中,gettimeofday 仅是一次vsysc all , 是对共享内存中的数据做访问,代价不大,所以目前通常不需要考虑这个问题。
events 配置块
events 模块中包含Nginx 中所有处理连接的设置。events 是Nginx 使用到的I/O 事件模型,是最主要的进出交互部分。Nginx 强大的部分就是在Linux 上完美实现了e poll 模型。这里定义events 的模型选择和参数。
常用配置项如下:
events{
use epoll;
worker connections 20000;
}
1. 设置事件模型
语法:use method;
默认: 无。
配置块: events 。
说明: method 取值为[ kqueue I rtsig I epoll I /dev/poll I select I poll ]; 指令用于确定使用的事件模型, 一般在Linux 下用epoll 。如果不设置本值, Nginx 会自动确定事件模型。
( 1 )标准事件模型
select 、poll 属于标准事件模型,如果当前系统不存在更有效的方法, Nginx 会选择select 或poll 。
( 2 )高效事件模型
kqueue :用于FreeBSD 4 .1+ 、OpenBSD 2.9 + 、NetBSD 2 . 0 和Mac OS X 。使用双处理器的Mac OS X 系统使用kqueue 可能会造成内核崩溃。
epoll :用于Linux 内核2.6 版本及以后的系统。
/dev / poll :用于Solaris 7 11199+ 、HP几JX 11.22+ (eventport)、IRIX 6.5.15 +和Tru64 UNIX5.lA+ 。
eventport :用于Solaris 10 。为了防止出现内核崩溃的问题,有必要安装安全补丁程序。
查看linux 版本号可以使用cat /proc/version 命令。
2. 每个工作进程的最大连接数
语法:worker connections number;
默认:worker connections 512;
配置块: event 。
说明:写在events 部分,指每一个工作进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数) 。当Nginx 作为反向代理服务器时,计算公式为最大连接数= worker _processes °¡ worker_ connections/4 ,所以这里客户端最大连接数是1024 ,这个可以增大到8192 , 看情况而定,但不能超过worker_rlimit_ nofile 。当Nginx 作为http 服务器时,以上计算公式里面改为除以2 。
3. 工作进程并发接收
语法:multi_accept onioff;
默认:multi_accept off;
配置块: events 。
说明:如果multi_accept 是禁用的, 一个工作进程同一时刻只能接收一个新的连接,否则,可以在同一时刻接收所有的连接。当类型是kqueue 时,这个配置指令会被自动忽略。
4. AIO 最大输出数
语法:worker_aio_requests number;
默认:worker aio request 32;
配置块: event s 。
说明:当在epoll 连接处理方法中使用AIO 时,设置单工作进程AIO 输出的最大数。
HTTP服务器配置块
HTTP 模块是Nginx 中重要的模块,顾名思义, 这是处理HTTP 请求的模块。HTTP 模块中一般使用HTTP 全局配置参数控制整体行为,使用server 配置虚拟主机,包含监听地址、文档路径和各种location 。反向代理、负载均衡等都是在内部的ser v er 等模块实现的。同时在各个子配置块或location 等内部划分了许多阶段( phase ),这些阶段可以注册Lua 代码或Lua 文件,干预处理的过程。一个典型的Web 服务器会包含全局配置、多个serve r 块和多个l oca tion 块:
http{
gzip on;
upstream{
…
}
…
server{
listen localhost:80;
…
location /webstatic {
if ... {
…
}
root /opt/webresource;
…
}
location ~* . (jpg Jjpeg I png I jpe I gif) $ {
…
}
}
server{
…
}
}
Nginx 为Web 服务器提供了很多配置项, 这些配置项有的可以出现在任意一个配置块中, 有的只能在特定的块中, 这点在查看配置项描述时需要注意一下。
1.监听端口
语法:listen address[ :port] [default_server] [ssl] [http2 I spdy] [proxy_protocol]
[ setfib=number] [ fastopen=number] [ backlog=number] [ rcvbuf=size] [ sndbuf=size]
[ accept_filter=filter] [deferred] [bind] [ ipv6only=on I off] [reuseport] [ so_keepalive
=on I off I [ keepidle]: [ keepintvl]: [ keepcnt]];
listen port [default_server] [ssl] [http2 I spdy] [proxy_protocol] [setfib=number]
[fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter]
[deferred] [bind] [ ipv6only=on I off] [reuseport] [ so_keepalive=on I off I [keepidle]: [kee
pintvl] : [ keepcnt] ] ;
listen unix:path [default_server] [ssl] [http2 I spdy] [proxy_protocol]
[backlog=number] [rcvbuf=size ] [sndbuf=size] [accept_filter=filter] [deferred] [bind]
[so_ keepalive=on I off I [ keepidle]: [ keepintvl] : [ keepcnt]];
默认:listen *:80 I *:8000;
配置块: server 。
说明: listen 参数决定Ng inx 如何监听端口。在listen 后面可以只加IP 、端口或主机名,非常灵活。例如:
listen 127.0.0.1:8000;
listen 127.0 .0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
如果使用IPv6 ,那么可以这样使用:
listen [::]:8000;
listen [ : : l] ;
还可以加其他参数:
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
主要参数的意义如下:
• default :将所在的server 块作为整个Web 服务的默认server 块。如果没有设置这个参数,将以找到的第一个server 块为默认server 块。
• default server :同default 。
• backlog=num :表示TCP 中backlog 队列大小,默认为一1 ,表示不设置。在TCP 三次握手过程中,进程还没有开始处理监听句柄, backlog 队列就会放置这些新连接。如果队列已满,新的客户尝试连接,则会失败。
• rcvbuf=s ize : 设置s o rcvbuf 接收缓冲区大小。
• sndbuf=size :设置so sndbuf 发送缓冲区大小。
• accept_ filter :设置accept 过滤器,只对FreeBSD 操作系统有用。
• deferred : 设置本参数后,客户端建立连接,并且完成了三次握手,也不会调度工作进程来处理,直到客户端实际请求数据到来才分配工作进程处理,适用于大并发情况下减轻工作进程负担。
• bind :绑定当前ip/port 对, 只有在一个端口监听多个地址时才会生效。
• ssl : 在当前监听的端口上建立的连接必须使用SSL 协议。
2. 主机名称
语法:server name name[ ... ];
默认:server name "”;
配置块: server 。
说明: server name 后可以跟多个主机名称。例如:server_name www.google.com mail.google.com;
3. location
语法:location[= I~I~* I^~I@] /uri/ { ... }
配置块: server 。
说明: location 尝试根据用户请求中的URI 匹配上面的/uri 表达式,如果匹配,就选择
location 中的配置处理用户请求。匹配的方式有很多种,下面介绍匹配规则。
1 ) =表示把URI 作为字符串,以便与参数中的uri 做完全匹配。例如:
location = {
# 只有当用户请求,才会作用本location 下的配置
…
}
2)~表示匹配URI 时是大小写敏感的。
3) ~*表示匹配URI 时是大小写不敏感的。
4)~表示匹配时只需要前半部分与URI 匹配即可。例如:
Location ^~/image/{
# 以/ image / 开始的请求都会匹配上
…
}
5 )@表示仅用于Nginx 服务内部请求之间重定向,又名命名location (named location ) 可以在URI 中使用正则表达式,例如:
Location ~* \.(gif | jpg| jpeg)${
# 匹配以.gif 、. jpg 、. jpeg 结尾的请求
}
location 是有顺序的,当一个请求可以匹配多个location 时只会被第一个匹配的location 处理。location 的匹配只能表达如果匹配, 则……”, 如果需要匹配“如果不匹配,则……就比较难实现。可以在最后加一个/ location , 如果前面都没有匹配上,则由“/ ”处理。
4 设置root 路径
语法:root path
默认:html
配置块: http 、server 、location 、if。
例如,定义资源文件相对于HTTP 请求的根目录。
location /download/{
root /opt/web/html/;
}
如果有一个URI 是/download / index /test.html ,那么Web 服务器会返回服务器上/opt/web/html /download/ index / test.html 文件的内容。
5. 以别名方式设置资源路径
语法:alias path;
配置块: location 。
说明: alias 是用来设置文件资源路径的, 与root 的不同点在于如何解读location 后面的uri 参数, alia s 和root 会以不同的方式将用户请求映射到真正的磁盘文件上。例如,有一个请求的URI 是/conf/ nging.co时, 而实际文件在/usr/ local /nginx/conf/ nginx.conf ,那么可以使用下面的方式设置:
location /conf {
alias /usr/local / nginx/conf/;
}
如果用root 设置,则为
location /conf {
root /usr/local/nginx
}
alias 后面也可以添加正则表达式,例如:
location ~^ / test/(\w+)\.(\w+)${
alias /usr/local/nginx/$2/$1.$2;
}
在请求/test/ nging.conf 时, 会返回/usr/ local/nginx/ conf/nginx.conf 文件的内容。root 和alias 配置块不同, root 使用更广。
6. 首页
语法:index file ... ;
默认:index index.html;
配置块: http 、server 、location 。
说明:如果访问站点的URI 是/, 一般返回网站首页。i nd ex 后面可以跟多个参数,Nginx 按照顺序访问这些文件。例如:
location /{
root path;
index /index.html /html/index.php / index.asp;
}
7 . 根据HTTP 返回码重定向页面
语法:error_page code[code ... ][=l=answer-code ]uri l @named_location
配置块: http 、server 、location 、if。
说明: 当某个请求返回错误码时, 如果匹配上了error_page 中设置的页面,则重定向到新的URI 中。例如:
error_page 404 /404.html
error_page 502 503 504 /50x.html
error_page 403 /http://example.com.forbidden.html
error_page 404 =@fetch;
虽然重定向了URI , 但返回的HTTP 错误码还是原来的值,可以使用=更改返回的错误码。例如:
error page 404 =200 /empty.gif;
error page 404 =403 /forbidden.gif;
如果不想修改URI ,只想重定向到另外一个location 中处理,可以这样设置:
location / {
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://backend;
}
其中, 404 请求会被反向代理到http ://backend 上游服务器中。
8. 是否允许递归使用error_page
语法:recursive_error_pages[onloff];
默认:recursive error pages off;
配置块: http 、server 、location 。
说明: 标明是否允许递归定义error_page 。
9. try_ files
语法:try files pathl [path2] uri;
配置块: s erver 、location 。
说明: try _fies 后要跟若干路径,最后必须要有uri 参数,表示尝试按照顺序访问每一
个path ,如果可以有效地读取, 就直接向用户返回这个path 对应的文件并结束请求, 否则
继续向下访问。如果都找不到,就定向到最后的uri 上, 所以这个uri 必须存在,而且应该
是可以有效重定向的。例如:
try files /system/maintenance.html $uri $uri / index.html $uri.html @other;
location @other{
proxy pass http://backend;
}
还可以与error_pag 巳配合使用。例如:
location {
try files $uri $uri/ /error.php?c=404 =404;
}
未完待续。。。