文档章节

nginx怎样处理一个求情

 小猪突然地
发布于 2015/06/11 19:48
字数 1413
阅读 33
收藏 0

本文参考文章:http://nginx.org/en/docs/http/request_processing.html

nginx要处理一个请求,首先得接收到一个请求。

1. 基于名字的虚拟服务器

   下面看看这个nginx配置文件的部分配置。

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",然后决定将请求转发到那个服务器上。如果这个"Host"的值没有任何服务器的名字与之相匹配,或者说这次请求没有包含请求头有header为"Host"。那么nginx会将这次请求转发到指定监听端口(*.80)的默认服务器上。

    在上面的配置中,第一个server就是默认的服务器,这时nginx默认的标准设置。

    当然除了nginx自动设置默认服务器外,我们也可以自己配置这个默认服务器,方式如下:

    在listren指令后面添加default_server即可。如:

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

    注意:

          a) default_server是从0.8.21版开始支持的,以前的版本不支持这个设置。

          b) default_server是listen指令的一个参数属性,而不是server_name的参数属性。

2. 怎样阻止请求头中没有"Host"的请求被处理

我们可以这样做,将server_name 设置成一个空字符串,这样就能匹配到乜有"Host"请求头的服务器,然后做相应的处理。如:

 

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

3. 基于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首先会去测试server命令块中listen指令的ip地址和端口是否与请求的相匹配。如果没有匹配的就转到默认服务器上处理。

   如果有配的ip和端口,然后在通过"Host"这个header来匹配到底选择哪个服务器,如果没有找到名字匹配的服务器,那么请求会被转发到默认的处理服务器上。

   如果找到匹配的就给配置的服务器处理。

   例如: 来自192.168.1.1:80 host是www.example.com的请求,将会交个默认服务器处理。因为他请求匹配的ip和端口所对应的server中没有host为www.example.com

4. 不同的ip和端口,可以各自设置默认处理服务器。

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

5. 简单的请求配置

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

  下面我们来分析下:

   1) 如果请求的是"/logo.gif",首先匹配的location是"/",这是第一个满足条件的路径匹配,然后再去匹配正则表达式为”\.(gif|jpg|png)$"的location,这时第二个满足条件的匹配。最终会使用第二次的匹配路径,因为更长更明确。然后使用root指令指定的路径下去寻找,如"/data/www/logo.gif",最后将找到后资源会返回到客户端。

    2) 如果请求的是"/index.php",首先还是会去匹配为"/"的location,然后再去匹配正则表达式为"\.(php)$"的location,根据location的匹配规则,第二次的匹配路径将会被最终使用,这里,请求将会被转发给FastCGI server 监听为localhost:9000的服务器来处理。

       fastcgi_param指令设置FastCGI 的参数为SCRIPT_FILENAME,相当于告诉FastCGI server将会按照指定的路径和请求名去执行这个文件。

       变量$document_root相当于root指令的值

       变量$fastcgi_script_name相当于请求的URI,如"/index.php"

       所以最终FastCGI 的参数SCRIPT_FILENAME: /data/www/index.php

   3) 如果请求的是"/about.html",唯一匹配的location是"/", 因此会使用root指令指定的路径,这将在这个路径下去找"about.html",所以最终的返回给客户端的是 /data/www/about.html文件。

   4) 处理请求"/"是非常复杂的,只会匹配前缀为"/"的location,而index指令则会去检测"root /data/www"下是否有index.html文件,如果"/data/www/index.html"不存在,而"/data/www/index.php"存在,此时则会做一个内部重定向到"/index.php",此时nginx会再做一次为"/index.php"的请求,然后去匹配对应的location。因此最终会将这个请求转发到 FastCGI server来处理

6. 最后简单的介绍一下location的匹配规则

官方的解释是:

1. Directives with the = prefix that match the query exactly. If found, searching stops.
2. All remaining directives with conventional strings, longest match first. If this match used the^~ prefix, searching stops.
3. Regular expressions, in order of definition in the configuration file.
4. If #3 yielded a match, that result is used. Else the match from #2 is used.

 

1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。
2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
3. 正则表达式,在配置文件中定义的顺序。
4. 如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。

  本文简单介绍了,nginx如果转发处理一个请求,也简单介绍了location的匹配规则,有写的不对的地方,希望大家可以指出来,大家一起深刻理解,一起进步。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 23
码字总数 20045
作品 0
成都
程序员
彩印网维护中碰到的问题记录

一新站上线了,用Fiddler2监控下http求情,结果不看不知道,一看吓一跳:访问product页面的时候,竟然又请求了一次homepage。幸亏之前homepage已经全页缓存,并且有header 304来罩着,否则性...

创意顽石
2016/01/30
100
0
基于JFinal的程序在Nginx+Tomcat集群配置怎样合理?

大家好, 最近研究OSC上讨论比较多的JFinal开源项目,发现确实很轻量,耦合很低,是一个很不错的、高效的开源东东。。。赞了!!! 小弟弱弱地问一下大家的JFina项目有用Nginx+tomcat集群的吗...

江哥一直在
2013/04/09
1K
5
springmvc 根据请求的扩展名来返回数据

在做web网站的时候,需要根据求情的扩展名来返回数据,比如如果请求是xxx.json,那么就返回 一个json回去?

少不读水浒
2015/08/28
184
2
高级运维工程师面试题(更新中)

高级运维工程师面试题(更新中) 原创 2016-04-18 景峯 Netkiller senior operations engineer Mar 3, 2016 高级运维工程师 服务器硬件 RAID 磁盘阵列 简述 RAID? RAID 0 5 6 10 50 都适用于那...

neo-chen
2016/04/18
1K
5
Centos6.3 下安装 Ngixn +tornado + supervisor

tornado先天对异步(no-bolocking)处理能力,非常适合作为Web服务。tornado在linux平台使用epoll来实现异步事件的处理,性能非常好。但是python做为一个脚步语言,单进程执行,无法利用多CPU...

dhole
2013/02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Generator-ES6

基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装...

简心
8分钟前
2
0
FullCalendar日历插件说明文档

普通显示设置 属性 描述 默认值 header 设置日历头部信息。 如果设置为false,则不显示头部信息。包括left,center,right左中右三个位置,每个位置都可以对应以下不同的配置: title: 显示当...

ada_young
9分钟前
0
0
Redis知识总结--string的内部实现

SDS(Simple Dynamic String) String的数据结构是一个字节数组,但简单的获取数组长度的时间复杂度就是O(n),这对于单线程的redis来讲是不能接受的,因此string在redis中的实现是SDS类,SDS类...

looqy
19分钟前
1
0
SpringBoot开发案例之整合Dubbo分布式服务

前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使用的 ...

Java干货分享
25分钟前
1
0
美团团购订单系统优化记

团购订单系统简介 美团团购订单系统主要作用是支撑美团的团购业务,为上亿美团用户购买、消费提供服务保障。2015年初时,日订单量约400万~500万,同年七夕订单量达到800万。 目标 作为线上S...

Skqing
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部