nginx-2 如何处理一个请求

nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,最后就是location里的具体处理(可以是代理转发请求或者直接返回静态内容...)

基于名称的虚拟服务器

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判断使用那个服务器的依据是request头部中的HostHost 匹配到哪个server_name就使用哪个服务器。如果都不匹配,则使用默认的服务器。在未显示指定默认服务器的情况下,比如上面的这个例子,nginx认为第一个server为默认服务器。如需显示指定,如下。

# 0.8.21 版本以前使用的是default
server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

注意:default_server 是监听端口的一个属性。

如何处理不含Host头部的请求

server {
    listen      80;
    # 使用空字符串匹配未定义的Host
    server_name "";
    # 返回一个特殊状态码,并关闭连接
    return      444;
}

注意:0.8.48版本以后,""是server_name的默认值,所以此处可以省略server_name "";在更早的版本,server_name的默认值为主机的hostname。

基于名称和IP的混合虚拟服务器

前提知识:一台主机可以有多个IP(多网卡),一个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地址和端口,匹配成功之后,再匹配相应的server_name,这个通过之后就选择使用该server处理请求,否则使用默认的server。正如前面所说,default_server 是监听端口的一个属性,所以不同的默认服务器应该有且只有一个定义在不同的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;
    ...
}

一个简单的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首先不考虑列出的顺序,搜索文本字符串给出的最具体的前缀位置(location)。在上面的配置中,唯一的前缀位置是“/”,因为它匹配任何请求,所以它将用作最后的匹配。然后nginx按照配置文件中列出的顺序检查正则表达式给出的位置。第一个匹配表达式停止搜索,nginx将使用此位置。如果没有与请求匹配的正则表达式,那么nginx使用前面找到的最具体的前缀位置。

注意,所有类型的位置只测试匹配(test)请求行的URI部分,不包含参数(query_string)。这是因为查询字符串中的参数可以通过多种方式给出,例如:

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

此外,请求查询字符串中的内容是变化的;

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

所以location只有匹配uri的功能,没有匹配query_string的功能。

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

  • /log.gif
    首先匹配位置/,接着匹配~* \.(gif|jpg|png)$,因此,由后者处理。使用指令root /data/www,请求被映射到/data/www/logo.gif,该文件被发送回客户端。
  • /index.php
    首先匹配位置/,接着匹配~ \.php$,因此由后者处理。请求配传递到监听在localhost:9000的FastCGI服务器。fastcgi_param指令设置了参数SCRIPT_FILENAME/data/www/xxx.xxx(xxx.xxx = fastcgi_script_name),然后FastCGI服务器执行了该文件。变量document_root等同于root指令的参数,变量fastcgi_script_name等同于请求的uri,比如/index.php
  • /about.html
    只匹配位置/,因此由其处理,请求被映射到/data/www/about.html,该文件被发送回客户端。
  • /
    处理/比较复杂。它只匹配位置/,因此由其处理。index指令根据它的参数和root /data/www依次检测index文件是否存在。如果/data/www/index.html不存在,/data/www/index.php存在,index指令会内部重定向到/index.php,nginx再次搜索这些location,就好像请求是由客户机发送的一样。如上所述,重定向的请求将会被FastCGI服务器处理。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容