nginx配置文件解析
https://tengine.taobao.org/nginx_docs/cn/docs/
配置块
main(全局设置),main部分设置的指令将影响其它所有部分的设置;
http(http服务器设置),http标准核心模块,http服务的相应配置
server(主机设置)
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离
location(URL匹配特定位置后的设置),location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等),server 是对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置.
events 事件段配置
配置语法说明
1、配置文件由指令与指令块构成
2、每条指令以;分号结尾,指令与参数间以空格符号分隔
3、指令块以{}大括号将多条指令组织在一起
4、使用#符号添加注释,提高可读性
5、include语句允许组合多个配置文件以提升可维护性
6、使用$符号使用变量
7、部分指令的参数支持正则表达式
虚拟主机
-
基于多ip的虚拟主机
一台机器有多个网卡, server_name 就是网卡ip
-
基于多端口的虚拟主机
-
基于域名的虚拟主机
Main 段核心参数
-
user USERNAME [GROUP]
指定运行nginx 的worker子进程的属主和属组
user nginx nginx;
-
pid DIR
NGINX的master主进程的pid文件路径
pid /xxx/nginx.pid;
-
worker_rlimit_nofile number
指定worker子进程可以打开的最大文件句柄数
worker_rlimit_nofile 20480;
-
worker_rlimit_core size
指定worker子进程异常终止后的core文件,用于记录分析问题
worker_rlimit_core 50M; working_directory /opt/nginx/tmp;
-
worker_processes number|auto
指定nginx启动的worker 子进程数 ,通常应该等于小于当前主机的cpu的物理核心数; auto 和 cpu核数一致, lscpu
-
worker_cpu_affinity auto [cpumask];
将每个worker子进程与 cpu 物理核心绑定, 提高cpu cache 命中
1 2 CPU MASK: (8核 8个0表示) 3 00000000: 4 00000001:0号CPU 5 00000010:1号CPU 6 7 #实际应用 : 使用4核心 使用0号和1号cpu,只使用2个cpu 8 worker_processes 2; 9 worker_cpu_affinity 0001 0010; 10 watch -n.5 `ps axo comm psr ni | grep nginx ` #每0.5秒观察进程在哪个cpu运行
-
worker_priority number; 指定worker进程的nice值,设定worker进程优先级;[-20,20],越小优先级越高 ,linux 默认优先级是120 。
worker_priority -10;
-
worker_shutdown_timeout time
指定worker子进程 优雅退出超时时间
worker_shutdown_timeout 5s;
-
daemon on |off
nginx运行再前台还是后台
daemon on 后台模式
-
timer_resolution time
计时器精度, 时间越大,系统调用越少,有利于性能提升 。
timer_resolution 100ms
event配置段
-
use
nginx 使用哪种事件驱动模型. (不用指定,让nginx 自己选择)
-
worker_connections
worker子进程能处理的最大并发连接数
默认1024
worker_connections 65535;
-
accept_mutex
是否打开负载均衡互斥锁
accept_mutex on (推荐)
处理新的连接请求的方法;on意味着由各worker轮流处理新请求,Off意味着每个新请求的到达都会通知所有的worker进程;
-
accept_mutex_delay
新连接分配给worker子进程的超时时间
accept_mutex_delay 200ms (推荐)
-
lock_file
负载均衡互斥锁文件存放路径
-
muti_accept
worker子进程可以接收的新连接个数
muti_accept on ; 推荐
server配置块
配置块: server
由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了
语法: server_name name[…];
默认: server_name"";
配置块: server
虚拟主机名可以使用确切的名字,通配符,或者是正则表达式来定义,在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。
注意:优先级问题,所导致的配置不生效
server_name与Host的匹配优先级如下:
1)首先选择所有字符串完全匹配的server_name,如 nginx.2367.com 。
2)其次选择通配符在前面的server_name,如 *.2367.com。
3)再次选择通配符在后面的server_name,如nginx.2367.* 。
4)最后选择使用正则表达式才匹配的server_name,如 ~^\.testweb\.com$
~表示正则表达式
如果都不匹配
1、优先选择listen配置项后有default或default_server的
2、找到匹配listen端口的第一个server块
location配置块
location
语法: location[=|~|~*|^~|@]/uri/{...}
配置块: server
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择
location{}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location的匹配规则。
location表达式类型
~ 表示执行一个正则匹配,区分大小写;
~* 表示执行一个正则匹配,不区分大小写;
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location;
= 进行普通字符精确匹配。也就是完全匹配;
@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
优先级
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项
前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个
正则表达式类型(~ 或 ~*)的优先级次之。一旦匹配成功,则不再查找其他匹配项
常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径)
文件路径的定义 root、alias
以root方式设置资源路径
语法: root path;
配置块: http、server、location、if
以alias方式设置资源路径
语法: alias path;
配置块: location
alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location后面的uri参数
注意: location中使用root指令和alias指令的意义不同
(a) root,相当于追加在root目录后面 。比如访问的是 xxx.com/test root www; 等于=> /www/test
(b) alias,相当于对location中的url进行替换,比如访问的是 xxx/test,想要访问到/www/test就必须设置 alias /www/test
location 案列
1location 的语法
2location [=|~|~*|^~] patt {
3}
4中括号可以不写任何参数,此时称为一般匹配
5也可以写参数
6因此,大类型可以分为3种
7location = patt {} [精准匹配]
8location patt{} [一般匹配]
9location ~ patt{} [正则匹配]
10
111.精准匹配
12实验一
13location = / {
14 root /var/www/html;
15 index index.htm index.html;
16}
17/ 代表目录 一般匹配
18location / {
19 root html;
20 index index.html index.htm;
21}
22
23访问 192.168.99.99
24那么会报404
25实际流程这么走的
26先精准匹配 192.168.99.99/index.htm
27那么精准不能匹配了,就交给 location /
28
29所以会去访问 /usr/local/nginx/html/index.htm 页面
30
31
32实验二
33location = / index.htm{
34 root /var/www/html;
35 index index.htm index.html;
36}
37
38location / index.htm{
39 root html;
40 index index.html index.htm;
41}
42访问 192.168.99.99/index.htm 那么 访问的是 /var/www/html/index.htm
43访问192.168.99.99/index.html 那么访问的是 /usr/local/nginx/html/index.html 第二个location会命中
44
45
46
47正则location
48 location / {
49 root html;
50 index index.html index.htm;
51 }
52
53
54 location ~ image {
55 root /var/www/html;
56 index index.html index.htm;
57}
58 如果我们访问 192.168.99.99/image/logo.png
59此时 / 与 “/image/logo.png” 匹配
60同时,”image” 正则 与“image/logo.png” 也能正则匹配
61
62这个时候是正则 生效的
63
64 访问图片应该是 /var/www/html/image/logo.png
65
66 其实这个也可以算是 动静分离了。 图片已经 分离web目录了 /usr/local/nginx/html
location uri中 带/ ,和不带 / 的区别
1location /test{ #先当目录来处理,目录没有当文件来处理
2
3}
4location /test/{ # 回当目录来处理
5
6}