nginx配置文件详细解说:
一、配置指令
1、main配置段常见的配置指令:
1)分类:
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
时间驱动相关的配置
2、正常运行必备的配置
1)user
systax:user user [group]; #可以配置一个组,不过一般默认都是nginx配置
2)pid /PATH/TO/PID_FILE;
指定存储nginx主进程号码的文件路径
3)include file | mask;
指明包含进来的其他配置文件片段;
4)load_module file;
指明要装载的动态模块;
3、性能优化相关的配置:
1)worker_processes number | auto;
worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;大于的话是没有什么用的。小于的话主要留很小一些核心数给其他服务来使用。
auto:默认是当前主机物理CPU核心数(nginx自动匹配);
2)worker_cpu_affinity cpumask ......;
worker_cpu_affinity auto [cpumask];
CPU MASK怎么表示呢?
假如此时电脑有8颗CPU核心数。 00000000:表示8颗CPU核心,下面这个是位图掩码表示法。 00000001:0号CPU 00000010:1号CPU 00000100:2号CPU 00001000:3号CPU 00010000:4号CPU 00100000:5号CPU 01000000:6号CPU 10000000:7号CPU
案例演示:加入此时我的电脑是4颗CPU
一旦将某个子进程绑定在了某个核心上,那么我们可以做个压测看一下,此时的子进程所使用的核心序号是一定的。
3)进程优先级
worker_priority number;
指定worker进程的nice值,舍得worker进程优先级;[-20.20]
4)文件数量大小
worker_rlimit_nofile number; #其中number的值要大于worker_processes*worker_connections的乘积。
案例演示:
4、调试、定位问题:
1)daemon on|off;
是否以守护进程方式运行nginx,centos6中是守护模式,centos7中不必打开守护模式,因为由systemd统一管理。
2)master_process on | off;
是否以master/worker模型运行nginx,默认是on;我们使用的也是在on模式下。
3)error_log file [level];
5、事件驱动相关的配置:
events {
.......
}
1)worker_connections number;
每个worker进程所能够打开的最大并发连接数数量;
2)use method;
指明并发连接请求的处理方法;method一般有两种:select和epoll。select的最大限制是1024,而epoll的连接是无限制的,所以nginx肯定使用epoll并发请求机制。
关于两者的区别:我们可以看一下:
select | epoll | |
性能 | 随着连接数增加,急剧下降。处理成千上万并发连接数时,性能很差。 | 随着连接数增加,性能基本上没有下降。处理成千上万并发连接时,性能很好。 |
连接数 | 连接数有限制,处理的最大连接数不超过1024。如果要处理超过1024个连接数,则需要修改FD_SETSIZE宏,并重新编译 。 | 连接数无限制。 |
内在处理机制 | 线性轮询 | 回调callback |
开发难易程度 | 低 | 中 |
比如:use epoll;
3)accept_mutex on | off
处理新的连接请求的方法;on以为着由worker轮流处理新请求,讲究起点公平。off以为着每个新请求的到达都会通知所有的worker进程,讲究结果公平。
二、主机配置
1、与套接字相关的配置
1)server{......};
配置一个虚拟主机;
server {
listen address[:PORT] | PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT; #表示web服务的默认工作路径是在哪个地方
# proxy_pass URL; #表示nginx此时仅仅是一台反向代理服务器。
}
2) listen PORT | address [:port] | unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server:设定为默认虚拟主机;
ssl:限制仅能后通过ssl连接提供服务;
backlog=number:后援队列长度;
rcvbuf=size:接受缓冲区大小;
sndbuf=size:发送缓冲区大小;
3)server_name name .....;
指明虚拟主机的主机名称;后可跟多个由空白字符分割的字符串;
支持*通配任意长度的任意字符;server_name *.chaofeng.com www.chaofeng.*
支持~其实的字符做正则表达式模式匹配;server_name ~^www\d+\.chaofeng\.com$
匹配机制:
(1)首先是字符串精准匹配
(2)左侧*通配符
(3)右侧*通配符
(4)正则表达式;
4)tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项;
delay:延迟发送
tcp_nodelay on表示要求不要合并发送,请求一个发送一个;对非保持连接无效。
5)tcp_nopush on | off
在sendfile模式下,是否启用TCP_CORK选项
tcp_nopush on :在一个包中发送响应头和文件的开头;以完整的包发送文件
6)sendfile on | off
是否启用sendfile功能;
系统调用sendfile()函数通过DMA把硬盘数据拷贝到kernel buffer,然后数据被kernel直接拷贝到另外一个与socket相关的kernel buffer,这里没有user mode和kernel mode之间的切换,在kernel中直接完成了从一个个buffer到另一个buffer的拷贝;DMA把数据从kernel bueer直接拷贝到协议栈,没有切换,也不需要数据从user mode拷贝到kernel mode,因为数据就在kernel里面。步骤减少了,切换减少了,自然性能就提升了。
7)root path;
设置web资源路径映射,用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http,server,location,if in location
8)location [ = | ~ | ~* ^~ ] uri {.....}
set configuration depending on a request URI
在一个server中location配置段可存在多个,用于实现从URI到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应该其配置;
=:对URI做精准匹配;
location = / {
........
}
例如:会去匹配http://www.chaofeng.com/,但是不会匹配http://www.chaofeng.com/index.html
~:对URI做正则表达式模式匹配,区分字符大小写;
~ *:对URI做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;
不带符号:匹配起始于此uri的所有的uri;
匹配优先级:= > ^~ > ~ / ~* > 不带符号;
两个普通的location(即不带符号),匹配目录最长的那个。
两个正则(正则的前半部分是一样的,后半部分可能一个匹配的路径长,另外一个路径短),不管有序无序,只匹配到第一个正则。
案例:
server { listen 80; server_name www.ilinux.io; root /data/nginx/vhost1; error_page 404 /notfound.html; location / { #root /data/nginx/vhost2; allow all; } location ~* \.(jpg|png)$ { allow all; } location ^~ /images/ { alias /data/pictures/; } }
在location中,如果内部定义了root指定映射的路径,则会覆盖掉server内部的那个root路径。也就是说他们是有继承关系的。我们可以把server的哪个root映射的路径当作父root路径,那么location中那个root映射的路径当作子root路径,父root路径统管全局作用,如果location没有定义子root路径,那么这些location默认会使用父root映射的路径下的内容,但是如果location中定义子root路径,那么子root路径将会继承父root路径,这里的继承是指子root路径覆盖父root路径的映射内容。还要注意的是,子root路径仅仅在当前自己所在的那个location中有效,子root路径只有局部作用。
9)alias path
定义路径别名,文档映射的另一种机制;仅仅能用于location上下文;
注意:
location中使用root指令和alias指令的意义不同;
a)root,给定的路径对应于location中的/URI/左侧的/;
b)alias,给定的路径对应于location中的/URI/右侧的/;
案例:
现在我们访问一下:
现在我们修改一下配置:
我的images目录下是没有header.jpg这张图片的。
现在我们访问一下:
总结: alias ,匹配/images/中的第二个/,即访问 www.nginx_vhosts1.io/images/header.jpg 。为路径 /var/nginx_lt1/ 下的header.jpg.如上图
10)error_page code uri;
浏览器返回给用户的错误界面404其实也是一个页面,只有当状态码为404的时候,web服务器会调用这个界面然后返回给浏览器。所以我们也可以定义一个错误页面返回给我们。
案例:
然后我们在/var/nginx_lt1/目录下定义一个错误页面
打开浏览器故意访问一个不存在的页面:
11)index file .......;
默认资源:http,server,location
三、定义客户端请求的相关配置
1)keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止长连接;默认时75s;
2)keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认是100。
3)keepalive_disable none | browser .....;
对那种浏览器禁用长连接;(目前市面的浏览器都是比较新的,所以这一项不必过于关注)
4)send_timeout time;
向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长。
5)client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认是16k;超出此大小时,其将暂存到磁盘上的由client_body_temp_path指令所定义的位置
6)client_body_temp_path apth [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;(设定文件路径路由的方式)
主要使用16进制的数字;
client_body_temp_path /var/tmp/client_body 2 1 1
2 :表示256个一级子目录。
1 :每个一级子目录下有16个二级子目录
1 :每个二级子目录下有16个三级子目录
计算:那么一共有256*16*16个三级子目录。
四、对客户端进行限制的相关配置:
1)limit_rate rate;
- 限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
Context: http, server, location, if in location
2)limit_except method ... {...}
- 限制对指定的请求方法之外的其它方法的使用客户端
-
示例: limit_except GET { allow 192.168.1.0/24; deny all; } #除了GET和HEAD之外,其它所有的method都允许192.168.1.0/24网络地址访问,其它ip地址都拒绝;
五、文件操作优化配置
1)aio on | off |threads[=pool];
- 是否启用aio功能;默认为off。使用默认就行
- Context: http, server, location
2)directio size | off;
在linux主机启用IO_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如:directio 4m;
directio与sendfile功能讲解:
要使aio生效需把directio设置为打开状况,并且如果aio生效,那么将自动不使用sendfile(),这在linux下这是显然的,要么利用aio读到缓存区,要么利用sendfile()直接发送出去,两者不可兼用,而对于freebsd系统下aio和sendfile并用的情况,我并不了解,所以也就不妄加评论;
可以看到directio是针对每个请求的文件大小而决定是否开启directio的,因此对于上面的整个示例配置,也就会针对每个请求的不同而不同: 如果某处请求的文件大于等于512k,那么将启用directio,从而aio生效,进而sendfile不生效; 如果某处请求的文件小于512k,那么将禁用directio,从而aio也就不生效,转而使用sendfile(),即sendfile生效;
这种设计貌似刚好把linux下aio和sendfile两种机制的优点很好的结合起来使用。对于大文件采用aio,节省cpu,而对于小文件,采用sendfile,减少拷贝;并且对于大文件aio采用directio,避免挤占文件系统缓存,让文件系统缓存更多的小文件。 从理论上来看,这种配置比较适合系统内存有限、小文件请求比较多、间隔有几个大文件请求的Web环境;如果内存足够大,那么应该充分利用文件系统缓存,而directio使得aio无法使用缓存是衡量最终是否需要采用aio的一个需要仔细考虑的因素;网上有人总结说nginx+aio很好,也有人说其很差,其实根据特定的系统环境和应用场景来做配置调节,才能达到性能的最优,nginx提供的 AIO 只是一套工具,没有固定的好与差之分,就看你能否恰当的用好它,但据nginx官网论坛来看,在linux系统的大部分场景下,目前因使用aio功能附加的限制而带来的实际效果估计并不太理想:
open_file_cache max=N [inactive=time];
Configures a cache that can store;
nginx可以缓存以下三种信息:
- <1> 文件的描述符、文件大小和最近一次的修改时间;
- <2> 打开的目录结构;
- <3> 没有找到的或者没有权限访问的文件的相关信息;
-
-
-
- max=N: 可缓存的缓存项上限;达到上限后会使用LRU算法(最近最少使用)实现缓存管理;
- inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;
-
-
4)open_file_cache_valid time;
-
-
- 缓存项有效性的检查频率;默认为60s;
-
5)open_file_cache_min_uses number;
-
-
- 在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
-
6)open_file_cache_errors on|off;
-
-
- 是否缓存查找时发生错误的文件一类的信息;
-
六、权限
1)ngx_http_auth_basic_module模块:实现基于用户的访问控制,使用basic机制进行用户认证
nginx使用htpasswd(包为httpd-tools)制作账号密码,然后添加在虚拟主机中。
2)ngx_http_stub_status_module模块:用于输出nginx的基本状态信息
stub_status;
配置示例:

访问一下:
对输出内容做解释:
Active connections: 活动状态的连接数;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的总的请求数;
Reading:处于读取客户端请求报文首部的连接的连接数;
Writing:处于向客户端发送响应报文过程中的连接数;
Waiting:处于等待客户端发出请求的空闲连接数
3)ngx_http_log_module模块:用于以指定的格式写入请求日志
log_format name string ...;
-
- string 可以使用nginx核心模块及其它模块的内嵌变量
- 注意:此配置只能用于http段中
access_log path [format [buffer=size] [gzip=[level1]] [flush=time][if=condition]];
access_log off; #这个功能在一些不必要的location中可以关闭日志功能
- 访问日志文件路径,格式及相关的缓冲的配置;
- buffer=size: 设置日志缓冲区大小
- flush=time:定义清空时长
示例:
4)open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
-
- 缓存各日志文件相关的元数据信息;
- max:缓存的最大文件描述符数量;
- min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项;
- inactive:非活动时长
- valid:验证缓存中各缓存项是否为活动项的时间间隔
示例:为nginx定义使用类似于httpd的combined格式的访问日志 #在/etc/nginx/nginx.conf文件中http段配置日志格式 [root@wujunjie ~]# vim /etc/nginx/nginx.conf http { log_format comd '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent"'; ... } #给vhost1主机添加访问日志,设置为comd格式 [root@wujunjie ~]# vim /etc/nginx/conf.d/vhost1.conf server { ... access_log /var/log/nginx/vhost1-access.log comd; ... } #访问测试后查看日志格式 [root@wujunjie ~]# tail -2 /var/log/nginx/vhost1-access.log 192.168.1.106 - tom [06/Aug/2018:23:18:27 +0800] "GET /images HTTP/1.1" 301 388 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" 192.168.1.106 - tom [06/Aug/2018:23:18:27 +0800] "GET /images/ HTTP/1.1" 403 324 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
5)ngx_http_gzip_module:用gzip格式压缩响应;
1.gzip on | off;
Enables or disables gzipping of responses.
2.gzip_comp_level level;
Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
3.gzip_disable regex ...;
Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
4.gzip_min_length length;
启用压缩功能的响应报文大小阈值;
5.gzip_buffers number size;
支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;
6.gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
off:对代理的请求不启用
no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;
7.gzip_types mime-type ...;
压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;
配置示例: gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;
案例演示:
此配置可用位置:http, server, location(在http中定义表示对所有的server生效,在server中定义,表示对所有的location生效。在location中定义,表示对某个location生效)
如何查找压缩的数据类型呢?
6)ngx_http_ssl_module模块:
1.ssl on | off;
是否启用htttps协议
2.ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件;
3.ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件;
4.ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2]
支持ssl协议版本,默认为后三个;
5.ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用Openssl内建的缓存,此缓存为每worker进程私有;
[shared:name:size]:在各worker之间使用一个共享的缓存;
6.ssl_session_timeout time;
客户端一侧的连接可以服用ssl session cache中缓存的ssl参数的有效时长;
案例:
配置示例: #创建私有CA自签证书,以192.168.32.132为CA [root@www ~]# cd /etc/pki/CA [root@www CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ........................................................................+++ ..................................+++ e is 65537 (0x10001) [root@www CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:ZHEJIANG Locality Name (eg, city) [Default City]:NINGBO Organization Name (eg, company) [Default Company Ltd]:ilinux.com Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:www.ilinux.com Email Address []: [root@www CA]# touch index.txt [root@www CA]# echo 01 > serial #在nginx主机上生成私钥和申请证书 [root@wujunjie ~]# mkdir /etc/nginx/ssl [root@wujunjie ~]# (umask 077;openssl genrsa -out /etc/nginx/ssl/.nginx.key 2048) [root@wujunjie ~]# openssl req -new -key /etc/nginx/ssl/.nginx.key -out /etc/nginx/ssl/nginx.crs -days 365 [root@wujunjie ssl]# scp nginx.csr [root@192.168.32.132:/tmp](mailto:root@192.168.32.132:/tmp) #在CA上签署证书 [root@www CA]# openssl ca -in /tmp/nginx.csr -out certs/nginx.crt -days 365 #把签署好的证书nginx.crt传会nginx主机 [root@www CA]# scp certs/nginx.crt root@192.168.32.128:/etc/nginx/ssl #修改nginx配置文件,启用ssl [root@wujunjie ~]# vim /etc/nginx/conf.d/vhost1.conf server { listen 443 ssl; server_name www1.ilinux.com; root /data/nginx/vhost1; index index.html error_page 404 =200 /notfound.html; access_log /var/log/nginx/vhost1-access.log main; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/.nginx.key; ssl_protocols sslv2 sslv3 tlsv1 tlsv1.1 tlsv1.2; ssl_session_cache shared:SSL:10m; location / { allow all; } } [root@wujunjie ~]# vim /data/nginx/vhost1/index.html <h1>nginx</h1> <h2>192.168.32.128</h2> #检查语法,重载配置 [root@wujunjie ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@wujunjie ~]# nginx -s reload
补充一篇博客的说明:
7)ngx_http_rewrite_module模块:
用于使用正则表达式模式更改请求URI,返回重定向,并有条件的选择配置
例如:
bbs.magedu.com/ --> www.magedu.com/bbs/
http://www.magedu.com/ --> https://www.magedu.com/
http://www.magedu.com/login.php;username=tom --> http://www.magedu.com/tom/
http://www.ilinux.io/bbs/ --> http://bbs.ilinux.io/
将用户请求的URI基于regex所描述的模式进行检查,然后完成替换;
1.rewrite regex replacement [flag]
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI;
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而上逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;301:永久重定向;
[flag]
last:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新的一路重写检查;提前重启新一轮循环; break:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后直接跳转至重写规则配置块之后的其他配置;循环结束; redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,有客户端重新发起请求;不能以http://或https://开头; permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
案例:
[root@www1 conf.d]# vim vhost.conf server { listen 80; server_name www.ilinux.com; root /data/nginx/vhost1; rewrite /(.*)\.png$ /$1.jpg; } [root@www1 conf.d]# nginx -s reload
注意:如果没有加flag,默认就是permanent
http重定向为https
[root@www1 conf.d]# vim vhost.conf server { listen 80; server_name www.ilinux.com; root /data/nginx/vhost1; rewrite /(.*)$ https://%{HTTP_HOST} /$1 } [root@www1 conf.d]# nginx -s reload
2、return
停止处理并将指定的代码返回给客户端
return code [text]; return code URL; return URL;
3、rewrite_log on |off;
是否开启重写日志
4.if (condition) {...}
引入一个新的配置上下文:条件满足是,执行配置块中的配置指令;
可用于server和location段中
condition: 比较操作符: == != ~:模式匹配,区分字符大小写 ~:模式匹配,区分字符大小写 !~:模式不匹配,区分字符大小写 !~:模式不匹配,不区分字符大小写 文件及目录存在性判断: -e, !-e -f, !-f -d, !-d -x, !-x
5、set $variable_value
用户自定义变量
7)ngx_http_referer_module模块
作用:The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.
格式:valid_referers none | blocked | server_names | string ...;
定义referer首部的合法引用用值;
none:请求报文首部没有referer首部; blocked:请求报文的referer首部没有值; server_names:参数,其可以有值作为主机名或主机名模式; arbitrary_string:直接字符串,但可使用*作通配符; regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*\.magedu\.com; $invalid_referer : 模块内置变量,非法引用,只要没被valid_referers定义匹配到的就是非法引用 ...
示例:
配置示例: valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; if($invalid_referer) { return http://www.magedu.com/invalid.jpg; }
示例: