文档章节

nginx怎样处理一个求情

 小猪突然地
发布于 2015/06/11 19:48
字数 1413
阅读 31
收藏 0
点赞 0
评论 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 ⋅ 0

基于JFinal的程序在Nginx+Tomcat集群配置怎样合理?

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

江哥一直在 ⋅ 2013/04/09 ⋅ 5

springmvc 根据请求的扩展名来返回数据

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

少不读水浒 ⋅ 2015/08/28 ⋅ 2

高级运维工程师面试题(更新中)

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

neo-chen ⋅ 2016/04/18 ⋅ 5

Nginx和PHP分离部署

Nginx本身并不支持对外部程序的直接调用或者解析,需通过FastCGI进行调用。Nginx收到CGI请求之后,转发到FastCGI接口在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析。 Fast...

hiwill ⋅ 2016/07/24 ⋅ 0

Nginx限速模块初探

Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟。我们会通过一些简单的示例展示Nginx限速模块是如何工作...

a小鼠标 ⋅ 2017/12/25 ⋅ 0

nginx配置域名跳转问题

nginx中一个网站配置了5个域名,确定主推的域名为www.test.com后,做了如下跳转: if ($host != 'www.test.com') { rewrite ^/(.*)$ http://www.test.com/$1 permanent; } 现在想增加个域名w...

星辰~ ⋅ 2012/03/31 ⋅ 6

nginx、apache和lighttpd比较

Apache介绍: Apache是基于模块化设计的,它的核心代码并不多,大多数的功能都被分散到各个模块中,各个模块在系统启动的时候按需载入。 MPM(Multi -Processing Modules,多重处理模块)是A...

stone_ ⋅ 2016/06/12 ⋅ 2

Nginx filter 模块解析

我们知道nginx很多功能都是通过filter模块来实现的,如:替换content的sub module、content压缩的gzip module等。接下去我们看看nginx是怎样处理filter模块的。 Nginx filter module所有的代...

mickelfeng ⋅ 2012/12/28 ⋅ 0

ngnix 域名跳转到指定页面

nginx中原先配置有一个域名www.hwsh123.com, 现在又申请了一个域名www.hwsh8.com,如何把这个新域名在ngnix里面 配置成指向 www.hwsh123.com/abc.html一个页面,也就是说浏览器输入 www.hwsh...

rarph ⋅ 2016/05/19 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部