Nginx使用中遇到的问题记录

问题一、关于空格

nginx配置对空格十分敏感,在关键字和符号的前后,一定记得有空格(或换行)。一个典型的场景是 if { } 语句,大括号前后要有空格,否则可能出现非预期行为。

问题二、关于server块兜底问题

当http块中的所有server块都无法匹配上当前请求时,nginx会以第一个server块作为兜底的匹配选择项。

所以,大部分情况下都需要放一个通用的server块在最所以server块的最上边来处理无任何匹配的请求,如返回404。

http {

    server {
        listen 80;
        server_name _;
        return 404;
    }

        ...
}

问题三、server块匹配规则,即nginx如何决定使用哪个server块来处理请求

起作用的是server块中的listen和server_name两项配置。

其中,listen定义了当前server块要处理什么样的[IP]:[PORT]的请求,server_name则定义了当前server块处理的请求中host头需要满足什么样的条件。

这里摘录一段大佬的描述,原文链接在这


  1. 在尝试确定向哪个服务器块发送请求时,Nginx将首先尝试listen使用以下规则根据指令的特异性来决定:
    1)  Nginx用默认的缺省值来替换所有不完整的lesten指令(完整:IP+port的组合)的缺省值,因此每一个server块的listen指令都可以看作是IP地址和端口的组合。 这种转换的例子有:
      a. 没有listen指令的块使用该值0.0.0.0:80。
           b. 设置为111.111.111.111没有端口的IP地址的块变为111.111.111.111:80
           c. 设置为8888没有IP地址的端口的块变为0.0.0.0:8888
    2)  接下来Nginx会尝试去收集一个server块的列表,这个列表是基于具体的IP和端口最佳匹配。也就是说如果匹配的server块有具体的IP地址,它就不会匹配用0.0.0.0作为默认的IP地址的server块。无论什么情况,在Nginx选择server块的过程中,端口必须准确匹配。
    3)  如果只有一个最具体的匹配,那么该server块将用于提供请求。如果有多个server 块具有相同层次的具体匹配,那么Nginx需继续评估server_name指令 。

  2. 需要特别注意的是,只有 listen 指令在同一层次上有多个匹配的 server 块时,Nginx才会继续评估server_name指令。
  3. 接下来,为了进一步评估具有相同特定listen指令的请求,Nginx会检查请求的“host”标头,此值包含客户端实际尝试访问的域或IP地址。
    Nginx在候选的每一个server模块中,查看其server_name指令,尝试去找到最佳的匹配。Nginx通过下面的公式来进行评估:
    1)  Nginx首先找到server_name与请求的Host头信息精准匹配的server模块,如果找到了这个server模块,它将会被用于服务客户端的请求。若有多个特定的匹配项被找到,第一个会被用于提供服务。
    2)  如果没有找到精准的匹配项,Nginx接下来将尝试去找server_name与前置通配符(在配置中名称的开头用*表示)匹配的server模块。只要找到一个,这个server模块将被用于为客户端提供服务。如果找到了多个匹配,最长匹配结果的server模块将会被用于提供服务。
    3)  如果使用前置通配符没有找到匹配时,Nginx接下来将尝试去找server_name与后置通配符(在配置中名称的结尾用*表示)匹配的server模块。只要找到一个,这个server模块将被用于为客户端提供服务。如果找到了多个匹配,最长匹配结果的server模块将会被用于提供服务。
    4)  如果使用后置通配符没有找到匹配时,Nginx接下来将会评估用正则表达式(在名称前用~表示)定义server_name的server模块。带有与Host头匹配的正则表达式的第一个server_name将被用于提供服务。
    5)  如果没有找到用正则表达式定义server_name的相匹配的server模块时,Nginx接下来会使用默认IP和端口的server模块。

猜你喜欢

转载自www.cnblogs.com/duanzi6/p/12694662.html