nginx 怎么处理一个请求

nginx 怎么处理一个请求【本文只是翻译官方文档】

原文:http://nginx.org/en/docs/http/request_processing.html


基于名字的虚拟服务器

nginx首先决定哪个server应该处理请求,我们先从一个简单的例子开始:三台监听80端口的虚拟服务器

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

在这个配置中,nginx测试的是只通过 header line “Host”决定哪台server处理请求。
如果“Host”header line 不匹配任何 server_name,或者用户请求中根本就不包括这些server_name,
那么nginx将会将这个请求转发给默认的server。在上面的配置中,第一个就是默认server(这是nginx默认的配置规则)。
如果你不想让第一个server作为默认的,那么可以在listen指令中添加“default_server”参数来明确指定
如下:
server {
    listen       80  default_server;
    server_name  nginx.net  www.nginx.net;
    ...
}


PS:0.8.21之后的nginx版本才支持“default_server”参数
     “default_server”参数是监听端口的一个属性,不是服务器名字



怎么阻止没有指定服务器名字的请求
如果不想处理没有指定的“Host”header line请求,你需要定义一个丢掉请求的服务器
如下:
server {
    listen       80;
    server_name  "";
    return       444;
}

server_name是空的话就可以匹配没有“Host”header line的请求,会返回一个特定代码444,并断开客户端的链接

0.8.48版本以后,nginx就有了处理上述那种请求的功能,所以这个设置在配置文件中可以忽略了



服务器名和IP地址混合的虚拟服务器

我们来看一个更复杂的配置,虚拟服务器监听不同地址的端口
如下:

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


在这种配置中,nginx首先检查“server”模块“listen”指令中对应的的IP地址和端口
然后检查请求的“Host”header line中“server”模块的“server_name”项
如果找不到主机名就会把请求转给默认server
比如:
192.168.1.1:80端口收到www.nginx.com的请求,就会把请求转发给第一个server的192.168.1.1:80处理,
即使第一个server没有指定www.nginx.com

就如之前所说,默认server是监听端口的属性,不同的默认servers可能会被指定不同的监听端口
比如:
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;
    ...
}



一个简单的PHP站点的配置
我们现在看一个nginx怎么选择location去处理一个典型简单的PHP站点请求的例子:
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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值