阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx请求处理

98次阅读
没有评论

共计 3696 个字符,预计需要花费 10 分钟才能阅读完成。

目录

  1. 基于名称的虚拟主机
  2. 如何避免处理没有服务器名的请求
  3. 混合基于名称和基于 IP 的虚拟服务器
  4. 简单的 PHP 站点配置

1. 基于名称的虚拟主机

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 仅仅检查请求头部的”Host”信息来判断请求应该送到哪个服务器,如果这个值没有匹配任何服务器名,或者请求没有包含头部 Host 信息,nginx 会使用默认服务器来处理这个请求。上面的配置,默认服务器是第一个 (nginx 的标准行为),你也可以精确的指定那个服务器用做默认服务器,只需要你在 listen 指令后面添加 default_server 参数。
server {
    listen      80 default_server;
    server_name example.net www.example.net;
    …
}
注意:default_server 只是监听端口的属性,而不是服务器名称。

2.      如何避免处理没有服务器名的请求
如果请求没有”Host”信息,那么可以不处理这个请求,服务器用于终止 (drop) 掉这个请求可以这么做
server {
    listen      80;
    server_name “”;
    return      444;
}
这里服务器名称被设置为空字符串,将会匹配任何没有”Host”头部的请求,然后返回给客户端 nginx 的非标准代码 404。

3.      混合基于名称和基于 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 地址和端口。然后测试头部的”Host”信息,如果服务器名称 (server name) 没找到,请求
会被默认服务器处理。例如一个请求 www.example.com 在 192.168.1.1:80 被接收将会通过 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;
    …
}

4.      简单的 PHP 站点配置
现在,让我们看看 nginx 如何选择一个 location 处理典型的简单的 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 根据配置文件中的顺序检查正则表达式的 location。第一个匹配到之后就会停止向下搜寻然后使用这个 location。如果没有正则表达式匹配到,nginx 会使用最通用的最早的 location。
注意: 所有类型的 location 仅仅测试部分 URI,不会测试 URI 的参数。因为参数在查询字符串中可以有很多种方式,例如

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

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

除此之外,任何人可以请求任何事情就像这样

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

现在让我们看看上面的配置如何处理请求的

  • 首先”/logo.gif”请求会被前缀 location“/”匹配,然后通过正则表达式”\.(gif|jpg|png)”,因此,它会被后面的 location 处理。使用了指令“root /data/www”, 这个请求会被影射到 /data/www/logo.gif 文件,然后文件被发送到客户端。
  • 请求”/index.php”也会被”/”匹配到,然后被正则表达式”\.(php)$”匹配到。因此它会被后面的匹配处理,然后请求传递监听在 9000 端口的 FastCGI 服务器。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 文件,然后文件发送到客户端。
  • 处理请求”/”更加复杂。它仅仅匹配”/”,因此它被这个位置处理。然后 index 指令测试 index 文件是否存在,如果文件 /data/www/index.html 不存在,文件 /data/www/index.php 存在的话,然后指令做一个内部重定向到 /index.php,然后 nginx 再次寻找 location,就好像客户端已经发出请求一样。就像上面看到的,重定向请求最终会被 FastCGI 服务器处理。

 

CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/125790.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计3696字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中