是什么?

顾名思义,是Nginx用来处理FastCGI的模块。FastCGI是什么?这个以后再讲,可以说的是现在LNMP架构里面,PHP一般是以PHP-CGI的形式在运行,它就是一种FastCGI,我们在进程中看到的PHP-FPM是PHP-CGI的管理调度器。

为什么要详解一下?

因为LNMP不像LAMP,且早期Nginx不支持path_info,导致网上有大量旧版本的Nginx教程干扰视线。

为了更加清晰准确使用LNMP,估需要深入了解一下整个ngx_http_fastcgi_module。

四个常见、重要的配置项

fastcgi_pass

作用域:location, if in location

设置FastCGI服务,其值可以是一个域名、IP地址:端口、或者是一个Unix的Socket文件。

同时,它也只支持一个FastCGI服务集群。

# TCP形式传递
fastcgi_pass localhost:9000; # Socket形式传递
fastcgi_pass unix:/tmp/fastcgi.socket; # 传递给集群
upstream cloud {
server cgi_1.cloud.com;
server cgi_2.cloud.com;
}
fastcgi_pass cloud;

upstream集群定义不在本次讨论范围,更多玩法请参考官方文档

fastcgi_param

作用域:http, server, location

设置一个传递给FastCGI服务的参数,可以是文本或者是变量。

# 例如在接入层Nginx上面传递如下5个参数
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name; # 那么在FastCGI上面,例如PHP-CGI上面就可以通过$_SERVER这个超全局变量获取。
$_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_PORT']
$_SERVER['SERVER_ADDR']
$_SERVER['SERVER_PORT']
$_SERVER['SERVER_NAME']

可传递的参数,遵循CGI/1.1规范定义。

可以从Github上面看到Nginx在3年前实现FastCGI的参数传递后,基本就没变过了。

fastcgi_index

作用域:http, server, location

当请求以/结尾的时候,会将请求传递给所设置的index.php文件处理。

fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

fastcgi_split_path_info

作用域:location

Nginx默认获取不到PATH_INFO的值,得通过fastcgi_split_path_info指定定义的正则表达式来给$fastcgi_path_info赋值。

其正则表达式必须要有两个捕获。

  • 第一个捕获的值会重新赋值给$fastcgi_script_name变量。
  • 第二个捕获到的值会重新赋值给$fastcgi_path_info变量。

例子:

location ~ ^(.+\.php)(.*)$ {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}

原始请求是 /show.php/article/0001

通过分割,FastCGI得到的结果是:

  • SCRIPT_FILENAME: /path/to/php/show.php
  • PATH_INFO: /article/0001

Nginx在0.7.31以前是没有fastcgi_split_path_info这个指令的,而0.7.x这个版本一直存活了好多年,后面才高歌猛进,导致网上存在大量旧版本通过正则自己设置PATH_INFO的方法。

踩了好多次依旧不记得怎么设置的ThinkPHP

为什么总是踩坑?因为我们都会通过重写来隐藏index.php文件,而ThinkPHP的教程,默认教的是旧版Nginx写法,且URL_MODE必须设置为3也说得很隐晦(URL_MODE默认为0)。

例如ThinkPHP的说明有一段旧版的Nginx设置指引。

 location / { // …..省略部分代码
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}

该规则是通过将请求rewrite给/index.php?s=来实现的,其ThinkPHP的URL_MODE配置必须为3,也就是兼容模式。

如果使用本文中的传递PATH_INFO方式,且隐藏index.php,则ThinkPHP的URL_MODE需要改为2。

如果使用本文中的传递PATH_INFO方式,但不隐藏index.php,则ThinkPHP的URL_MODE改为1。

还有个一个叫 cgi.fix_pathinfo

cgi.fix_pathinfo参数,藏在PHP-FPM的php.ini配置里面,其默认值为1。

这里存在一个安全风险,我也不通,详情不表,看鸟哥的文章:http://www.laruence.com/2010/05/20/1495.html

习惯性将其设置为0即可。

参考

ngx_http_fastcgi_module 的那些事的更多相关文章

  1. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  2. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  3. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  4. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  5. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  6. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  7. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  8. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

  9. ngx_http_fastcgi_module模块.md

    ngx_http_fastcgi_module ngx_http_fastcgi_module模块允许将请求传递到FastCGI服务器. fastcgi_bind Syntax: fastcgi_bi ...

随机推荐

  1. 基于Apache组件,分析对象池原理

    池塘里养:Object: 一.设计与原理 1.基础案例 首先看一个基于common-pool2对象池组件的应用案例,主要有工厂类.对象池.对象三个核心角色,以及池化对象的使用流程: import or ...

  2. Docker-操作容器1

    ->点击该链接:Linux(Centos7)安装Docker<- 前言 步骤: 软件镜像->运行镜像->产生一个容器 这就类似于我们在pc端下载微信时需要启动wechat.ex ...

  3. SSM实现个人博客-day01

    1.需求分析 项目源码免费下载:SSM实现个人博客 有问题请询问vx:kht808

  4. vim 下几种比较省劲的方式(vi结合着用)

    Vim的几种模式 正常模式:可以使用快捷键命令,或按:输入命令行. 插入模式:可以输入文本,在正常模式下,按i.a.o等都可以进入插入模式. 可视模式:正常模式下按v可以进入可视模式, 在可视模式下, ...

  5. 新手入门C语言第十章:C作用域规则

    C 作用域规则任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数 ...

  6. C# 中托管内存与非托管内存之间的转换

    c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存 ...

  7. Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 论文解读(VLDB 2021)

    Fauce:Fast and Accurate Deep Ensembles with Uncertainty for Cardinality Estimation 论文解读(VLDB 2021) 本 ...

  8. XCTF练习题---WEB---backup

    XCTF练习题---WEB---backup flag:Cyberpeace{855A1C4B3401294CB6604CCC98BDE334} 解题步骤: 1.观察题目,打开场景 2.打开以后发现是 ...

  9. Visual Studio之安装(更新,扩展)速度缓慢解决方案

    一.背景 小伙伴们在安装visual studio,或者更新,扩展vs功能时,在家里网速正常的情况下,可能出现进度十分缓慢的问题,如何解决呢? 二.解决思路 修改hosts文件 1.地址:默认安装在 ...

  10. 用户与安全 -(1)Linux用户及组管理

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登 ...