Nginx请求处理流程

官方文档地址:http://nginx.org/en/docs/http/request_processing.html
假设我们Nginx的配置如下

http {
    server {
        listen 80 ;
        server_name www.wolfcode.cn  default_server;
        location  ~* \.jsp {
              proxy_pass  192.168.110.110:8080;
        }
        #匹配所有.jsp结尾的请求
       location  ~* \.jsp {
              proxy_pass  192.168.110.110:8080;
        }
      #匹配所有以下结尾的请求
      location ~ \.(gif|jpg|png|js|css)$ {
          root  static;
      }
    }
}

步骤:

  1. 根据IP访问Nginx所在服务器
  2. 匹配server配置中listen监听端口
  3. 匹配server_name,如果都匹配不上则使用默认server
    • 默认server可以通过default_server 指定(这个参数是在 0.8.21 版本以后才有的,而之前是 default 指令)
    • 如果没有指定为 default_server 的话,选用第一个作为默认,
    • 相同listen端口的一组server都可以有一个default_server
    • 可以通过配置定义匹配不到host值时怎么处理,示例:
server {
  listen       80  default_server;
  server_name  _;
  #444是Nginx自己的错误码,表示让Nginx断开与客户端连接
  return       444; 
}

  1. 匹配location
    匹配方式
  • = 开头表示精确匹配

  • ^~ 普通字符匹配 , 但是如果字符匹配到了就不再继续执行正则匹配 (普通的字符匹配完毕会记录最长的匹配记录,但是不会立刻选定, 而是继续进行正则匹配, 如果正则匹配符合就按照正则匹配执行) ,。

  • ~ 开头表示区分大小写的正则匹配

  • ~* 开头表示不区分大小写的正则匹配

  • !~和 !~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

  • / 通用匹配,任何请求都会匹配到。

    匹配规则

    • 首先寻找精准匹配, 如果有则停止匹配
    • 没有则匹配普通匹配 --> 如果有多个匹配 则记录最长匹配结果
    • 匹配正则表达式 --> 如果有匹配-->立即返回, 如果没有-->返回普通匹配最长匹配结果

location 命中过程:

  • 先判断精准命中,如果命中,则立即返回结果并结束解析过程
  • 判断普通命中, 如果有多个命中,记录下来最长的命中结果(注意:是记录但并不结束,记录的是最长的命中)
  • 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功一个, 立即返回结果,并结束解析过程

你可能感兴趣的:(Nginx请求处理流程)