apache 与 php-fpm 几种处理方式

查了下apache和php-fpm结合的几种方式,记录一下。

csdn资料:https://blog.csdn.net/qq_21956483/article/details/82847744
apache官网文档:https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html

# 1、SetHandler 方式
# php-fpm监听socket文件

<FilesMatch \.php$>
	SetHandler "proxy:unix:/tmp/php-fpm.sock|fcgi://localhost"
</FilesMatch>

# php-fpm监听端口

<FilesMatch \.php$>
	SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

# 2、ProxyPassMatch方式 需要在每个 “VirtualHost” 里面加入

<VirtualHost *:80>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/your/documentroot/$1
DirectoryIndex /index.php
</VirtualHost>

# 3、ProxyPass方式 跟ProxyPassMatch 类似 ,需要在每个 VirtualHost 中分别设置

<LocationMatch ^(.*\.php)$>
ProxyPass fcgi://127.0.0.1:9000/path/to/webroot/
ProxyErrorOverride on
</LocationMatch>

设置apache将html文件由php处理

这么做的原因:html文件里嵌入了php代码,但是文件名还是.html,需要将html文件交由php处理。
PS:apache和php跑在fastcgi方式下。

首先修改apache将html请求转给php处理:
虚拟主机添加配置

<FilesMatch \.html$>
    SetHandler "proxy:unix:/tmp/php-cgi-56.sock|fcgi://localhost"
</FilesMatch>

重启apache测试。
访问网站报错 access deny

查apache虚拟主机错误日志发现:

AH01071: Got error 'Access to the script '/www/wwwroot/www.xxx.com/index.html'has been denied (see security.limit_extensions)\n'~

应该是php-fpm安全策略导致的。
查 security.limit_extensions 参数发现属于php-fpm.conf中配置
在php-fpm.conf 中[www]池配置段添加一句:

security.limit_extensions = .php .html 

重启php-fpm即可。

apache上传大文件超时问题

apache服务器上传大文件超过21-22秒就提示503错误了。
开始怀疑是apache反向代理php-fpm的问题,找了几个参数也没解决。后来开启apache的debug模式才解决。

# 修改 httpd.conf 开启debug

LogLevel debug

重启apache。

找到error.log
# 看到这么一条日志

[Tue May 07 17:13:02.195708 2019] [reqtimeout:info] [pid 24671:tid 140592553060096] [client 192.168.1.147:11002] AH01382: Request body read timeout

判断是接收数据超时了。

官方文档:http://httpd.apache.org/docs/2.4/mod/mod_reqtimeout.html

# 修改http.conf 设置接收正文超时200秒

<IfModule reqtimeout_module>
    RequestReadTimeout body=200
</IfModule>

解决

apache2.4使用mod_ratelimit模块限制下载速度

项目中apache需要访问nas共享中的一个目录,会牵扯到身份验证,这里设置nas访问用户为administrator,密码同本地系统administrator密码一致!

修改apache服务,以管理员用户启动,否则访问nas目录会报404错误(应该是访问不到)。

载入限速模块,配置目录权限及限速:

LoadModule ratelimit_module modules/mod_ratelimit.so
<Location /vkvod>
 SetOutputFilter RATE_LIMIT
 SetEnv rate-limit 100 #限速100k
</Location>
#设置虚拟目录权限,否则提示403错误
<Directory //192.168.0.157/NAS/Vod>
 Options Indexes FollowSymLinks Includes ExecCGI
 AllowOverride All
 Require all granted
</Directory>

设置虚拟目录:

<IfModule alias_module>
 Alias /vkvod //192.168.0.157/NAS/Vod
</IfModule>

用浏览器下载 http://192.168.0.156/vkvod/2.mp4 测试 #单线程,不能用迅雷,迅雷为多线程。

通过测试也发现跟nginx一样是限制会话速度而不是限制单个ip速度。

官方手册:http://httpd.apache.org/docs/2.4/mod/mod_ratelimit.html

另外提示,在官方中并不提供windows下的apache2.4下载,只有源码包。可以从第三方网站下载。

提供一个第三方下载地址:http://s1.jisuxia.com/2013/0627/Apache_2.4.4_for_Windows_JiSuXia.rar

windows下配置apache的单ip并发及限速模块(limitipconn2、mod_bw)

limitipconn为单ip并发限制,mod_bw为单ip带宽限制,这两个模块都不属于apache官方模块,均为第三方开发。
limitipconn2第三方官网下载地址:
http://dominia.org/djao/limit/win32/mod_limitipconn.httpd-2.2.11-WIN32.zip

mod_bw第三方官网下载地址(仅支持2.2版本,新版2.4好像不支持没测试):
http://ivn.cl/files/dlls/mod_bw-0.91-2.2.14/mod_bw.dll

据网上资料说mod_bw模块是根据每个客户端进行带宽限制,但实际测试效果并不是这样,测试效果是对全局或者某个虚拟主机整体产生了影响。

配置过程:
修改apache配置文件,开启 mod_status.so 和载入 mod_limitipconn.dll :

LoadModule status_module modules/mod_status.so
ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.dll

<IfModule mod_limitipconn.c>
<Location /vkvod>
MaxConnPerIP 3
</Location>
</IfModule>
#以上部分为对vkvod目录进行单ip线程连接限制,为实现效果设置为3,当超过线程连接数时,会报503错误。

LoadModule bw_module modules/mod_bw.dll

BandWidthModule On
ForceBandWidthModule On
BandWidth all 100000

Alias /vkvod "\\\\192.168.0.157\\NAS\\Vod"

#以上部分为载入mod_bw.dll模块,整体限速为100kb。
以上配置可以放到httpd.conf中也可以放到虚拟主机配置文件中,针对全局或虚拟主机进行限制。

参数说明:
MaxConnPerIP 3 #限制的线程数
BandWidthModule On #是否开启限速
ForceBandWidthModule On #强制带宽限制
BandWidth all 100000 #最大带宽100kb

效果截图:

当超过最大连接数时,错误提示:

限速模块效果:当开启一个下载过程基本达到100kb的速度。

当开启3个下载过程(3台独立客户端下载)基本在40-60kb:

所以说mod_bw的带宽限速效果不太适合我当前环境,可以用于针对某个虚拟主机限速。防止下载量过大影响其他虚拟主机。

经过查阅apache2.4官方文档,已经自带了限速模块:http://httpd.apache.org/docs/2.4/mod/mod_ratelimit.html