问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nginx如何处理一个请求

发布网友 发布时间:2022-12-09 15:26

我来回答

1个回答

热心网友 时间:2023-12-25 00:25

Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始:

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仅仅检查请求的“Host”头以决定该请求应由哪个虚拟主机来处理。如果Host头没有匹配任意一个虚拟主机,或者请求中根本没有包含Host头,那nginx会将请求分发到定义在此端口上的默认虚拟主机。在以上配置中,第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的默认行为。而且,可以显式地设置某个主机为默认虚拟主机,即在"listen"指令中设置"default_server"参数:

server {
listen      80 default_server;
server_name example.net www.example.net;
...
}
"default_server"参数从0.8.21版开始可用。在之前的版本中,应该使用"default"参数代替。

请注意"default_server"是监听端口的属性,而不是主机名的属性。后面会对此有更多介绍。

如何防止处理未定义主机名的请求

如果不允许请求中缺少“Host”头,可以定义如下主机,丢弃这些请求:

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

在这里,我们设置主机名为空字符串以匹配未定义“Host”头的请求,而且返回了一个nginx特有的,非http标准的返回码444,它可以用来关闭连接。

从0.8.48版本开始,这已成为主机名的默认设置,所以可以省略server_name ""。而之前的版本使用机器的hostname作为主机名的默认值。

基于域名和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配置块中的listen指令配置。接着nginx继续测试请求的Host头是否匹配这个server块中的某个server_name的值。如果主机名没有找到,nginx将把这个请求交给默认虚拟主机处理。例如,一个从192.168.1.1:80端口收到的访问www.example.com的请求将被监听192.168.1.1:80端口的默认虚拟主机处理,本例中就是第一个服务器,因为这个端口上没有定义名为www.example.com的虚拟主机。

默认服务器是监听端口的属性,所以不同的监听端口可以设置不同的默认服务器:

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站点配置

现在我们来看在一个典型的,简单的PHP站点中,nginx怎样为一个请求选择location来处理:

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会忽略location在配置文件出现的顺序。上面的配置中,唯一的前缀匹配location是"/",而且因为它可以匹配任意的请求,所以被作为最后一个选择。接着,nginx继续按照配置中的顺序依次匹配正则表达式的location,匹配到第一个正则表达式后停止搜索。匹配到的location将被使用。如果没有匹配到正则表达式的location,则使用刚刚找到的最准确的前缀匹配的location。

请注意所有location匹配测试只使用请求的URI部分,而不使用参数部分。这是因为写参数的方法很多,比如:

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

除此以外,任何人在请求串中都可以随意添加字符串:

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

现在让我们来看使用上面的配置,请求是怎样被处理的:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
家政服务阿姨是做什么的? 中央空调水滴图标是什么模式? 和EXO有关(字)的头像3张, 真的没人要么 exo这几个字母头像组合的头像 有没有EX0成员穿有EXO字的衣服的图片,和我头像一样的,越多越好! 为什么工商办卡要证明 亲子阅读的优缺点是什么? 馒头冬天放在室外存放 宝宝2 岁半说话结巴,宝宝结巴怎么纠正? 宝宝讲话口齿不清怎么办 Nginx 如何处理请求 麻辣火锅怎么做好吃又简单的做法 血透室护士的一天 血透中心可以拒绝接受病人吗 血透室特殊岗位津贴需求 ...一块红红的疙瘩,很痒的。不知道会不会好了?要怎样 为什么一出汗我的疤痕就开始发痒了? ...了美丽疤痕灵蛇油膏我的伤疤变红了抓痒是怎么回事,是害,还是在好... 香港的pandora门市店都在哪呢? 入党没有政审弟弟 入党政审父亲有犯罪记录还能通过吗 大学生入党政审需提供无罪证明吗 2022最新入党政审亲属范围 入党要政审吗 2022入党政审父母最新标准 入党政审需要对自己的无犯罪记录吗 ...但是打开ps 或3d 有时候就会一卡顿 然后就蓝屏了? 冰箱如何省电 怎么用冰箱省电 小米8手机能换刘海吗 胤字取名男孩寓意 嘿牛顿流体的水是冷水还是热水? ...层林叠翠,这几个词语改写形式不同其他的的词是什么? 名山川是什么意思 导医要华医通的账号密码是为什么? 输卵管积水真的会影响试管婴儿的成功率吗 我在导医网上输了手机号身份证号码。会不会被骗 中国导医网是骗子吗? 初二开学要买什么东西 写一篇好的日记关于复习还不让老师看出来是抄的 宝宝番茄汁的家常做法大全怎么做好吃 宝宝可以喝哪些蔬果汁 宝宝断奶食谱 九个月宝宝可以喝番茄汁吗 表弟因为债务纠纷划了对方车子,结果被拘留了,对方要求赔七万,他只愿... 表弟晚上总进我房间怎么办啊?``` 如果南极的冰都融化成水,地球会变成什么样子呢? 如果南北极冰川全部融化,会发生什么?科学家:很多城市会消失 斐乐是哪个国家的品牌安踏 服务器虚拟化软件属于基础软件 儋州市滴滴代驾注册已经全部通过为什么不能接单? steam如龙0有没有云存档