配置Nginx,不可避免的要用到location区块设置。以前使用都是直接上网找教程,不求甚解。现在想系统的了解一下Nginx,就从最常用的location指令入手。

location的语法:

location [ = | ~ | ~* | ^~ ] uri {
  ... //一些指令设置
}

location @name {
  ... //一些指令
}

@语法定义一个命名规则,用于请求重定向。这里主要说一下第一种说法的规则以及匹配顺序。

  • =: 精确匹配
  • ~: 正则匹配(区分大小写)
  • ~*: 正则匹配(不区分大小写)
  • ^~: 以常规字符串开头,不是正则匹配

总结:=,^~或者不写匹配常规字符串,~和~*进行正则匹配。

Nginx匹配uri的流程如下:

  1. 先进行常规字符串前缀匹配,再进行正则匹配。
  2. 对于常规匹配,如果 = (精确匹配)找到,则使用该location的规则,匹配中断。
  3. 常规前缀匹配时,找到最长前缀匹配并标记。例如: location /ABC {…} 和location /ABC/abc {…}两个规则存在,请求 /ABC/a.html 的最长匹配是 /ABC, 而 /ABC/abc.html的最长匹配是 /ABC/abc。注意,此时匹配并未结束。
  4. 如果最长匹配规则定义标识符是^~,使用该规则,匹配中断;否则往下进行正则匹配。
  5. 如果正则匹配规则找到,则使用该正则匹配规则;否则继续往下匹配正则规则,如无规则找到则使用最长匹配规则。

根据匹配流程,优先级依次为:location =, location 完整路径,location ^~, location ~(*)正则顺序, location 部分路径,/。

可以看到 / 请求的优先级最低。如果首页访问量大,可以设置规则 loation = / {…}加速处理。

参考文献

http://nginx.org/en/docs/http/ngx_http_core_module.html#location