美文网首页设计方案
Nginx转发请求过程解析

Nginx转发请求过程解析

作者: Elf_乐易 | 来源:发表于2019-12-06 09:16 被阅读0次

    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转发请求过程解析

        本文链接:https://www.haomeiwen.com/subject/evesgctx.html