Nginx(六)Nginx请求处理机制

2023-11-18

 转载自:

本文为您解读,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,重复上面第二个例子。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx(六)Nginx请求处理机制 的相关文章

随机推荐

  • RKNPU2通用API和零拷贝API

    RKNPU2通用API 通用API接口按照异构编程规范 需要将数据拷贝到NPU运行时的内存空间 通用API部署流程 初始化上下文 需要先创建上下文对象和读取模型文件 rknn context ctx model load model mod
  • 微信小程序商城--隐私协议--模板参考

    本隐私政策与您所使用的XX 替换成软件名称 服务以及该服务所包括的各种业务功能 以下统称 我们的产品与 或服务 息息相关 希望您在使用我们的产品与 或服务前仔细阅读并确认您已经充分理解本隐私政策所写明的内容 并让您可以按照本隐私政策的指引做
  • Poi模板技术

    Poi模板技术导入导出Excel 在我们的工作中 也经常会用到Poi模板技术操作Excel文件数据 而且不同的应用场景对Excel表格的单元格格式和合并操作都需要写大量的代码调试 比较麻烦 通过模板技术将自定义格式的Excel文件模板存放在
  • 【云原生之Docker实战】使用docker部署PicUploader图床工具

    云原生之Docker实战 使用docker部署PicUploader图床工具 一 PicUploader介绍 1 PicUploader介绍 2 PicUploader特点 二 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 三
  • 对聊天室的优化&常用参数配置

    优化处1 编码和解码 编码解码用的是JDK 对象与数组的转换 这种虽然简单 但是效率不高 现在需要支持更多的序列化算法 就需要改进 抽取一个接口 Serializer 用以支持 序列化和 反序列化 package com zhao prot
  • educoder答案-Python编程训练-顺序与选择结构-太原理工大学

    太原理工大学 educoder实训平台答案 Python编程基础 持续更新 以下均为太原理工大学廖丽娟老师的实训项目内容答案 各位校友自取 第一关 顺序结构 changeOne int input changeTwo int input p
  • input输入框自动去除空格

    1 只去除两端空格
  • 加密证书的三大好处 122.228.86.6

    SSL证书有什么特点 1 数据加密传输 采用HTTPS加密APP及网页通讯 防止数据在传送过程中被窃取 篡改 确保数据的完整性 防止运营商的流量劫持 网页植入广告现象 同时有效抵挡中间人的攻击 大大提升安全性 2 高兼容性 兼容性关系到用户
  • 1.深度学习练习:Python Basics with Numpy(选修)

    本文节选自吴恩达老师 深度学习专项课程 编程作业 在此表示感谢 课程链接 https www deeplearning ai deep learning specialization 目录 1 Building basic function
  • 关于uni-app中Android不支持camera相机组件进行拍照,并需要改变调用uni.chooseImage时手机相机UI的替代解决方法

    关于uni app中Android不支持camera相机组件进行拍照 并需要改变调用uni chooseImage时手机相机UI的替代解决方法 uni app中Android不支持camera相机组件 解决办法live pusher组件进行
  • 设计模式,简单工厂模式实现商场促销问题。

    前言 自始至终觉得编程是一门技术 更是一门艺术 不能只满足于写完代码运行后的结果完事 还应该让后人能读懂 容易修改 容易扩展和复用 又由于自己经常写出屎山代码 所以准备苦学设计模式 尽力写出更加优雅的代码 正文 问题引入 定义一个商场收银软
  • 【MedusaSTears】解决IDEA卡顿,IDEA2019.2启动加速;Eclipse启动加速:JVM调优--让你的IDE如丝般顺滑~

    目录 idea64 exe vmoptions文件内容如下 请自己对照你自己的编写 别直接粘贴我的 否则后果自负 eclipse ini文件内容如下 请自己对照你自己的编写 别直接粘贴我的 否则后果自负 具体我也解释不清楚 反正就是参考了不
  • 有用的 C# 库

    1 caliburn micro 数据绑定的库 比自带mvvm更好一些 2 https github com xceedsoftware wpftoolkit wpf的空间库
  • 字符编码简介

    目录 一 ascii编码 二 扩展ascii编码 三 多字节编码 multi bytes 四 宽字符编码 wide char 五 unicode编码 六 utf 8编码 七 结语 大家好 我是略游 本文的目的是讲清楚 字符编码的今生来世 看
  • 农业掀起“上链”潮 区块链等数字技术正成为乡村振兴新动力

    目前区块链等数字技术已经广泛应用于农业全链条环节 近日 由中国宏观经济研究院课题组撰写的 数字技术赋能乡村产业发展报告 下简称 报告 指出 长期以来困扰乡村产业发展的难点 堵点正在逐渐被区块链等数字技术所消弭和破解 中国宏观经济研究院所做的
  • 高性能中间件-RabbitMQ

    高性能中间件 RabbitMQ 高性能中间件 RabbitMQ 1 RabbitMQ是什么 2 RabbitMQ的整体结构 3 SpringBoot集成RabbitMQ 4 RabbitMQ丢失消息和解决方案 5 RabbitMQ的应用实践
  • 为分布式做准备吧——远程调用服务(RPC)和基于消息的通信(Message Queue)对比

    文章目录 系统结构 功能特点 应用 系统结构 RPC Message Queue 调用方式 Consumer lt gt Provider Sender lt gt Queue lt gt Receiver 调用对象 Consumer调用的
  • eNSP:VLAN相关实验

    一 实验要求 二 实验步骤 1 建立拓扑 2 创建并配置VLAN 2 将交换机上各个接口划分到对应的vlan中 3 配置Trunk干道 4 配置单臂路由 路由器子接口 5 设置所有PC端为DHCP 6 测试
  • 为支撑小程序接口,配置https

    1 从阿里云购买免费的ssl证书 博主太穷 买不起付费的 https common buy aliyun com spm 5176 7968328 1290860 26 59b61232sjkAJj commodityCode cas re
  • Nginx(六)Nginx请求处理机制

    转载自 本文为您解读 Nginx是如何处理请求的 让你从逻辑上有一个清晰的认识 1 处理什么样的请求 处理访问到 Nginx 所在 IP 地址的请求 并且这些请求的 HTTP 头信息中的 Host 为所要处理的域名 如下以80端口为例 如下