nginx配置文件解析算法
当一个请求到达时,nginx通过如下算法确定最终用哪一个block来serve这次请求。
- listen匹配,nginx会先把所有server的ip:port用默认值补全,然后和目标请求的ip:port匹配,匹配优先级如下
- 唯一完全匹配——直接选中server
- 最高匹配度的一批server——比较server_name
- server_name匹配
- 完全匹配——直接选中server
- 尝试把请求host的第前一级域名变成*号到配置中去匹配——选中server
- 尝试把请求host的最后一级域名变成*号到配置中去匹配——选中server
- 尝试把请求host与配置中正则表达式的server_name去匹配——选中server
- 选中default server
- location匹配
- 带有 = 修饰符,能完全匹配的location——直接选中
- 寻找最长的前缀匹配结果,如存在,且带有 ^~ 修饰符,直接选中,若不带修饰符,暂存,然后看正则表达式location匹配结果
- 如果前缀匹配location的暂存结果中,有能匹配到的正则表达式location,则那个location优先级置顶,最终优先级最高的location被选中
- 如果没有正则表达式location被选中,之前暂存的前缀location被选中