zoukankan      html  css  js  c++  java
  • Ngnix如何处理http请求



    一, 基于名称的虚拟服务器

    nginx首先确定哪个服务器应处理该请求。让我们从一个简单的配置开始,其中所有三个虚拟服务器都在端口*:80上侦听:

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

    在此配置中,nginx仅测试请求的header字段“host”以确定应将请求路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此header字段,则nginx会将请求路由到该端口的默认服务器。在上面的配置中,默认服务器是第一个服务器-这是nginx的标准默认行为。还可以使用listen指令中的default_server参数来显式设置哪个服务器应为默认服务器:

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

        自0.8.21版以后的版本,default_server参数已可用。在早期版本中,应改用默认参数。

    请注意,默认服务器是侦听端口的属性,而不是服务器名称的属性。稍后再详细介绍。


    二, 如何阻止使用未定义的服务器名称的http请求

    如果不允许不带“主机”header字段的请求,则可以定义仅丢弃请求的服务器:

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

    在这里,服务器名称设置为空字符串,该字符串将与没有“ Host”header字段的请求进行匹配,并返回特殊的nginx的非标准代码444,以关闭连接。

        从版本0.8.48开始,这是服务器名称的默认设置,因此可以省略server_name“”。在早期版本中,计算机的主机名用作默认服务器名。


    三, 基于名称和IP地址混合的虚拟服务器

    让我们看一个更复杂的配置,其中一些虚拟服务器侦听不同的地址:

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

    在这种配置中,nginx首先根据服务器块的侦听指令测试请求的IP地址和端口。然后,它根据与IP地址和端口匹配的服务器块的server_name条目测试请求的“主机”header字段。如果找不到服务器名称,则默认服务器将处理该请求。例如,在192.168.1.1:80端口上收到的对www.example.com的请求将由192.168.1.1:80端口的默认服务器(即第一台服务器)处理,因为没有www.example.com为此端口定义。

    如前所述,默认服务器是侦听端口的属性,并且可以为不同的端口定义不同的默认服务器:

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

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

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

    四, 一个简单的PHP站点配置

    现在,让我们看看nginx如何选择一个位置来处理典型的简单PHP网站的请求:

        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首先搜索文字字符串给定的最特定的前缀位置。在上面的配置中,唯一的前缀位置是“/”,并且由于它匹配任何请求,因此将被用作最后的手段。然后,nginx按照配置文件中列出的顺序检查由正则表达式指定的位置。第一个匹配的表达式将停止搜索,nginx将使用此位置。如果没有正则表达式与请求匹配,则nginx使用较早发现的最特定的前缀位置。

    请注意,所有类型的位置仅测试没有参数的请求行的URI部分。这样做是因为查询字符串中的参数可以通过几种方式给出,例如:

        /index.php?user=john&page=1
        /index.php?page=1&user=john

    此外,任何人都可以在查询字符串中请求任何内容:

        /index.php?page=1&something+else&user=john

    现在,让我们看一下在以上配置中如何处理请求:

        请求“/logo.gif”, 首先与前缀位置“/”匹配,然后与正则表达式“.(gif | jpg | png)$”匹配,因此由后一个位置处理。使用指令“root /data/www”将请求映射到文件/data/www/logo.gif,然后将文件发送给客户端。
        请求“/index.php”, 也首先与前缀位置“/”匹配,然后与正则表达式“.(php)$”匹配。因此,它由后一个位置处理,并将请求传递到在localhost:9000上侦听的FastCGI服务器。 fastcgi_param指令将FastCGI参数SCRIPT_FILENAME设置为“ /data/www/index.php”,然后FastCGI服务器执行该文件。变量$document_root等于root指令的值,变量$fastcgi_script_name等于请求URI,即“/index.php”。
        请求“/about.html”仅与前缀位置“/”匹配,因此在该位置进行处理。使用指令“root /data/www”将请求映射到文件/data/www/about.html,然后将文件发送给客户端。
        处理请求“/”更为复杂。它仅与前缀位置“/”匹配,因此由该位置处理。然后,index指令根据其参数和“root /data/www”指令对索引文件的存在进行测试。如果文件/data/www/index.html不存在,文件/data/www/index.php存在,则该指令将内部重定向到“/index.php”,并且nginx再次搜索位置如果请求是由客户端发送的。如前所述,重定向的请求最终将由FastCGI服务器处理。

  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/ufto/p/12636436.html
Copyright © 2011-2022 走看看