Nginx转发请求过程解析

nginx转发请求过程

How nginx processes a request

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

这种配置情况下,第一个server就是默认配置。请求通过Header中的"Host"来匹配到对应的服务,如果没有匹配到任何server_name,则路由到默认server(第一个server)处理。

default_server

通过给listen增加 default_server参数明确指定哪个server是默认server(default_server参数从0.8.21版本开始有效)。注意:default_server是用作用于端口的,而不是server_name

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

防止使用未定义的的sever name处理请求

可以定义一个server_name属性为空的server来处理没有Host的请求(从0.8.48版本开始,server_name默认是"",之前的版本默认是hostname)。

server {
    listen      80;
    server_name "";
    return      444;
}

这个配置标识请求Header中Host为空时,会返回“444”响应码,然后关闭链接。

基于名称和IP的组合server

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

请求Header中的Host匹配到server_name后,会转发到IP+端口上,如果为匹配到server_name,如前面所述,会转发到第一个server来处理请求,当然也可以通过default_server属性来指定端口的默认server。

简单配置实例

server {
    listen      80;
    server_name example.org www.example.org;
    root        /data/www;

    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

如上配置,处理请求流程如下:

  • 请求“/logo.gif”,首先匹配到"/",然后匹配正则表达式“\.(gif|jpg|png)$”,匹配成功,因此进入“\.(gif|jpg|png)$”的location,使用指令“root /data/www”处理请求,请求映射到“/data/www/logo.gif”文件上返回给客户端;
  • 请求“/index.php”,首先匹配到"/",然后匹配正则表达式“\.(php)$”,匹配成功,因此进入“\.(php)$”的location,请求转发到FastCGI服务器监听的localhost:9000上,fastcgi_param指令会将FastCGI的SCRIPT_FILENAME参数设置为“/data/www/index.php”,然后FastCGI服务器执行这个文件。$document_root参数会设置为root指令的值,$fastcgi_script_name 会设置为请求的URI,这里就是“/index.php”;
  • 请求“/about.html”,首先匹配到“/”,其他匹配都不成功,因此由“/”的location来处理,使用指令“root /data/www”将请求映射到/data/www/about.html文件返回给客户端。
  • 请求“/”的处理会比较复杂,“/”只会匹配到“/”,因此由“/”的location来处理,index指令会通过“root /data/www”指令验证index参数中的文件是否存在。如果/data/www/index.html存在,则转发到/data/www/index.html;如果/data/www/index.html不存在 /data/www/index.php 存在,则内部转发到 /index.php ,nginx会再次搜索配置的locations,如同客户端发起新的请求一样,那么请求将会如第二条所述,最终由FastGCI服务器处理;

总结

请求进来时,nginx会按照如下步骤来匹配请求(匹配请求只用URI不带参数的部分)

  1. 在配置的location列表中搜索URI不带参数的最完整字符串,逐渐减短匹配串,最长的成功匹配将会被选择并保存;
  2. 根据配置顺序匹配正则表达式,匹配成功则停止;
  3. 如果正则表达式匹配成功,则使用正则表达式匹配成功的location,否则使用第一步匹配到的location

其他文章列表

spring web service系列1
spring web service系列2
spring web service系列3
maven配置文件settings.xml详解
Nginx中的负载均衡算法
Nginx upstream指令配置说明
Nginx中虚拟服务器server指令配置说明
Nginx中proxy_pass/proxy_redirect/proxy_set_header配置说明
Nginx中ngx_http_core_module相关指令配置说明
Java自带JVM监控工具jstat使用详细说明
Java自带JVM监控工具jps使用详细说明
Java自带故障分析工具jmap工具使用说明
Java自带故障分析工具jhat工具使用说明

你可能感兴趣的:(Nginx转发请求过程解析)