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

用 NGINX 打造高性能 FastCGI 加速 `ngx_http_fastcgi_module`

一、安装与启用

# 在编译 NGINX 源码时加上:
./configure --with-http_fastcgi_module
make && sudo make install# 或确保你使用的二进制已内置(大多数发行版都默认包含)
nginx -V | grep fastcgi

二、基础转发配置

http {server {listen 80;server_name example.com;root /var/www/html;location ~ \.php$ {fastcgi_pass            unix:/run/php/php8.1-fpm.sock;fastcgi_index           index.php;include                 fastcgi_params;fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;fastcgi_param QUERY_STRING     $query_string;fastcgi_param REQUEST_METHOD   $request_method;fastcgi_param CONTENT_TYPE     $content_type;fastcgi_param CONTENT_LENGTH   $content_length;fastcgi_param REDIRECT_STATUS  200;}}
}
  • fastcgi_pass:指定后端地址(TCP 或 Unix Socket)。
  • fastcgi_index:URI 以 / 结尾时,追加该脚本名。
  • fastcgi_param:设置环境变量传给后端。

三、缓冲与临时文件

3.1.打开/关闭缓冲

fastcgi_buffering on;   # 默认 on
# or
fastcgi_buffering off;  # 实时转发,不做缓冲

3.2.缓冲区大小与数量

fastcgi_buffer_size        16k;        # 初始 header 缓冲
fastcgi_buffers            8 32k;      # 读 body 时的内存缓冲
fastcgi_busy_buffers_size  64k;        # 正在向客户端发送时可占用的内存

3.3.临时文件设置

fastcgi_temp_path       /var/cache/nginx/fastcgi_temp 1 2;  
fastcgi_max_temp_file_size 512m;
fastcgi_temp_file_write_size 32k;
  • fastcgi_temp_path:超出内存缓冲时写入磁盘。
  • fastcgi_max_temp_file_size:允许写入最大临时文件大小(0=禁用写盘)。
  • fastcgi_temp_file_write_size:每次写盘的块大小。

四、二级缓存(FastCGI Cache)

4.1.定义缓存路径

fastcgi_cache_path /var/cache/nginx/php_cache levels=1:2 \keys_zone=php_cache:128m inactive=30m max_size=5g;

4.2.在 Location 中启用

location ~ \.php$ {fastcgi_cache           php_cache;fastcgi_cache_key       $scheme$host$request_uri;fastcgi_cache_valid     200 301 302 10m;fastcgi_cache_valid     404      1m;fastcgi_cache_methods   GET HEAD;
}

4.3.背景更新与过期使用

fastcgi_cache_use_stale       error timeout updating http_500 http_503;
fastcgi_cache_background_update on;
  • use_stale updating:当条目在后台更新时,仍可返回旧缓存。
  • background_update:只触发后台刷新,不阻塞用户请求。

4.4.缓存锁

fastcgi_cache_lock          on;
fastcgi_cache_lock_timeout  5s;
fastcgi_cache_lock_age      5s;
  • 避免缓存击穿:同一缓存键仅一条请求打到后端,其它请求排队等待或超时。

五、超时与失败切换

fastcgi_connect_timeout   5s;
fastcgi_read_timeout      60s;
fastcgi_send_timeout      60s;fastcgi_next_upstream     error timeout invalid_header http_500 http_503;
fastcgi_next_upstream_tries   3;
fastcgi_next_upstream_timeout 30s;
  • 连接/读取/发送超时:防止挂起。
  • fastcgi_next_upstream:列出哪些场景下切换后端。
  • tries / timeout:限制切换次数与时长。

六、参数传递与路径拆分

6.1.PATH_INFO 支持

location ~ ^(.+\.php)(/.*)$ {fastcgi_split_path_info  ^(.+\.php)(/.*)$;fastcgi_param SCRIPT_FILENAME  $document_root$1;fastcgi_param PATH_INFO        $2;include fastcgi_params;fastcgi_pass   php-fpm;
}
  • fastcgi_split_path_info:正则拆分 URI,支持框架路由。

七、动态存储(fastcgi_store)

location ~ \.php$ {# 反向缓存/保存原始文件fastcgi_store             on;fastcgi_store_access      user:rw group:r all:r;fastcgi_temp_path         /var/cache/nginx/php_store_temp;alias                     /var/www/html/;
}
  • fastcgi_store:将后端响应写入本地文件系统,适合缓存不变资源。

八、限速与连接管理

fastcgi_limit_rate         100k;     # 每请求最大读取速率
fastcgi_socket_keepalive   on;       # 与后端开启 TCP keepalive
fastcgi_bind               192.168.1.10 transparent;
  • fastcgi_limit_rate:防止后端过快/刷流量。
  • fastcgi_bind:指定本地出站 IP 用于与后端的连接。

九、最佳实践与调优

9.1. 缓冲策略

  • 小响应可全内存缓冲,增大 fastcgi_buffers;大文件开启写盘并调大 max_temp_file_size

9.2. 缓存合理性

  • 复杂登录或动态页面不缓存;仅对无用户差异或可共享资源启用。

9.3. 失败切换

  • 多 FPM 节点时务必配置 next_upstreamtriestimeout

9.4. 监控与日志

  • 通过 status 模块、access_log + $upstream_cache_status 监控缓存命中率与后端性能。

9.5. 安全防护

  • 配合 limit_exceptauth_basicdeny/allow 做访问控制;
  • 注意 fastcgi_param 不要泄露敏感路径或变量。

十、总结

ngx_http_fastcgi_module 功能丰富,从最基础的 FastCGI 转发,到缓冲、临时存储、缓存、失败切换、限速、存储……几乎覆盖了生产环境对动态脚本加速的所有需求。合理配置后,能够:

  • 提升并发吞吐:减轻后端压力
  • 优化延迟:靠本地缓存和缓冲平滑流量
  • 增强可用性:自动切换与 stale 服务兜底
  • 强化安全:精细化访问与速率控制

在高并发、微服务和多机房部署场景中,深度掌握并调优本模块,是打造稳定、高效 Web 架构的关键。祝你在实战中收获性能飞跃!

相关文章:

用 NGINX 打造高性能 FastCGI 加速 `ngx_http_fastcgi_module`

一、安装与启用 # 在编译 NGINX 源码时加上: ./configure --with-http_fastcgi_module make && sudo make install# 或确保你使用的二进制已内置(大多数发行版都默认包含) nginx -V | grep fastcgi二、基础转发配置 http {server {…...

深度学习 ———— 迁移学习

迁移学习原理 什么是迁移学习? 迁移学习利用在大规模数据集(如ImageNet)上预训练的模型,改装小数据集(如CIFAR-10)。优势: 减少训练时间:预训练模型已学习通用特征(如边…...

论文精读:YOLOE: Real-Time Seeing Anything

文章目录 前言1、背景2、方法2.1.重参Region-Text对齐模块2.2.VisualPrompt模块2.3.PromptFree 2.4.损失函数3、实验3.1.训练集3.2.实验结果 总结 前言 本文介绍一篇来自清华的开放词汇检测论文:YOLOE;源码链接。 1、背景 本文在yolo-world基础上&#x…...

以影像为笔,劳润智在世界舞台上书写艺术之路

在光影交织中,摄影师劳润智的镜头仿佛能穿透喧嚣,捕捉人类情感最细腻的脉动。从疫情下洛杉矶裁缝日常的温馨瞬间,到象征自由与解脱的飞鸟影像,再到探索时间与空间交错的抽象作品,每一幅作品都展现了他对艺术的深度追求与对生活的温柔洞察。 劳润智的作品为他赢得了多个国际奖项…...

vue3 computed方法传参数

我们对computed的基础用法不陌生,比如前端项目中经常会遇到数据处理的情况,我们就会选择computed方法来实现。但大家在碰到某些特殊场景,比如在template模板中for循环遍历时想给自己的计算属性传参,这个该怎么实现呢,很…...

【ES】Elasticsearch字段映射冲突问题分析与解决

在使用Elasticsearch作为搜索引擎时,经常会遇到一些映射(Mapping)相关的问题。本文将深入分析字段映射冲突问题,并通过原生的Elasticsearch API请求来复现和解决这个问题。 问题描述 在实际项目中,我们遇到以下错误: Transport…...

昇腾NPU容器内 apt 换源

环境 昊算NPU云910b 问题 缺少vim等,同时无法apt安装新的依赖 解决办法 使用vi修改/etc/apt/sources.list.d/debian.sources Types: deb URIs: http://deb.debian.org/debian Suites: bookworm bookworm-updates bookworm-backports Components: main contrib…...

MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器

目录 一、索引概述:数据库的 “目录” 1.1 什么是索引? 1.2 索引的性能验证:用事实说话 实验环境准备 无索引查询耗时 有索引查询耗时 索引的 “空间换时间” 特性 二、索引的创建:三种核心方式 2.1 方式 1:C…...

spark-Join Key 的基数/rand函数

在数据处理中,Join Key 的基数 是指 Join Key 的唯一值的数量(也称为 Distinct Key Count)。它表示某个字段(即 Join Key)在数据集中有多少个不同的值。 1. Join Key 基数的意义 高基数:Join Key 的唯一值…...

LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻译与解读

LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻译与解读 导读:这篇OpenAI帮助文档全面介绍了将GitHub连接到ChatGPT进行深度代码研究的方法、优势和注意事项。通过连接GitHub,用户可以充分利用ChatGPT强大的代码理解和生成…...

【桌面】【输入法】常见问题汇总

目录 一、麒麟桌面系统输入法概述 1、输入法介绍 2、输入法相关组件与服务 3、输入法调试相关命令 3.1、输入法诊断命令 3.2、输入法配置重新加载命令 3.3、启动fcitx输入法 3.4、查看输入法有哪些版本,并安装指定版本 3.5、重启输入法 3.6、查看fcitx进程…...

R语言学习--Day01--数据清洗初了解andR的经典筛选语法

当我们在拿到一份数据时,是否遇到过想要分析数据却无从下手?通过编程语言去利用它时发现有很多报错不是来源于代码而是因为数据里有很多脏数据;在这个时候,如果你会用R语言来对数据进行清洗,这会让你的效率提升很多。 …...

QT的初始代码解读及其布局和弹簧

this指的是真正的当前正在显示的窗口 main函数: Widget w是生成了一个主窗口,QT Designer是在这个主窗口里塞组件 w.show()用来展示这个主窗口 头文件: namespace Ui{class Widget;}中的class Widget和下面的class Widget不是一个东西 Ui…...

Profinet转CanOpen网关,打破协议壁垒的关键技术

在石油化工行业的生产现场,各类自动化设备如同精密运转的神经系统,而通信协议则是传递信号的"语言"。当不同厂商的设备采用Canopen与Profinet这两种主流工业协议时,就像两个使用不同方言的专家需要实时协作,此时开疆智能…...

引用第三方自定义组件——微信小程序学习笔记

1. 使用 npm 安装第三方包 1.1 下载安装Node.js 工具 下载地址:Node.js — Download Node.js 1.2 安装 npm 包 在项目空白处右键弹出菜单,选择“在外部终端窗口打开”,打开命令行工具,输入以下指令: 1> 初始化:…...

Docker、Docker-compose、K8s、Docker swarm之间的区别

1.Docker docker是一个运行于主流linux/windows系统上的应用容器引擎,通过docker中的镜像(image)可以在docker中构建一个独立的容器(container)来运行镜像对应的服务; 例如可以通过mysql镜像构建一个运行mysql的容器,既可以直接进入该容器命…...

SpringAI实现AI应用-使用redis持久化聊天记忆

SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 3.SpringAI实现AI应用-内置顾问-CSDN博客 4.SpringAI实现AI应用-使用redis持久化聊天记忆-CSDN博客 5.SpringAI实现AI应用-自定义顾问(Advisor&#xff09…...

C#问题 加载格式不正确解决方法

出现上面问题 解决办法:C#问题 改成x86 不要选择anycpu...

VTK|结合qt创建通用按钮控制显隐(边框、坐标轴、点线面)

文章目录 增加边框BoundingBox添加addBoundingBox添加BoundingBox控制按钮点击按钮之后的槽函数 添加坐标轴增加点线面显隐控制按钮添加控制点线面显隐的按钮到三维显示界面控制面显示槽函数控制线显示槽函数控制点显示槽函数 增加边框BoundingBox 增加边框BoundingBox并通过按…...

CentOS 7.9 安装详解:手动分区完全指南

CentOS 7.9 安装详解:手动分区完全指南 为什么需要手动分区?CentOS 7.9 基本分区说明1. /boot/efi 分区2. /boot 分区3. swap 交换分区4. / (根) 分区 可选分区(进阶设置)5. /home 分区6. /var 分区7. /tmp 分区 分区方案建议标准…...

在过滤器中获取body中的json数据并且使得后续的controller层也能获取使用

前景提示: ①我需要在filter中获取到json数据->对key名首字母进行排序,然后拼接,进行验签 ②所以就需要在filer获取到json的数据,因为请求数据是一次性读取的流。如果过滤器中调用了request.json或request.get_json()&#xff…...

如何使用测试软件 Jmeter

第一步,点击 编辑 添加线程组 第二步,右键单击线程组,添加取样器 HTTP 请求 第三步,设置请求路径 第四步,添加 查看结果树 用于查看请求响应 最后点击绿色小三角启动即可...

2025盘古石初赛WP

来不及做,还有n道题待填坑 文章目录 手机取证 Mobile Forensics分析安卓手机检材,手机的IMSI是? [答案格式:660336842291717]养鱼诈骗投资1000,五天后收益是? [答案格式:123]分析苹果手机检材&a…...

系统分析与设计期末复习

第一章 系统的五个特性 整体性、目的性、相关性、环境适应性、层次性 软件系统的四个特性 复杂性、一致性、可变性、不可见性 第二章 系统规划 系统开发生命周期 系统规划->系统分析->系统设计->系统实施->系统运行维护->系统规划 诺兰阶段模型 阶段&a…...

最大公约数gcd和最小公倍数lcm

一、相关公式及其性质 文章只服务于竞赛,所以不会涉及证明。 辗转相除法:gcd(a, b) gcd(b, a % b); 直到 b 0,就可以知道上一层递归中的 a % b 0,所以上一层的 b 就是答案,也就是这一层递归的 a gcd(a, b) * lcm…...

IBM BAW(原BPM升级版)使用教程第八讲

续前篇! 一、流程开发功能模块使用逻辑和顺序 前面我们已经对 流程、用户界面、公开的自动化服务、服务、事件、团队、数据、性能、文件各个模块进行了详细讲解,现在统一进行全面统一讲解。 在 IBM Business Automation Workflow (BAW) 中,…...

视觉革命来袭!ComfyUI-LTXVideo 让视频创作更高效

探索LTX-Video 支持的ComfyUI 在数字化视频创作领域,视频制作效果的提升对创作者来说无疑是一项重要的突破。LTX-Video支持的ComfyUI便是这样一款提供自定义节点的工具集,它专为改善视频质量、提升生成速度而开发。接下来,我们将详细介绍其功…...

从电动化到智能化,法雷奥“猛攻”中国汽车市场

当前,全球汽车产业正在经历前所未有的变革,外资Tier1巨头开始向中国智能电动汽车市场发起新一轮“猛攻”。 在4月23日-5月2日上海国际车展期间,博世、采埃孚、大陆集团、法雷奥等全球百强零部件厂商纷纷发布战略新品与转型计划。在这其中&am…...

鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用

鸿蒙开发——3.ArkTS声明式开发:构建第一个ArkTS应用 一、创建ArkTS工程二、ArkTS工程目录结构(Stage模型)三、构建第一个页面四、构建第二个页面五、实现页面之间的跳转六、模拟器运行 一、创建ArkTS工程 1、若首次打开DevEco Studio,请点击…...

word换行符和段落标记

换行符:只换行不分段 作用:我们需要对它进行分段,但它是一个信息群组,我希望它们有同样的段落格式! 快捷键:shiftenter 段落标记:分段 快捷键:enter 修改字体格式或段落格式 …...