Nginx的主配置文件为“/etc/nginx/nginx.conf”,在主配置文件中使用指令又包含了其他的片段配置文件“/etc/nginx/conf.d/”(源代码安装时可以自己指定配置文件位置)。在配置文件中首先需要知道两个名词,一个是“context”,上下文,代表的是指令的容器或者是指令的生效范围,即,如果一条指令的上下文是“http”,那么就需要将这条指令写到“http”后边的大括号中,这条指令才能够生效;另一个是“derective”,指令,能够发挥nginx功能或特性的配置信息。在书写配置文件时要注意以下几点:
1.所有的指令都必须以“;”结尾
2.所有的上下文都必须使用“{}”括号括选起来,而且不需要使用“;”结尾
3.在设置指令时可以使用配置变量
由模块包含并引入:内置变量
由用户引入:自定义变量
定义变量:
set var_name value
引用变量:
$var_name
4.配置指令可以参考nginx官方网站帮助文档:http://nginx.org/en/docs
或者参考http://tengine.taobao.org/documentation_cn.html
一、全局配置段
在配置文件中整个配置文件叫做“main”,所有上下文为“main”的指令,也称为全局配置段的指令是直接写在配置文件的最外边,我们最常用的全局配置段指令有:
user user [group]; #用于指定运行worker子进程的用户和组
worker_rlimit_nofile number; #每个worker进程所能打开的文件数量的最大值 #也可以通过修改/etc/security/limits.conf完成此设置
worker_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask]; #设置每个CPU核心和worker进程的亲缘性 #例如:worker_cpu_affinity 0010 1000; (意思是绑定在二号和四号cpu上) #四核心的内核写法:0001 0010 0100 1000 #八核心的内核写法:00000001 00000010 ... #ps axo psr(查看命令在哪个核心上运行)
worker_priority number; #设置每个worker进程启动时候的nice值(优先级) #number的范围:[-20,19]
daemon on | off; #是否以守护进程的方式启动nginx:通常是在开发时选择使用
master_process on | off; #是否以master/worker模型启动nginx进程
error_log file [level]; #定义错误日志文件的位置和记录日志的日志级别
thread_pool name threads=number [max_queue=number]; #定义线程池的名称,线程的数量以及每个线程的后援队列长度 #默认有32个线程,队列长度为65536
worker_processes [auto|#] #nginx在运行时产生一个master进程和多个worker进程,这条指令用来指定worker进程数量 #参数是数字或者auto,数字最好不要大过核心数,因为没用,且在切换时浪费 #(不确定就写auto)(通过“ps -aux”命令查看打开了多少个)
pid /var/run/nginx.pid #用于指定存放nginx的master进程编号的文件的路径
二、events配置
events配置段内的指令和主配置中的指令一般情况下是不需要修改的,events中的配置指令有:
worker_connections number; #(默认情况下配置文件中只有这条指令,别的指令使用默认值,要想修改自行添加) #每个worker进程所能够打开的并发连接的最大连接数;默认是512 #当前系统中所能够响应的最大并发连接数: worker_connections * worker_processes(全局配置指令中指定的核心数量)
use method; #指明并发连接请求处理时使用的方法:epoll #use epoll;(只有这个,且只能写这个) #注意:此指令不需要明确指定,nginx会默认使用最有效的方法
accept_mutex on | off; #当此功能启用时,表示可以让多个worker进程一次轮流响应新请求
multi_axccept on|off; #设置每个进程是否可以同时接收多个连接,默认关闭
三、http配置(注意Context上下文)
http的配置都写在http后边的大括号中,http配置段最多只能有一个,而且在对nginx进行配置时修改的最多的也是http配置段中的内容,它所包含的常用配置如下:
首先说http配置段中的server配置段中的内容(在配置文件中的位置为http{ server{ ... } }):
include /etc/nginx/conf/*.conf; #将片段配置文件包含进主配置文件中 #(不一定在此配置段中,要根据片段配置段中的配置将此指令放到对应的位置)
server_name name ...; #指定虚拟主机名称;后面可以使用空白字符分隔多个主机名 #主机名可以支持使用“*”匹配任意长度的任意字符 #主机名还可以支持使用~起始的正则表达式
listen address[:port] [default_server] [ssl] [http2 | spdy] listen port [default_server] [ssl] [http2 | spdy] listen unix:path [default_server] [ssl] [http2 | spdy] #(以上的指令均是设定监听端口和地址,选择一种写法即可) 参数为: default_server:默认虚拟主机的设定 ssl:支持https http2:支持http/2.0 spdy:支持Google的spdy功能 backlog=number:设定后援队列的长度 rcvbuf=size:接收缓冲大小 sndbuf=size:发送缓存大小 示例: listen 127.0.0.1:8000; listen 127.0.0.1; listen 8000; listen *:8000; listen localhost:8000;
root path; Context: http,server,location,if in location #上下文(一条指令有可能有多个上下文,即能写在不同的地方,下同) #设置web资源的路径映射; #用于指定用户请求的URL所对应的本地文件系统中的资源所在的目录的路径 path:可以是绝对路径;也可以是相对路径 相对路径是相对nginx的安装目录而言的
location [ = | ~ | ~* | ^~ ] uri { ... }(这个写法用的比较多) location @name { ... }(这个写法用的比上面的少) Context: server,location #根据用户请求的URI来匹配此处定义的location;当匹配到时, #此请求将被响应的location上下中的指令处理 =:表示用户请求的URI与此处location定义的URI必须精确匹配 ~:表示用户请求的URI与此处location定义的URI通过指定的正则表达式来进行匹配,并且严格区分字母的大小写 ~*:同上,不过大小写不区分 ^~:对用户请求的URI的左半部分做匹配检查,不区分大小写 URI:URL中除去主机名的部分: URL:http://www.qhdlink.com/index.html URI:/index.html 匹配优先级:= , ^~ , ~/~* 书写规则时在这里还可以不带符号,不过虽然能够匹配成功,但是是在其他所有都不能匹配时才使用
alias path; Context: location #定义路径映射的别名,文档资源映射的机制
root和alias的区别:
用户请求的URL:http://172.16.72.2/images/1.jpg
location /images/ {
root /myweb;
}
被请求资源在服务器文件系统中的存放路径:/myweb/images;
location /images {
alias /myweb;(注意斜线)
}
被请求资源在服务器文件系统中的存放路径:/myweb/1.jpg
总结:
root指令:将用户请求的URI追加至root指令所指定的路径之后,作为此次访问资源所在的文件系统路径
alias指令:将用户请求的URI用root指令所指定的路径替换,作为此次请求的资源所在的文件系统路径
注意:在nginx/1.12.1中,URI和root的参数都不能在最后加“/”否则无法访问
index file ...; Context: http,server,location #定义默认主页的文件名 #file:是一个文件名或者由空白字符隔开的多个文件名
error_page code ... [=[response]] uri; Context: http,server,location,if in location #根据用户请求的资源的http协议的响应状态码实现错误页面的重定向 示例: error_page 404 =200 /404.html; #当获取到404错误时返回指定的404错误页面, #“=200”选项的功能是将错误代码改为200,起到伪装的效果(可以没有) location = /404.html { root /myweb/error_page; #引用定义的错误页面 }
与长连接相关的指令: keepalive_disable none \ browser ...; Context: http,server,location #对于某些浏览器禁用长连接 keepalive_request number; Context: http,server,location #通过设置最大请求数量的方式管理长连接; #即,只要在长连接上接收到的用户请求达到最大限制值,则关闭此长连接 keepalive_timeout timeout [header_timeout]; Context: http,server,location #通过设置最大空闲时间的方式管理长连接; #即,只要该长连接在指定时间内没有收到任何请求,则关闭此长连接
send_timeout time; Context: http, server, location #向客户端发送响应报文的超时时长; #通常指两次成功的写操作之间的间隔时长, #如果在此时间内,客户端没有收到响应报文,则关闭连接
client_body_buffer_size size; Context: http, server, location #用于设置客户端请求报文中的body部分的缓冲区的大小; #默认为16k,如果要缓存的body超过了此限制,则会将其临时保存与磁盘的文件中 client_body_temp_path path [level1 [level2 [level3]]]; Context: http, server, location #用于设定存储客户端请求报文中的body部分的临时存储路径, #以及此临时目录中子目录的结构 #后边的三个参数level的功能是定义临时存储的目录的名字 示例: client_body_temp_path /var/tmp/client_body 2 1 2 (2:表示两个16进制数字随机构建的目录名称,即最多可以创建256个目录) (1:代表下一级目录中使用一个十六进制数字为名称的目录) (十六进制数字为0-f:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f) 上面的这条语句就会创建出一个类似于下面这样的目录 /var/tmp/client_body/0a/f/8e /var/tmp/client_body/b3/e/d2 #这样不仅能够设置文件的不同名字,同时还可以设置总数量的多少, #比如上面这个例子,分别设置了2 1 2, #那么它所能包含的文件的数量就是16*16=256个一级目录,16个二级目录,256个三级目录 #一般会使用到level加上level2就够用了
limit_rate rate; Context: http, server, location, if in location #限制响应给客户端的传输速率,单位是Bytes/second,0表示无限制 location /download { root /; limit_rate 20480 #限制速度为20KB/s,即用户到这个目录下载的速度最大为20KB/s }
limit_except method ... { ... } Context: location #设置可以使用指定的请求方法之外的其他方法的客户端 #在此上下文中,需要使用allow及deny指令
allow address | CIDR | unix: | all; Context: http,server, location, limit_except 对指定的客户端进行访问控制 注意: 1) 只有放置于 limit_except上下文中,才表示是否允许指定客户端使用什么样的http方法 2) 如果放置于其他的上下文中,则表示对该上下文所包含的web资源的访问控制 3) 规则的匹配顺序:按照书写顺序依次检查,直到第一个匹配项 CIDR:超网,用一串数字代表一个网段叫做CIDR,类似于172.16.0.0/16代表的172.16网段
AIO和DirectIO(选择IO的方式) aio on | off | threads[=pool]; Context:http, server, location #是否启用aio功能 directio size | off Context: http, server, location #是否启用 directio,如果启用,使用多大的空间来定义 directio
文件描述符缓存: open_file_cache off; open_file_cache max=N [inactive=time]; 在系统中打开的文件较多的时候,nginx可以缓存以下三种信息来提升系统的性能 1) 文件描述符、文件大小和最近一次修改的时间 2) 打开的目录的结构 3) 没有找到的或者没有权限访问的文件相关信息 max=N:可以缓存项的数量的上限; 当缓存的数量达到上限之后,通常会使用算法实现缓存清理
stub_status; Context: server, location 用于输出nginx的基本状态信息 location /ngx-status { stub_status; } 通过浏览器浏览 http://host/ngx-status,会显示以下信息: Active connections -- 处于活动状态的客户端连接数量,包括waiting状态的连接 accepts:当前服务器已经接受的客户端请求的总量 handled:当前服务器已经处理完成的客户端请求的总量 requests:客户端发送到当前服务器的请求的总量 Reading:处于正在被读取报文首部的客户端请求的总量 Writing:处于正在向客户端发送响应报文过程的连接的总量 Waiting:处于等待客户端发送请求的空闲连接数
vaild_referers none | blocked | server_names | strings ...; Context: server, location 定义合法的Referer数据 none:在请求报文的首部中没有Referer字段 blocked:在请求报文的首部中有Referer字段,但没有值 server_names:在请求报文的首部中的Referer字段的值是主机名 arbitrary string:任意字符串(直接字符串),其中可以使用“*”做通配符 regular expression:被指定的正则表达式模式匹配到的字符串,一般要是有“~”起始 示例: vaild_referers none blocked server_name *.qhdlink.com ~\.qhdlink\. 要是遇见不合法,使用内建变量判断: if ($invalid_referer) { return 403 } 合起来就是: location / { #判断如果不是以“.haha.com”结尾或者不匹配“.haha.”则返回403错误 vaild_referers none blocked server_name *.haha.com ~\.haha\. if ($invalid_referer) { return 403; } }
ssl模块:ngx_http_ssl_module #定义ssl
1) ssl on | off; Context: http,server #是否启用给定虚拟主机的https协议 开启的方法: listen 443 ssl; 或者额外添加一条语句 ssl on;(两个选一个即可)
2) ssl_certificate file Context: http,server #当前虚拟主机使用的PEM格式的证书文件的路径
3) ssl_certificate_key file Context:http,server #当前虚拟主机上与其证书匹配的私钥文件的路径
4) ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; Context: http,server #将https的连接缓存下来减少CPU的压力 off:不建立缓存 none:有缓存,但是不再匹配了 builtin:这个缓存只能被一个进程使用(容易产生内存碎片) shared:推荐使用 ssl_session_cache builtin:1000 shared:ssl:10m (不是10M大小,而是数量) #是否开启ssl的会话缓存,如果开启,选择那种类型及使用多少存储空间 #为了避免内存碎片,建议使用shared类型
5) ssl_session_timeout time; Context: http,server #客户端连接可以复用ssl会话缓存中缓存的ssl参数的有效时长:默认为5分钟
6) ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]; Context: http,server #nginx服务器能够兼容的协议的版本;默认是[TLSv1] [TLSv1.1] [TLSv1.2];
日志模块:ngx_http_log_module
1) access_log path [format [buffer-size] [gzip[-level]] [flush=time] [if=condition]]; access_log off; Context: http,server,location,if in location,limit_expect #是否记录访问日志;如果记录,以何种格式记录;缓冲区大小的设定, #是否压缩存储并指明压缩等级;刷新日志文件的时间;
2) log_format name [escape=default|json] string ...; Context: http #定义存储访问日志的格式; combined格式示例: log_format combined ‘$remote_addr - $remote_user [$time_local] ‘ ‘"$request" $status $body_bytes_sent ‘ ‘"$http_referer" "$http_user_agent"‘;
3) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; Context: http, server, location 是否启用访问日志文件的文件描述符缓存机制; max=N:缓存中缓存的文件描述符的最大数量; inactive:非活动时长;默认10秒; min_uses:在inactive的时间内,缓存中的缓存条目最少被命中的次数;默认值1; valid:验证缓存中的缓存条目是否有效的时间周期;默认60秒;
修改URI模块:ngx_http_rewrite_module
1) rewrite regex replacement [flag]; Context: server, location, if #将用户请求的URI基于regex所描述的模式进行匹配检测, #匹配到时将其替换为replacement指定的URI; 注意: 1.在同一上下文中存在多个rewrite规则时,会自上而下逐个检测并匹配; 对于客户端发送的每个请求,都要做检查匹配,其中隐藏了一个循环机制; 可以利用flag来控制循环的方式; 2.如果replacement是以http://或者https://开头的, 替换的结果会直接以重定向的方式返回给客户端;状态码为301;否则,状态码为302; 例子: 将http://www.aaa.com 转换成 http://www.bbb.com 重定向状态码: 3xx:重定向类的状态码(尽量使用301) 301:永久重定向:在访问新定向的域名时使用新域名 302:临时重定向:仍旧使用旧域名,如同多个域名指向同一网站 [flag]: last:重写完成后停止对当前的URI在当前的location中后续的其他重写操作后启动新一轮的匹配检查;重启循环; break:重写完成后,立刻停止对当前location中的rewrite规则的匹配检查,转而执行后续的其他配置;结束循环; redirect:临时重定向,重写完成后以临时重定向方式向客户端返回重写后的URI,由客户端重新请求;不以http://或https:开头的URI的重写; permanent:永久重定向,重写完成后以永久重定向方式向客户端返回重写后的URI,由客户端重新请求;以http://或https:开头的URI的重写; 示例: location / { root html; index index.html index.htm; rewrite ^/epel http://172.16.72.101; rewrite ^/(.*\.(jpg|jpeg|gif|png))$ http://172.16.72.1/images/$1; rewrite ^/(.*)\.htm$ /$1.html; }
2) return code [text]; return code URL; return URL; Context: server, location, if #停止处理所有的后续的请求,直接给客户端返回一个指定的状态码或URL;
3) if (condition) { ... } Context: server, location #引入一个新的上下文并且在其中完成条件判断;如果条件满足,执行if上下文中的配置指令; condition: 比较操作符: ==:等于 !=:不等于 ~:模式匹配,区分字符大小写; ~*:模式匹配,不区分字符大小写; !~:不匹配 !~*:不匹配 文件及目录的存在性判断: -e, !-e:存在与否 -f, !-f:存在且是普通文件与否; -d, !-d: ... -x, !-x:
PHP相关模块:ngx_http_fastcgi_module:
(以下指令均配置在“location ~ \.php$”中)
转发相关:
1) fastcgi_pass address; #nginx通过反代机制,将php请求反代至address标明的服务器上;
2) fastcgi_index name; fastcgi默认反代的主页资源;
3) fastcgi_param parameter value [if_not_empty]; 向后端php服务器传递参数;
缓存相关:
1) fastcgi_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] Context: http level:缓存的目录结构及文件数量,最多3级,每级最对2个16进制数字,用":"分隔 例如:1:2:2 keys_zone:内存中缓存空间的名称及大小; max_size:磁盘上用于缓存数据的缓存空间大小; inactive:缓存的最大时长;
2) fastcgi_cache zone | off; #调用指定的缓存空间缓存数据;
3) fastcgi_cache_key string; #定义用户缓存项的key的字符串;
4) fastcgi_cache_min_uses number; #用户请求的内容被请求多少次才会加入缓存;
5) fastcgi_cache_valid [code ...] time; #对于不同的响应码的响应数据设置缓存时间;
注意:
设置缓存的时候使用fastcgi_cache_path指令;
调用缓存时,至少应该使用下列几个指令:
fastcgi_cache
fastcgi_cache_key
fastcgo_cache_valid
示例:
http上下文的配置:
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgicache:10m max_size=1g;
location上下文的配置:
location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; #fastcgi监听端口,即将以php结尾的文件转发给fastcgi进行处理 fastcgi_index index.php; #指定以php结尾的默认的主页 fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; include fastcgi_params; fastcgi_cache fcgicache; fastcgi_cache_key $request_uri; fastcgi_cache_valid 200 5m; fastcgi_cache_valid 301 302 1m; fastcgi_cache_valid 403 404 1m; }
负载均衡反向代理模块:ngx_http_proxy_module
负载均衡根据在不同的协议上分别有最合适的软件,在传输层有:lvs(Keepalived HA),nginx,haproxy;在应用层有:nginx(能够代理:http, https, smtp, pop3, imap4), haproxy(能够代理:http), httpd(能够代理:http, https) ats, pound, perlbal, ...
使用nginx做反代的理由:
1.利用nginx的高并发处理能力降低后端RS的压力;后端RS开启长时间的长连接;
2.有效地阻断来自某些用户的恶意访问;将添加iptables规则等安全操作在前端代理服务器上配置实现;
3.在前端nginx服务器上构建缓存,大大提高对用户请求的响应效率;
4.通过更加精细的粒度完成后端RS的调度;
proxy_pass URL; Context: location, if in location, limit_except #设置一个被代理的服务器的地址和协议以及一个用于被映射位置的可选的URI; #可以反代http协议和https协议; #服务器地址可以是一个域名或者IP地址再加上一个可选的端口号; 注意: 1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机; location /uri/ { proxy_pass http://HOST; } 2) proxy_pass后面的路径是一个uri,其会将location的uri替换成proxy_pass指令后面的uri; location /uri/ { proxy_pass http://HOST/new_uri/; } 3) 如果location定义uri时使用正则表达式的模式匹配(~|~*),则proxy_pass指令之后绝对不能使用uri;否则nginx会将之视为语法错误; location ~|~* PATTERN { proxy_pass http://HOST; }
proxy_set_header field value; Context: http, server, location #设置发往后端服务器的请求报文的首部及其值; 常用示例: proxy_set_header X-Forwarded-For $remote_add; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; Context: http #设置缓存路径,包括内存中键的存储空间大小,磁盘上的缓存文件的大小, #磁盘上缓存的目录名称及目录结构2,缓存的非活动时间等; proxy_cache_path levels=1:2:2 keys_zone=proxycache:10m max_size=1g;
proxy_cache zone | off; Context: http, server, location #调用缓存的名称开启缓存机制或者关闭缓存;
proxy_cache_key string; Context: http, server, location #定义缓存条目的键;
proxy_cache_valid [code...] time; Context: http, server, location #各类响应码的响应报文的缓存时长;
proxy_connect_timeout time; //从反代服务器到后端服务器建立TCP连接的超时时间; proxy_send_timeout time; //反代服务器向后端服务器发送的请求的超时时间; proxy_read_timeout time; //反代服务器从后端服务器得到响应报文的超市时间; Context: http, server, location #这三个超时时间的默认值都是60秒;
反代服务器向客户端响应数据报文的首部管理模块:ngx_http_headers_module
add_header name value [always]; Context: http, server, location, if in location #在向客户端发送响应报文时,可以增加其首部中的内容;
expires [modified] time; expires epoch | max | off; Context: http, server, location, if in location #用于定义Expire或Cache-Control首部的值,或者可以添加其他自定义首部
转发相关模块(可以用来定义集群):ngx_http_upstream_module
upstream name { ... } Context: http #定义一个服务器组;
server address [parameters]; Context: upstream #定义后端服务器地址、端口及其他相关参数; address: IP[:PORT] HOSTNAME[:PORT] unix:/PATH/TO/SOCKET_FILE parameters: weight=number //设置后端服务器的权重;默认值为1; max_fails=number //尝试连接后端RS的最大失败次数;默认值为1; fail_timeout=time //设置后端RS服务器为不可用状态的超时时长;默认值10s; backup //把服务器标记为"备用"状态;相当于lvs中的sorry_server; down //将服务器手动标记为永久不可用;即,将服务器下线;
hash key [consistent]; Context: upstream #根据所指定的key进行hash运算,得到hash值;key可以是纯文本或者变量值, #也可以是二者组合;可以支持一致性hash算法; consistent:参数,指定使用一致性hash算法;
ip_hash; Context: upstream #使用源地址hash算法,将来自于同一个源IP地址的请求始终发往后端同一个upstream server;
least_conn; Context: upstream #最少连接数调度算法;当后端RS的权重不一致时,自动换成wlc算法;
least_time header | last_byte [inflight]; Context: upstream #最短平均响应时长和最少连接数算法; header:对于来自于后端RS的响应报文的首部的接收时间的检测; last_byte:对于来自于后端RS的响应报文完整接收的时间的检测; (此选项仅对nginx plus(收费版)有效;)
四、stream配置段
集群模块:ngx_stream_core_module
listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] Context: server #定义监听的用于接受连接的地址和端口(套接字); 默认的协议:TCP协议,通常可以使用udp参数来定义监听于udp协议的端口;
server { ... } Context: stream #定义一个集群服务;
stream { ... } Context: main #定义一个负载均衡器;