美文网首页设计方案
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转发请求过程解析

    nginx转发请求过程 How nginx processes a request 这种配置情况下,第一个serv...

  • nginx请求转发

    现在需要向 www.abc.com,跳转到 另外一个页面,那么就可以这样写

  • nginx 10054: An existing connect

    在使用nginx过程中,有些通过nginx反向代理转发到tomcat的接口请求莫名被强制取消,以至于无法返回数据,...

  • Nginx杂谈

    nginx可以作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至tomcat服务...

  • Nginx配置多个项目

    Nginx反向代理-要经历用户请求到Nginx再请求到服务端,两次请求。负载均衡-只是负责请求的转发 QPS 每秒...

  • Nginx配置

    转摘地址: Nginx一层转发,获取用户IP地址 Nginx一层转发,获取用户IP地址 请求在经过nginx代理转...

  • 4.nginx核心知识

    请求流程解析 web / mail / tcp请求进入nginx引擎nginx引擎属于非阻塞的事件处理引擎,包含有...

  • Nginx-映射站点

    1. 正向代理 Nginx会把请求转发到Proxy,Proxy直接返回数据到请求方 2. 反向代理 Nginx会向...

  • 架构设计之:Nginx 职责分类

    Nginx职责分类 ● 接入层Nginx● 应用层Nginx 接入层Nginx 与业务无关 请求解析对http/h...

  • 入门

    用户手册 Nginx用途:1、 静态资源服务器2、 请求转发, 反向代理3、 请求转发负载均衡 下载Ngin...

网友评论

    本文标题:Nginx转发请求过程解析

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