ngx_http_fastcgi_module 的那些事

是什么?

顾名思义,是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即可。

参考

转载于:https://www.cnblogs.com/jackieron/p/6502939.html

<think>好的,我现在需要处理用户关于nginx的ngx_http_headers_more_filter_module.dll模块的查询。首先,我得确认这个模块的基本信息。用户提到了.dll文件,这让我想到Windows系统下的动态链接库。不过,nginx通常在类Unix系统上运行,比如Linux,而官方提供的模块一般是源码形式,需要编译安装。所以用户提到的.dll可能是在Windows环境下编译的模块,或者是用户自己生成的。 接下来,我应该检查这个模块的功能。ngx_http_headers_more_filter_module模块的主要作用是修改HTTP请求和响应头。用户可能想用它来添加、删除或修改头部信息。比如,设置安全相关的响应头如CSP,或者隐藏Server信息。 然后,用户可能遇到了问题,比如模块没有正确加载,或者配置错误。常见的错误可能包括编译时未包含该模块,配置指令写错位置,或者在Windows环境下使用不兼容的版本。 我需要参考提供的引用资料。查看引用[2]提到了nginx的fastcgi缓存和权限配置,这可能与模块的使用场景有关。引用[3]涉及系统用户权限,可能与模块加载时的权限问题相关,但可能关联不大。引用[4]提供了服务器环境信息,可能帮助用户确认他们的系统是否支持该模块。 接下来,我需要给出解决步骤。首先确认模块是否已正确安装,检查nginx配置中的load_module指令是否正确指向.dll文件。然后验证配置语法,确保指令正确。如果出现错误,查看日志文件,定位问题。对于Windows用户,需要确认模块是否兼容当前nginx版本,可能需要重新编译。 最后,生成相关问题,帮助用户进一步解决可能遇到的编译、配置或权限问题。</think>### 关于`ngx_http_headers_more_filter_module`模块的信息与排查步骤 #### 1. **模块基本信息** `ngx_http_headers_more_filter_module`是第三方模块,用于动态修改HTTP请求和响应头。它支持以下功能: - 删除或修改请求头(如隐藏`Server`信息) - 添加自定义响应头(如安全策略头`Content-Security-Policy`) - 支持条件化操作(例如仅对特定路径生效) 该模块需通过编译Nginx时添加,或通过动态模块(`.so`或`.dll`)加载[^2][^3]。 --- #### 2. **常见问题与排查** ##### **问题1:模块未加载** - **表现**:Nginx启动时报错`unknown directive "more_set_headers"` - **原因**:模块未正确编译或加载 - **解决方法**: 1. **确认模块安装**: 若通过源码编译,需在编译时添加参数: ```bash ./configure --add-module=/path/to/headers-more-nginx-module ``` 若使用动态模块(`.dll`),需在`nginx.conf`中添加: ```nginx load_module modules/ngx_http_headers_more_filter_module.dll; ``` 2. **检查路径权限**: 确保Nginx进程对`.dll`文件有读取权限,且路径正确[^3]。 ##### **问题2:配置语法错误** - **表现**:Nginx配置检测失败(`nginx -t`报错) - **常见错误**: - 指令位置错误(如将`more_set_headers`放在`location`块外) - 指令拼写错误(如`more_set_headers`写成`more_set_header`) - **示例正确配置**: ```nginx http { more_set_headers "Server: Custom"; server { location / { more_set_headers "X-Frame-Options: DENY"; } } } ``` ##### **问题3:Windows环境兼容性问题** - **表现**:模块加载失败(如版本不匹配) - **解决方法**: 1. 确认`.dll`文件与Nginx版本匹配(例如,Nginx 1.25需对应编译的模块版本)。 2. 若需重新编译,参考官方文档使用`MSYS2`或`Visual Studio`工具链[^1][^4]。 --- #### 3. **参考资料** - 模块官方文档:https://github.com/openresty/headers-more-nginx-module - Nginx动态模块加载指南:http://nginx.org/en/docs/dev/development_guide.html#modules - Windows编译说明:http://nginx.org/en/docs/howto_build_on_win32.html ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值