闲谈一隅

使用FastCGI运行php

加载必须的模块

  1. 首先你必须确认是否加载了od_proxymod_proxy_fcgi模块,若没有请先加载
    1
    2
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

php-fpm的监听方式

php-fpm 有两种监听方式,可以在 pool.conf 中设置

TPC socket

1
listen = 127.0.0.1:9000

Unix Domain Socket (Apache 2.4.9+)

1
listen = /var/run/php-fpm/php-fpm.sock

apache发送处理请求的方式

1.SETHANDLER
在php 的 pool.conf 文件中设置

1
listen = 127.0.0.1:9000

然后可以直接在apache的配置文件中加入

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

这样就可以了。

如果是UDS方法的话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# apache2.4.10+
# Redirect to the proxy
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost"
</FilesMatch>
# 未测试
<Proxy "unix:/var/run/php-fpm/php-fpm.sock|fcgi://php-fpm">
# we must declare a parameter in here (doesn't matter which) or it'll not register the proxy ahead of time
ProxySet disablereuse=off
</Proxy>
# Redirect to the proxy
<FilesMatch \.php$>
SetHandler proxy:fcgi://php-fpm
</FilesMatch>

  1. PROXYPASSMATCH
    需要在每个 中分别设置

中加入

1
2
3
<IfModule mpm_event_module>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/webroot/$1
</IfModule>

  • ProxyPassMatch
    只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,
    ^/(..php(/.)?)$
    从网站(虚拟主机 的根目录开始,匹配任何以 .php 结尾,或者在 .php 之后紧跟一个 / 再跟别的内容的路径。
  • ^ (caret) 和 $ (dollar)
    标志要匹配的路径的开始和结束
  • ( )
    括号里的内容可以用 $1 来表示,以方便后面引用它。
  • fcgi://127.0.0.1:9000
    通过 mod_proxy_fcgi 来转发的代理,使用 fastCGI 协议,转到 PHP-FPM 监听的端口。
    改变 IP 地址和/或端口号就可以要转到的不同的 pool。用这个可以实现服务器分流、均衡等。
  • /path/to/your/documentroot/
    非常重要!必须与虚拟主机的路径匹配,且必须是对应 php 文件在操作系统中的绝对路径。否则会找不到文件(PHP Script File)。这也是 URL 地址重写的目的所在:将 URL 地址转换成 fcgi://127.0.0.1:9000 后面紧跟着的 php 文件绝对路径。
  • /path/to/your/documentroot/
    非常重要!必须与虚拟主机的路径匹配,且必须是对应 php 文件在操作系统中的绝对路径。否则会找不到文件(PHP Script File)。这也是 URL 地址重写的目的所在:将 URL 地址转换成 fcgi://127.0.0.1:9000 后面紧跟着的 php 文件绝对路径。

参考
官方文档
FastCgi和PHP-fpm之间的关系
https://cnzhx.net/blog/apache-httpd-mod_proxy_fcgi-php-fpm/
https://segmentfault.com/q/1010000007111882
https://segmentfault.com/q/1010000002753412