nginx服务(五)_常用配置指令介绍
阅读原文时间:2021年04月20日阅读:1

Main 全局配置段常见的配置指令分类
文档: https://nginx.org/en/docs/ngx_core_module.html#accept_mutex

分类:
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置
与套接字相关的配置
定义路径相关的配置
定义客户端请求的相关配置
文件操作优化的配置


正常 运行必备的配置:

1、 user

Syntax:    user user [group];
Default:    
user nobody nobody;
Context:    main

2、pid /PATH/TO/PID_FILE;指定存储nginx主进程进程号码的文件路径;

3、include file | mask;指明包含进来的其它配置文件片断;

4、load_module file;指明要装载的动态模块;


性能优化相关的配置:

1、 worker_processes [number | auto]; #worker进程的数量,通常应该为当前主机的略小于cpu的物理核心数;

2、worker_cpu_affinity auto | [cpumask]; #把worker进程和CPU进行绑定,之后就不需要进行调度了,解决进程在cpu上切换的损耗(context switch cpu产生的不必要消耗) 提升缓存持久性和命中率,无法避免进程切换
CPU MASK:
00000001:0号CPU
00000010:1号CPU
00000100: 2号CPU
… …
例:
worker_cpu_affinity 00000001 00000010; 把cpu绑定在0号和1号cpu上

[root@s2 ~]#ps axo pid,cmd,psr,user | grep nginx
4106 nginx: master process /apps 1 root
4181 nginx: worker process 0 nginx
4182 nginx: worker process 1 nginx
4184 grep --color=auto nginx 0 root

3、worker_priority number;指定worker进程的nice值,设定worker进程优先级;[-20,20]

[root@s2 ~]# watch -n1 'ps -axo pid,cmd,nice | grep nginx' #验证进程优先级

4、worker_rlimit_nofile number;更改工作进程最大打开文件数(RLIMIT_NOFILE)的限制。用于在不重新启动主进程的情况下增加限制。

5、timer_resolution interval; 计时器解析度;降低此值,可以减少gettimeofday()系统调用次数,默认情况下,每次接收内核事件时都会调用gettimeofday()。
例:
timer_resolution 100ms;


调试、定位问题:
需开启调试进程模块
1、daemon on|off; 是否以守护进程方式运行Nignx;

2、master_process on|off;是否以master/worker模型运行nginx;默认为on;仅⽤于开发调试场景。

3、error_log file [level];配置日志记录
[level]–>
[debug | info | notice | warn | error | crit |alert | emerg]

5、server_tokens on|off; 是否隐藏nginx版本
若要使用debug级别,需要在编译nginx是使用–with-gebug选项

6、更改nginx版本或者自定义nginx版本号
更改nginx源码信息并重新编译Nginx

# vim src/http/ngx_http_header_filter_module.c
49 static u_char ngx_http_server_string[] = "Server: test" CRLF; #定义响应报⽂中的
server字段信息

7、avicon.ico
favicon.ico ⽂件是浏览器收藏⽹址时显⽰的图标,当客⼾端使⽤浏览器问⻚⾯时,浏览器会⾃⼰主动发起请求获取⻚⾯的favicon.ico⽂件,但是当浏览器请求的favicon.ico⽂件不存在时,服务器会记录404⽇志,⽽且浏览器也会显⽰404报错。

解决方法:

#⼀:服务器不记录访问⽇志:
#location = /favicon.ico {
#log_not_found off;
#access_log off;
#}
#⼆:将图标保存到指定⽬录访问:
#location ~ ^/favicon\.ico$ {
location = /favicon.ico {
root /data/nginx/html/pc/images;
expires   90d; #设置⽂件过期时间
}

事件驱动相关的配置:

events {

}
1、 worker_connections number;设置工作进程可以打开的最大同时连接数。 请记住,此数字包括所有连接(例如,与代理服务器的连接等),而不仅包括与客户端的连接。另一个需要考虑的因素是,并发连接的实际数量不能超过打开文件最大数量的当前限制,可以通过worker_rlimit_nofile进行更改。

最大并发 = worker_processes * worker_connections

2、use {epoll | rtsig | select | poll };指明并发连接请求的处理方法; 建议Nginx自行指定,只能设置在events模块中设置。
例子:
use epoll;默认为epoll

3、accept_mutex on | off;优化同⼀时刻只有⼀个请求⽽避免多个睡眠进程被唤醒的设置,on为防⽌被同时唤醒;默认为off,全部唤醒的过程也成为"惊群",如果新连接的数量很少,则某些工作进程可能会浪费系统资源,因此nginx刚安装完以后要进⾏适当的优化。

4、accept_mutex_delay time;如果启用accept_mutex,则指定在另一个工作进程当前正在接受新连接的情况下,工作进程尝试重新启动接受新连接的最长时间。默认为500ms

5、lock_file file; nginx使用锁定机制来实现accept_mutex 并序列化对共享内存的访问。


与套接字相关的配置:

1、 server { … }配置一个虚拟主机;

  server {
      listen address[:PORT]|PORT;  指定监听的地址和端口 
      server_name SERVER_NAME;  设置虚拟服务器的名称
      root /PATH/TO/DOCUMENT_ROOT; 路径映射
  }

2、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]
listen *:80 | *:8000;
Context:    server

default_server:设定为默认虚拟主机;
ssl:限制仅能够通过ssl连接提供服务;
backlog=number:后援队列长度;
rcvbuf=size:接收缓冲区大小;
sndbuf=size:发送缓冲区大小;

3、server_name name ...;指明虚拟主机的主机名称;后可跟多个由空白字符分隔的字符串

支持*通配任意长度的任意字符;server_name *.test.com www.test.*
支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.test.com$
\d:数字匹配
匹配机制:
(1) 首先是字符串精确匹配; www.test.com
(2) 左侧*通配符; *.test.com
(3) 右侧*通配符; www.test.*
(4) 正则表达式;
(5) 默认主机名 default_server;
(5) 默认主机名 default_server;

4、tcp_nodelay on | off; 此选项是在启用keepalive配置的时候,当用户请求的是一个小文件就不立即发送,为了更好的利用带宽,将多个小文件合并起来一起发送(不建议使用,因为影响客户体验 );

5、sendfile on | off;是否启用sendfile功能;在内核空间直接封装响应报文,直接到网卡缓存区发送给用户,减少了一次需要把数据copy到用户空间的步骤(默认启用);


定义路径相关的配置:

6、 root path;设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;可用的位置:http, server, location, if in location;

7、location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;

语法规则: location [=|~|~*|^~] /uri/ { … }
= #⽤于标准uri前,需要请求字串与uri精确匹配,如果匹配成功就停⽌向下匹配并⽴即处理请求。
~ #⽤于标准uri前,表⽰包含正则表达式并且区分⼤⼩写,并且匹配
!~ #⽤于标准uri前,表⽰包含正则表达式并且区分⼤⼩写,并且不匹配
~* #⽤于标准uri前,表⽰包含正则表达式并且不区分⼤写,并且匹配
!~* #⽤于标准uri前,表⽰包含正则表达式并且不区分⼤⼩写,并且不匹配
^~ #⽤于标准uri前,表⽰包含正则表达式并且匹配以什么开头
$ #⽤于标准uri前,表⽰包含正则表达式并且匹配以什么结尾
\ #⽤于标准uri前,表⽰包含正则表达式并且转义字符。可以转. * ?等
* #⽤于标准uri前,表⽰包含正则表达式并且代表任意⻓度的任意字符

匹配优先级:=, ^~, ~, ~*,/
location优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
让我们用一个例子解释上面的说法:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

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

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

请求“/”匹配配置A, 请求“/index.html”匹配配置B, 请求“/documents/document.html”匹配配置C, 请求“/images/1.gif”匹配配置D, 请求“/documents/1.jpg”匹配配置E。

注: 匹配级别高的记录时,就算没有该目录,报错也不会去额外匹配较低级的资源

8、alias path;定义路径别名,文档映射的另一种机制;仅能用于location上下文;
注意:location中使用root指令和alias指令的意义不同;
        (a) root,给定的路径对应于location中的/uri/左侧的/;
root表示指明路径为对应的location “/” URL;
        (b) alias,给定的路径对应于location中的/uri/右侧的/;
alias表示路径映射,即location指令定义后的URL是相对于alias所指明的路径

9、index file ...;默认主页资源;http, server, location; index index.php index.html;

10、error_page code ... [=code] uri; 提供错误页面,自定义响应码

11、try_files file ... uri; 会按顺序检查⽂件是否存在,返回第⼀个找到的⽂件或⽂件夹(结尾加斜线表⽰为⽂件夹),如果所有⽂件或⽂件夹都找不到,会进⾏⼀个内部重定向到最后⼀个参数。只有最后⼀个参数可以引起⼀个内部重定向,之前的参数只设置内部URI的指向。最后⼀个参数是回退URI且必须存在,否则会出现内部500错误。

例:1
location /test {
root /data/nginx/html/pc;
index index.html;
try_files /aa/ /images0/index.html index.html =489;
}
当访问www.test.com/test 时,/images0/index.html存在时,返回index.html;不存在时,返回响应码489

[root@s2 about]# curl --head http://www.magedu.net/about/xx.html
HTTP/1.1 489 #489就是⾃定义的状态返回码
Server: nginx
Date: Thu, 21 Feb 2019 00:11:40 GMT
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=65

例:2
location /test {
root /data/nginx/html/pc;
index index.html;
try_files /aa/ /images1/;
}
当访问www.test.com/test 时,/aa/存在时,返回index.html;不存在时,返回/images1/下的index.html


定义客户端请求的相关配置:

12、 keepalive_timeout timeout [header_timeout];设定保持连接的超时时长,0表示禁止长连接;默认为75s;后⾯的
timeout为发送给客⼾端应答报⽂头部中显⽰的超时时间设置为60s:如不设置客⼾端将不显⽰超时时间。

Keep-Alive:timeout=number #浏览器收到的服务器返回的报⽂

如果设置为0表⽰关闭会话保持功能,将如下显⽰:
Connection:close #浏览器收到的服务器返回的报⽂

例:

使⽤命令测试:
[root@s3 apps]# telnet www.magedu.net 80
Trying 172.18.200.102...
Connected to www.magedu.net.
Escape character is '^]'.
GET / HTTP/1.1
HOST: www.magedu.net
#Response Headers(响应头信息):
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Thu, 14 Mar 2019 17:23:46 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Thu, 14 Mar 2019 14:54:50 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "5c8a6b3a-7"
Accept-Ranges: bytes
#⻚⾯内容
pc web

13、keepalive_requests number;在一次长连接上所允许请求的资源的最大数量,默认为100;
例:
limit_rate 10k;

限制后

限制前

14、keepalive_disable none | browser ...;对哪种浏览器禁用长连接;

15、send_timeout time; 向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;

16、client_body_buffer_size size;用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;

17、client_body_temp_path path [level1 [level2 [level3]]];设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
16进制的数字;client_body_temp_path path /var/tmp/client_body 1 2 2 对客户端进行限制的相关配置:
client_max_body_size: 接受客户请求主体部分的请求

18、limit_rate rate;限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;

19、limit_except method ... { ... } ; 限制对指定的请求方法之外的其它方法的使用客户端;
例: limit_except GET {
allow 192.168.1.0/24;
deny all;
}
#表示除了get和head的其他方法仅允许这个网段使用


文件操作优化的配置

20、aio on | off | threads[=pool];是否启用aio功能;数据是否暂存在内存中一起写入磁盘

21、directio size | off;在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m; 此处表示数据是否直接写入磁盘

22、open_file_cache off;#是否启用文件缓存功能,仅缓存元数据,和目录的存在与否等错误,加速响应效率

open_file_cache max=N [inactive=time];
        nginx可以缓存以下三种信息:
        (1) 文件的描述符、文件大小和最近一次的修改时间;
        (2) 打开的目录结构;
        (3) 没有找到的或者没有权限访问的文件的相关信息;
        max=N:可缓存的缓存项上限一般5000;达到上限后会使用LRU算法实现缓存管理;
        inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,然后被踢出缓存;

23、pen_file_cache_min_uses number;在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;

24、open_file_cache_valid time ;缓存项有效性的检查频率;默认为60s;

25、open_file_cache_errors on | off;是否缓存查找时发生错误的文件一类的信息;