当前位置: 首页 > news >正文

【Nginx21】Nginx学习:FastCGI模块(三)缓冲区与响应头

Nginx学习:FastCGI模块(三)缓冲区与响应头

缓存相关的内容占了 FastCGI 模块将近一小半的内容,当然,用过的人可能不多。而今天的内容说实话,我平常也没怎么用过。第一个是缓冲区相关的知识,其实和我们之前学习过的 client_body_buffer_size 有点类似,但它是针对后端动态程序的响应缓冲区来说的。另一个也是响应有关的,主要是响应头相关的一些配置。

今天学习的内容都是可以设置在 http、server、location 中的,有特殊情况的我会单独说。

FastCGI缓冲区配置

就像开头所说的,它和 client_body_buffer_size 的概念是类似的,只不过针对的是后端程序的响应缓冲。什么意思呢?其实就是将响应保存在内存中,如果内容太多,就会保存到一个临时文件里。

fastcgi_buffering

启用或禁用来自 FastCGI 服务器的响应缓冲。

fastcgi_buffering on | off;

启用缓冲后,Nginx 会尽快收到来自 FastCGI 服务器的响应,并将其保存到由 fastcgi_buffer_size 和 fastcgi_buffers 指令设置的缓冲区中。如果整个响应不适合内存,可以将其中的一部分保存到磁盘上的临时文件中。写入临时文件由 fastcgi_max_temp_file_size 和 fastcgi_temp_file_write_size 指令控制。

当缓冲被禁用时,响应会在收到时立即同步传递给客户端。 Nginx 不会尝试从 FastCGI 服务器读取整个响应。 Nginx 一次可以从服务器接收的最大数据大小由 fastcgi_buffer_size 指令设置。

也可以通过在“X-Accel-Buffering”响应头字段中传递“yes”或“no”来启用或禁用缓冲。可以使用 fastcgi_ignore_headers 指令禁用此功能。

它的默认值就是开启的,用于控制整个 FastCGI 的缓冲区控制,上面已经说明了关闭会发生什么情况。提到的配置指令我们马上一一学习,最后再将所有配置指令合在一起进行一个简单的测试。

fastcgi_buffer_size

设置用于读取从 FastCGI 服务器接收到的响应的第一部分的缓冲区大小。

fastcgi_buffer_size size;

这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页,这是 4K 或 8K,具体取决于平台。然而,它可以做得更小。它和 client_header_buffer_size 这类的配置指令是类似的,就相当于是 FastCGI 版本的。

fastcgi_buffers

为单个连接设置用于从 FastCGI 服务器读取响应的缓冲区的数量和大小。

fastcgi_buffers 8 4k|8k;

默认情况下,缓冲区大小等于一内存页。这是 4K 或 8K,具体取决于平台。这个配置项是创建几个缓冲区用的,比如设置成 8 4k ,表示的就是 8*4=32k 的缓冲区,而上面的 fastcgi_buffer_size 是第一个头缓冲区的大小,不包含在这边,因此,整个缓冲区的大小就是 8*4k+fastcgi_buffer_size 的结果。它和 client_header_buffer_size 类似,可以看成是主要的响应体的大小。

fastcgi_busy_buffers_size

当启用来自 FastCGI 服务器的响应缓冲时,限制在响应尚未完全读取时可能正忙于向客户端发送响应的缓冲区的总大小。

fastcgi_busy_buffers_size size;

默认值是 8 或 16 K,其余缓冲区可用于读取响应,并在需要时将部分响应缓冲到临时文件。默认情况下,大小受 fastcgi_buffer_size 和 fastcgi_buffers 指令设置的两个缓冲区的大小限制。

fastcgi_max_temp_file_size

该指令设置临时文件的最大大小。

fastcgi_max_temp_file_size size;

默认值是 1024m ,零值表示禁用对临时文件的响应的缓冲。如果启用了来自 FastCGI 服务器的响应缓冲,并且整个响应不适合由 fastcgi_buffer_size 和 fastcgi_buffers 指令设置的缓冲区,则可以将部分响应保存到临时文件中。一次写入临时文件的数据大小由 fastcgi_temp_file_write_size 指令设置。此限制不适用于将缓存或存储在磁盘上的响应。

fastcgi_temp_file_write_size

当启用从 FastCGI 服务器到临时文件的响应缓冲时,限制一次写入临时文件的数据大小。

fastcgi_temp_file_write_size size;

默认情况下,大小受 fastcgi_buffer_size 和 fastcgi_buffers 指令设置的两个缓冲区限制。临时文件的最大大小由 fastcgi_max_temp_file_size 指令设置。

fastcgi_temp_path

定义一个目录,用于存储带有从 FastCGI 服务器接收到的数据的临时文件。

fastcgi_temp_path path [level1 [level2 [level3]]];

默认值是 Nginx 运行目录下的 fasstcgi_temp 目录,整体和之前学过的 client_body_temp_path 是类似的,在指定目录下最多可以使用三级子目录层次结构。例如,在以下配置中:

fastcgi_temp_path /spool/nginx/fastcgi_temp 1 2;

临时文件可能存储的目录就是:

/spool/nginx/fastcgi_temp/7/45/00000123457

前面我们学习的 FastCGI 缓存相关的配置中,缓存临时文件配置项 fastcgi_cache_path 有个参数 use_temp_path 和这个配置项有关系,之前我们已经学习过了。

综合测试

新建一个配置,注意要用非正则针对指定目录的配置,要不然会被我们最开始的那个 location ~ \.php给抢走,因为它那边指定了 php 结尾,优先级比直接指定目录要高,只需要加上 ^~ 就好了,之前在 location 中已经详细讲解过了。

location ^~ /fastcgi1/ {root html;fastcgi_pass unix:/var/sock/php-fpm/www.sock;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;include        fastcgi_params;fastcgi_buffer_size 100;fastcgi_buffers 2 100;fastcgi_busy_buffers_size 100;fastcgi_temp_file_write_size 100;fastcgi_temp_path /root/fastcgi_temp_test 1 2;
}

都设置得很小是吧,但是我们要准备的 PHP 文件需要返回的响应还是要设置的很大,否则很难看出效果。

// 1.php
<?php
$c = $_GET['c'] ?? 2000;
for ($i=$c;$i>0;$i--){print_r($_SERVER);
}

照理说,我们设置的都只是 100 字节,但实际循环 2000 次返回的响应有 2M 了,这时才能看到指定的 fastcgi_temp_path 文件夹产生了变动,里面也会生成子目录。这一块确实不太理解,设置成 1600 次循环,达不到 2M 的响应,就不会产生临时文件。去掉 fastcgi_temp_file_write_size 的配置之后,2M 的响应也不会产生文件。

这一块比较难测,而且出来的效果说实话和我们想像的也不太一样。所以如果有大佬知道这是什么情况,欢迎评论留言哈。将来如果有学习或者接触到类似的问题,也会再单独写文章说说。

另外,上面的数值大家可以乱调一下试试,这几个配置之间有各种限制,比如:

nginx: [emerg] "fastcgi_temp_file_write_size" must be equal to or greater than the maximum of the value of "fastcgi_buffer_size" and one of the "fastcgi_buffers" in /etc/nginx/nginx.conf:396nginx: [emerg] "fastcgi_busy_buffers_size" must be less than the size of all "fastcgi_buffers" minus one buffer in /etc/nginx/nginx.conf:396

这些看英文也都能猜到是啥意思了。即使通过检查了,并且 reload 成功之后,请求时也可能会报这些错。

2022/08/22 22:24:52 [crit] 1811#0: *79 open() "/root/fastcgi_temp_test/0000000001" failed (13: Permission denied) while reading upstream, client: 192.168.56.1, server: core.nginx.test, request: "GET /fastcgi1/1.php HTTP/1.1", upstream: "fastcgi://unix:/var/sock/php-fpm/www.sock:", host: "192.168.56.88"2022/08/22 22:20:33 [error] 1792#0: *71 upstream sent too big header while reading response header from upstream, client: 192.168.56.1, server: core.nginx.test, request: "GET /fastcgi1/1.php HTTP/1.1", upstream: "fastcgi://unix:/var/sock/php-fpm/www.sock:", host: "192.168.56.88"

第一个错误是指定的临时文件夹,它的上级目录的权限必须是 755 ,所有 Nginx 下面的文件夹目录都有这个要求。第二个是 fastcgi_buffer_size 设置小了,我想极限测试,也就是设置成 1 ,结果就直接报错了。这个和响应返回的头的大小有关,我这里测试是设置到 76 就可以了,不过为了统一,我就全部设置到 100 了。

响应头处理

在 FastCGI 的处理中,HTTP 请求标头字段作为参数传递给 FastCGI 服务器。在作为 FastCGI 服务器运行的应用程序和脚本中,这些参数通常作为环境变量提供。例如,“User-Agent”标头字段作为 HTTP_USER_AGENT 参数传递。除了 HTTP 请求头字段之外,还可以使用 fastcgi_param 指令传递任意参数。这些参数在 PHP 中都可以在 $_SERVER 里面看到。

对于这些响应头,Nginx 中也有一些字段进行处理,这里不仅是响应头,请求头部分的内容也一起写在这里了。

fastcgi_hide_header

默认情况下,nginx 不会从 FastCGI 服务器的响应中将头字段“Status”和“X-Accel-...”传递给客户端。

fastcgi_hide_header field;

没有默认值,也就是除了上面那些响应头以外,其它响应头都会进行传递,相反,如果需要允许传递字段,则可以使用 fastcgi_pass_header 指令。

我们在 PHP 文件中定义一个响应头 header("oopp:111"); ,然后正常查看页面,这个 oopp 会返回来,而添加了 fastcgi_hide_header oopp; 之后,在浏览器上就看不到这个响应头的信息了。

fastcgi_pass_header

允许将其他禁用的标头字段从 FastCGI 服务器传递到客户端。

fastcgi_pass_header field;

可以指定在禁用列表中的响应头返回,比如 “X-Accel-...” 这些的。具体有哪些可以看后面的 fastcgi_ignore_headers 配置。

比如我们之前测试过的 X-Accel-Expires 响应头,在 PHP 中设置了,但是前端浏览器的响应头中不会显示,就可以用这个传递到前端浏览器上。

那么如果 fastcgi_hide_header 和 fastcgi_pass_header 同时设置一个响应头字段呢?以先后顺序为准,后设置的生效。

fastcgi_ignore_headers

忽略对来自 FastCGI 服务器的某些响应头字段的处理。

fastcgi_ignore_headers field ...;

以下字段可以忽略:“X-Accel-Redirect”、“X-Accel-Expires”、“X-Accel-Limit-Rate”(1.1.6)、“X-Accel-Buffering”(1.1.6) 、“X-Accel-Charset”(1.1.6)、“Expires”、“Cache-Control”、“Set-Cookie”(0.8.44)和“Vary”(1.7.7)。

如果未禁用,则处理这些标头字段具有以下效果:

  • “X-Accel-Expires”、“Expires”、“Cache-Control”、“Set-Cookie”、“Vary”设置响应缓存的参数

  • “X-Accel-Redirect”执行到指定 URI 的内部重定向

  • “X-Accel-Limit-Rate”设置向客户端传输响应的速率限制

  • “X-Accel-Buffering”启用或禁用响应缓冲

  • “X-Accel-Charset”设置响应的所需字符集

默认值是空的,就是这些都会处理,假如设置一个 X-Accel-Expires ,那么我们之前在 PHP 中设置的 X-Accel-Expires 响应头延长缓存时间的效果就不起作用了。

总结

缓冲区部分可能还是需要更深入的学习操作系统及网络相关的知识才能够解释清楚,目前我的水平也就只能到这里了。测试代码也是按自己的想法来进行测试的。另外一块的响应头部分比较简单,大家可以自己测试一下哦。

参考文档:

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

相关文章:

【Nginx21】Nginx学习:FastCGI模块(三)缓冲区与响应头

Nginx学习&#xff1a;FastCGI模块&#xff08;三&#xff09;缓冲区与响应头 缓存相关的内容占了 FastCGI 模块将近一小半的内容&#xff0c;当然&#xff0c;用过的人可能不多。而今天的内容说实话&#xff0c;我平常也没怎么用过。第一个是缓冲区相关的知识&#xff0c;其实…...

正则表达式(常用字符简单版)

量词 字符类 边界匹配 分组和捕获 特殊字符 字符匹配 普通字符&#xff1a;普通字符按照字面意义进行匹配&#xff0c;例如匹配字母 "a" 将匹配到文本中的 "a" 字符。元字符&#xff1a;元字符具有特殊的含义&#xff0c;例如 \d 匹配任意数字字符&#xf…...

从零开始学习Python爬虫:详细指南

导言&#xff1a; 随着互联网的迅速发展&#xff0c;大量的数据可供我们利用。而Python作为一种简单易学且功能强大的编程语言&#xff0c;被广泛应用于数据分析和处理。学习Python爬虫技术&#xff0c;能够帮助我们从互联网上获取数据&#xff0c;并进行有效地分析和利用。本文…...

分布式计算框架:Spark、Dask、Ray

目录 什么是分布式计算 分布式计算哪家强&#xff1a;Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法&#xff0c;和集中式计算是相对的。 随着计算技术的发展&#xff0c;有些应用需要非常巨大的计算能力才…...

什么是伪类链(Pseudo-class Chaining)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Pseudo-class Chaining⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚…...

每日一题:leetcode 57 插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3…...

第五节:实现自己的第一个environment

本专栏是强化学习运用在买卖股票之上的入门学习内容。 主要解决强化学习代码落地和代码实践,不需要学习相关数学原理,直观简单的带领读者入门强化学习炒股。 查看本专栏完整内容,请访问:https://blog.csdn.net/windanchaos/category_12391143.html 本文发布地址:https://b…...

无套路,财务数据分析-多组织损益表分析分享

在报表众多的财务数据分析中&#xff0c;损益表是老板们最关注的报表&#xff0c;特别是当有多组织时&#xff0c;损益表的分析就变得更加重要了。以前受限于数据分析工具&#xff0c;做损益表分析时很难做到多维度灵活分析&#xff0c;但随着BI数据可视化工具的发展&#xff0…...

Java并发编程第6讲——线程池(万字详解)

Java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池&#xff0c;本篇文章就详细介绍一下。 一、什么是线程池 定义&#xff1a;线程池是一种用于管理和重用线程的技术&#xff08;池化技术&#xff09;&#xff0c;它主…...

AI + Milvus:将时尚应用搭建进行到底

在上一篇文章中&#xff0c;我们学习了如何利用人工智能技术&#xff08;例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型&#xff09;寻找与自己穿搭风格相似的明星。在这篇文章中&#xff0c;我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改&#xff0c;获得更…...

归并排序(Java 实例代码)

目录 归并排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 MergeSort.java 文件代码&#xff1a; 归并排序 一、概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分…...

【VUE】数字动态变化到目标值-vue-count-to

vue-count-to是一个Vue组件&#xff0c;用于实现数字动画效果。它可以用于显示从一个数字到另一个数字的过渡动画。 插件名&#xff1a;vue-count-to 官方仓库地址&#xff1a;GitHub - PanJiaChen/vue-countTo: Its a vue component that will count to a target number at a…...

Mysql /etc/my.cnf参数详解(二)

#buffer相关 #buffer pool根据实际内存大小调整,标准为物理内存的50% innodb_buffer_pool_size15996M //默认值128M&#xff0c;innodb_buffer_pool_size | 134217728 key_buffer_size 33554432 #根据物理内存大小设置 确保每个instance内的内存2G左右 <5000 1,>5000 &…...

AUTOSAR规范与ECU软件开发(实践篇)6.10AUTOSAR操作系统概念与配置方法介绍(下)

目录 2、 RTA-OS工程创建 3、 AUTOSAR操作系统配置方法 (1) 描述文件导入 (2) Counter配置...

蓝牙 - 经典蓝牙物理信道介绍

物理信道有多种类型。所有蓝牙物理信道的特点都是一组物理层的频率与时间参数相结合&#xff0c;并受到空间因素的限制。对于基本的和经过调整的蓝牙组网(piconet)所用物理信道&#xff0c;跳频用于定期改变频率&#xff0c;以减少干扰影响&#xff0c;同时也是出于监管原因。 …...

性能测试中未做集群时,在登入中已经保存了登入的session,但可能会出现在不同的服务器上显示登入失败

Session未进行集群共享时&#xff0c;则会出现服务器2&#xff0c;未登录...

Python环境下载安装使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

图像扭曲之波浪扭曲

源码&#xff1a; void wave_sine(cv::Mat& src,cv::Mat& dst,double amplitude,double wavelength) {dst.create(src.rows, src.cols, CV_8UC3);dst.setTo(0);double xAmplitude amplitude;double yAmplitude amplitude;double xWavelength wavelength;double yWa…...

《自动驾驶与机器人中的SLAM技术》之GNSS相关基础知识总结

简介 本篇基于对《自动驾驶与机器人中的SLAM技术》中的GNSS定位相关基础知识进行总结用于备忘 知识点整理 GNSS(全球卫星导航系统)定位原理 GNSS 通过测量自身与地球周围各卫星的距离来确定自身的位置 , 而与卫星的距离主要是通过测量时间间隔来确定的 GNSS与GPS的关系 GPS(…...

【前端|CSS系列第4篇】面试官:你了解居中布局吗?

欢迎来到前端CSS系列的第4篇教程&#xff01;如果你正在寻找一种简单而又强大的前端技术&#xff0c;以使你的网页和应用程序看起来更加专业和美观&#xff0c;那么居中布局绝对是你不能错过的重要知识。 在前端开发中&#xff0c;实现居中布局是一项必备技能&#xff0c;无论…...

安全物理环境技术测评要求项

1.物理选择-保证等级保护对象物理安全的前提和基础 1-0/2-2/3-2/4-2&#xff08;级别-要求项数量&#xff09; a&#xff09;具备防震、防风、防雨能力 b&#xff09;避免顶层或地下室&#xff0c;否则应加强防水、防潮措施 测评实施重点&#xff1a; 1&#xff09;机房场地所在…...

SAP MTS案例教程PP生产前台操作

目录 本章介绍 2 生产订单相关操作 3 批量查询生产订单 3 单个显示生产任务单 5 生产订单批量可用性检查 6 显示短缺部件信息 8 修改生产订单 9 重读工单计划主数据 11 单个下达生产订单 12 批量下达生产订单 13 非倒冲生产方式操作过程 15 多个工单批量发料 15 单个工单发料 1…...

Celery task 执行报错 TypeError: Object of type set is not JSON serializable 问题分析处理

情况描述&#xff1a; 定义了新的shared_task推送到生产环境后&#xff0c;发现无法执行&#xff0c;会报错set对象无法序列化&#xff0c;报错内容如下&#xff1a; Traceback (most recent call last):File "/tmp/venv/lib64/python3.6/site-packages/kombu/serializati…...

【大魔王送书第一期】《一名阿里服务端开发工程师的进阶之路》

一、前言 目前&#xff0c;资讯、社交、游戏、消费、出行等丰富多彩的互联网应用已经渗透到了人们生活和工作的方方面面&#xff0c;正深刻改变着信息时代。随着用户规模的增长和应用复杂度的上升&#xff0c;服务端面临的技术挑战越来越严峻。在头部互联网企业&#xff0c;服…...

[FPGA IP系列] BRAM IP参数配置与使用示例

FPGA开发中使用频率非常高的两个IP就是FIFO和BRAM&#xff0c;上一篇文章中已经详细介绍了Vivado FIFO IP&#xff0c;今天我们来聊一聊BRAM IP。 本文将详细介绍Vivado中BRAM IP的配置方式和使用技巧。 一、BRAM IP核的配置 1、打开BRAM IP核 在Vivado的IP Catalog中找到B…...

react ts

一、项目搭建 1、创建项目 使用vite生成项目 npx create-react-app react-ts-project --template typescript 启动项目 yarn start 删除无用组件 2、设计目录结构 资源说明http网络请求assets公共资源components组件router路由配置utils工具模块store状态机App.tsx应用…...

配置MySQL

配置MySQL_5.7.16 一级目录2.1.1 安装包准备2.1.2 安装MySQL2.1.3 配置MySQL 一级目录 2.1.1 安装包准备 1&#xff09;将安装包和JDBC驱动上传到/opt/software&#xff0c;共计6个 01_mysql-community-common-5.7.16-1.el7.x86_64.rpm 02_mysql-community-libs-5.7.16-1.el…...

GFPGAN 集成Flask 接口化改造

GFPGAN是一款腾讯开源的人脸高清修复模型&#xff0c;基于github上提供的demo&#xff0c;可以简单的集成Flask以实现功能接口化。 GFPGAN的安装&#xff0c;Flask的安装请参见其他文章。 如若使用POSTMAN进行测试&#xff0c;需使用POST方式&#xff0c;form-data的请求体&am…...

vue数字输入框

目录 1.emitter.JS function broadcast (componentName, eventName, params) {this.$children.forEach(child > {var name child.$options.componentNameif (name componentName) {child.$emit.apply(child, [eventName].concat(params))} else {broadcast.apply(child, …...

JavaScript—BOM

BOM是什么&#xff1f; Browser Object Model是浏览器对象模型 官方&#xff1a;浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构&#xff0c;BOM由多个对象构成&#xff0c;其中代表浏览器窗口的window对象是BOM的顶层对象&#xff0c;其他对象都是该…...