Skip to content
当前页

nginx配置

nginx的server块

如何让server_name生效

server块如果都没有设置为default_server,那么会取第一个server作为default_server

如果存在default_server,同时另外的server配置了server_name,则server_name未匹配时会访问不了

server中的location块

location块的优先级

  1. = 精确匹配,优先级最高
  2. ^~, 最佳前缀匹配(先匹配最长路径,且不再考虑正则匹配)
  3. ~ / ~*,正则匹配(~区分大小写 ~*不区分大小写),正则匹配是有顺序的,先匹配上的正则会忽略后续的正则,慎用
  4. / 斜杠开头 普通前缀匹配(优先级最低)

location的匹配步骤

精确匹配 -> 前缀匹配 -> 正则匹配,前缀匹配如果没有发现最佳前缀匹配,则还需要看正则匹配,如果又发现了正则匹配,那么正则匹配优先级更高,

当一个请求进入 Nginx 时,它会经历以下“心理路程”:

  1. 精确检查: 先看有没有 = 定义的精确匹配。如果有,直接成交,收工。
  2. 前缀搜寻: 扫描所有非正则(这里包括普通前缀匹配和带了^~修饰符的最佳前缀匹配)的 location(即普通的 location /abc/)。它会记住最长的那个匹配项。
  3. 封顶拦截: 如果搜到的最长匹配项带有 ^~ 修饰符,OK,Nginx 觉得够了,直接用它,跳过后面的正则检查。
  4. 正则漫游(关键点): 如果最长匹配项只是普通前缀(没带 ^~),Nginx 会暂时把这个结果“存进草稿箱”,然后开始从头到尾扫描正则表达式
  • 只要匹配到一个正则,就立即使用该正则,抛弃刚才“草稿箱”里的前缀匹配。
  • 顺序很重要: 如果有多个正则都能匹配,谁写在前面谁赢。
  1. 兜底方案: 如果所有的正则都匹配失败,Nginx 才会回过头,使用刚才“草稿箱”里存的那个最长前缀匹配。

修改配置后怎么生效

shell
# 先测试语法是否ok
# 如果看到: syntax is ok 和 test is successful,说明配置没问题
nginx -t

# 热重载
nginx -s reload

Last updated: