设计方案

Nginx转发请求过程解析

2019-12-06  本文已影响0人  Elf_乐易

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;
    }
}

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

总结

请求进来时,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工具使用说明

上一篇下一篇

猜你喜欢

热点阅读