环境:
centos6/7,nginx-1.9.15.
摘要说明:
上一篇我们对配置文件的所有配置做了整体的详解,及日志的配置及分割
本篇主要讲述nginx下server节点中location进行详细的解析,后续主要配置工作也在于此;
步骤:
1.虚拟主机
从上篇我们可以看到主配置文件下nginx.conf的整体结构如下:
其中main,event,http都为全局配置;而server开始则是我们对服务的配置:
虚拟主机(server):虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。
利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。
虚拟主机(server)是由监听端口和主机名称构成联合主键的;其中主机名称可为域名也可为ip:
举例:基于域名的虚拟主机:
server {
#监听端口 80
listen 80;
#监听域名abc.com;
server_name abc.com;
location / {
# 相对路径,相对nginx根目录。也可写成绝对路径
root abc;
# 默认跳转到index.html页面
index index.html;
}
}
基于ip的虚拟主机:
server {
listen 80;
server_name 192.168.197.142;
location / {
root html;
index index.html;
}
}
当然也可基于端口:
server {
listen 2022;
server_name localhost;
location / {
root /home;
index index.html;
}
}
注:若监听端口只设置其中一项(域名或ip)主机 ;其他的也会匹配上
一般在nginx.conf的主配置文件上配置将每个虚拟主机生成一个conf文件放在conf/conf.d/下:
include /usr/local/nginx/conf/conf.d/*.conf;
2.location
当请求路径确认到虚拟主机上后,后续就是根据location来进行匹配路由地址;
location语法:location [=|~|~*|^~] /uri/ {… }
各符号解释如下:
符号 | 含义 |
= | = 开头表示精确匹配 |
^~ | ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) |
~ | ~ 开头表示区分大小写的正则匹配 |
~* | ~* 开头表示不区分大小写的正则匹配 |
/ | 一般匹配 |
注:首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求;即优先级为: 完全匹配(=) ;前缀匹配( ^~
);正则匹配(~
、~*
); 普通匹配(/
)
规则
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项
- 前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个
- 正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其他匹配项
- 常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个
说明
- 先判断精准命中,如果命中,立即返回结果并结束解析过程
- 若未结束,判断前缀普通命中,如果有多个命中,使用表达式“最长”的命中结果,结束解析过程
- 若未结束,继续判断正则表达式的匹配,按正则表达式顺序为准,由上至下一旦匹配成功1个,立即返回结果,并结束解析过程
- 若未结束,继续普通命中,普通命中和前缀普通命中相似,顺序无所谓,按照location表达式的长短来确定命中结果
示例:
#基于端口
server {
listen 2004;
server_name localhost;
#=精确匹配
location = /static/ {
return 200 '/static/';
}
#^~匹配url
location ^~ /static/aa/ {
return 200 '/static/aa/';
}
#~正则匹配url区分大小写
location ~ /static/aa/bb/ {
return 200 '/static/aa/bb/';
}
#~正则匹配url区分大小写
location ~ /static/bb/ {
return 200 '/static/bb/';
}
#~*正则匹配url不区分大小写
location ~* /static/BB/ {
return 200 '/static/BB/';
}
#~*正则匹配url不区分大小写
location ~* /static/CC/ {
return 200 '/static/CC/';
}
#一般匹配
location /static/cc/aa/ {
return 200 '/static/cc/aa/';
}
#一般匹配
location /static/dd/ {
return 200 '/static/dd';
}
#一般匹配
location /static/dd/aa/ {
return 200 '/static/dd/aa/';
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
示例中的return表示直接返回响应状态为200,并返回对应的字符串;更多语法为:
- return code [text];
- return code URL;
- return URL;
通过curl执行结果如下:
# curl http://127.0.0.1:2004/static/aa/
/static/aa/
# curl http://127.0.0.1:2004/static/aa/bb/
/static/aa/
# curl http://127.0.0.1:2004/static/bb/
/static/bb/
# curl http://127.0.0.1:2004/static/bb/cc
/static/bb/
# curl http://127.0.0.1:2004/static/cc/
/static/CC/
# curl http://127.0.0.1:2004/static/cc/cc
/static/CC/
# curl http://127.0.0.1:2004/static/cc/aa/
/static/CC/
# curl http://127.0.0.1:2004/static/dd/
/static/dd
# curl http://127.0.0.1:2004/static/dd/aa/
/static/dd/aa/