高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制

1. 处理什么样的请求

处理访问到 Nginx 所在 IP 地址的请求,并且这些请求的 HTTP 头信息中的 Host 为所要处理的域名(如下以80端口为例),如下几个 server 就对应响应的请求:

server {
    listen       80;
    server_name  nginx.org  www.nginx.org;
    ...
}

server {
    listen       80;
    server_name  nginx.net  www.nginx.net;
    ...
}

server {
    listen       80;
    server_name  nginx.com  www.nginx.com;
    ...
}

2. 默认 server

如果不主动设置默认server,那么第一个server就会被当做默认server。若要主动设置,应该如下配置:

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

此项的版本注意事项:

  • 0.8.21 版本之前,使用default关键词;
  • 从 0.8.21 版本开始,使用default_server关键词。

另外注意,default_server是端口的一个属性,不是server_name的一个属性。

3. 如何处理未定义 host 为 server_name 的请求

比如,如果不想处理 HTTP 请求中没有 HOST 字段的头信息的情况,那么可以如下:

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

此项的版本注意事项:

  • 0.8.48 之前的版本,如果没有设置server_name的话,那么会把server_name设置为本机的 hostname。
  • 0.8.48 开始的版本,如果没有设置server_name的话,那么会把server_name设置为"",所以如果要达到上述代码的效果,在此版本开始可以不设置server_name

4. Nginx 的虚拟主机监听

请先看如下配置:

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

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

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

这个应该很好理解,如果listen的 IP 地址和端口号都吻合了,就看 HTTP 请求中的 HOST 头信息与某个server_name中的 name 是否吻合。如果server_name不吻合,就到该端口对应的default_server那里处理请求,如果default_serverserver_name也没有与 HOST 头信息吻合,那么就放弃该请求。

特别再次强调,default_server是端口的属性,而非server_name的属性。所以可以有如下配置:

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

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

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

5. 一个简单的 PHP 站点的 Nginx 配置

server {
    listen        80;
    server_name   nginx.org  www.nginx.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的时候,不是按照配置代码给出的顺序进行匹配的,而是先按照匹配表达式中的文字字符串(literal string)的明确程度,从最明确的开始匹配。这么说可能有点含混不清,简单说,没有正则规则的匹配表达式,是最明确的。比如如果这个匹配表达式就是一个“/”或者“/abc”,那么这就是最明确的。上例中的"/"就是这个最明确的蚊子字符串(the most specific literal string),其实也是该例中唯一的。所以先从这个location开始,然后再按照location的列出顺序,依次匹配,直到出现第一个匹配的location后停止。如果所有的location都不匹配,就用第一个找到的最明确的文字字符串来匹配(the most specific literal string)。

6. 待查询的 HTTP 请求

Nginx只处理无查询的HTTP请求,因为查询请求的查询字段的顺序不确定,比如:

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

再比如:

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

7. 几个location的例子

例1:

/logo.gif

“/”先被找到,然后匹配"\.(gif|jpg|png)$",再根据 redirective 找到root/data/www,然后这个请求就被映射到"/data/www/logo.gif"了,最后文件就被发送给到了客户端。

例2:

/index.php

"/"先被找到,然后匹配"\.(php)$",然后 request 就被传递给在 9000 端口上监听的 FastCGI 服务器,"fastcgi_param" directive 设置 FastCGI 的参数SCRIPT_FILENAME"/data/www/index.php",然后FastCGI服务器就执行这个文件。(注意其中document_root/data/wwwfastcgi_script_name/index.php。)

例3:

/about.html

"/"先被找到,且只有这一个匹配的。然后根据root/data/www,就找到了文件/data/www/about.html,然后发送给客户端。

例4:

/

"/"是很复杂的,先找到"/"这个location,然后根据root/data/www,看/data/www/index.php是否存在,如果存在 directive 就在内部重定向到/index.php,然后 Nginx 根据这个再次搜索location,重复上面第二个例子。

时间: 2024-11-02 09:38:28

高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制的相关文章

高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式

通过<高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景>一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率是相当高的.那么: 1. 如果不命中呢? 我们可以到相应的数据服务器上读取数据,然后将它缓存到Nginx服务器上,然后再将该数据返回给客户端.这样,对于该资源,只有穿透 Memcached的第一次请求是需要到数据服务器读取的,之后在缓存过期时间之内的所有请求,都是读取Nginx本地的.不过Nginx的 pro

高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令

1. 启动 Nginx [email protected]:sudo ./sbin/nginx 2. 停止 Nginx [email protected]:sudo ./sbin/nginx -s stop [email protected]:sudo ./sbin/nginx -s quit -s都是采用向 Nginx 发送信号的方式. 3. Nginx 重载配置 [email protected]:sudo ./sbin/nginx -s reload 上述是采用向 Nginx 发送信号的方

高性能Web服务器Nginx的配置与部署研究系列(1)-- 入门 hello work

简介: Nginx 是一个基于 BSD-like 协议.开源.高性能.轻量级的HTTP服务器.反向代理服务器以及电子邮件(SMTP.POP3.IMAP)服务器.Nginx 是由一个俄罗斯的名叫“Igor Sysoev”的软件工程师开发的,最初用于 Rambler.ru 网站(该网站在俄罗斯国内访问量排名第二) 例子:hello work 1:配置清单: worker_processes  4; events { worker_connections  1024; } http { server

高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景

一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发扬光大,都不听我说声谢谢.在此还是希望我的博文被转载的时候能够被注明出处,满足下我小小的虚荣心. 现在有这样一种应用场景: 客户端Client通过Nginx反向代理,访问服务器Server.每次访问的内容就是将文件File传到Server上,然后可以访问到File的URL被广播到所有Client上,

高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“Hello World”

1. Nginx 程序包 目前最新的开发版本时1.1.12: Linux/Unix:nginx-1.1.12.tar.gz Windows:nginx-1.1.12.zip 我们可以下载稳定版尝试: Linux/Unix:nginx-1.0.11.tar.gz Windows:nginx-1.0.11.zip 2. 下载.解压.安装 Nginx 我们这里以Linux/Unix:nginx-1.0.11.tar.gz为例.下载并解压缩: wget http://nginx.org/download

高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例

概述 从这篇博文起,将带领读者们一起领略Nginx的强大. Nginx 是做什么用的?我相信很多朋友都已经使用过,如果你没有,那么你一定知道以下这些名称之一:Apache,Lighttpd,Tomcat,Jetty. 它们占据了目前Web服务器的几乎全部江山,其中 Apache 是知名度最高的,同时也是最为重量级的.Lighttpd.Tomcat 和 Jetty 相对轻量级,其中 Jetty.Tomcat 多用于作为Java服务器容器. Nginx 是一个基于 BSD-like 协议.开源.高性

高性能Web服务器Nginx的配置与部署研究(9)核心模块之HTTP模块基本常用指令

一.HTTP模块的作用是什么? Nginx的HTTP模块用于控制Nginx的HTTP进程. 二.指令 1. alias 含义:指定location使用的路径,与root类似,但不改变文件的跟路径,仅适用文件系统的路径. 语法:alias <file-path | directory-path> 缺省:N/A 作用域:http.server.location 示例: location /i/ { alias /home/michael/web/i/; } 则请求 /i/logo.png 则返回

高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块

Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: server backend1.example.com; server backend2.example.com; server.backend3.example.com; location / { proxy_pass http://backend; } 1.后端服务器 通过 upstream 可以设定后端服务器,指定的方式可以是 IP 地址与端口

高性能Web服务器Nginx的配置与部署研究(14)平滑升级你的Nginx

1.概述(可以直接跳过看第2部分) Nginx方便地帮助我们实现了平滑升级.其原理简单概括,就是: (1)在不停掉老进程的情况下,启动新进程. (2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求. (3)新进程接受新请求. (4)老进程处理完所有请求,关闭所有连接后,停止. 这样就很方便地实现了平滑升级.一般有两种情况下需要升级Nginx,一种是确实要升级Nginx的版本,另一种是要为Nginx添加新的模块. 2. 升级过程 具体的操作也很简单,如下: (0)查看当前版本 在存放Ngi