ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
默认的,httpd和php结合方式分为两大类,DSO和FCGI。 * DSO方式,php作为httpd的模块 * FCGI方式,使用php-fpm单独管理php进程池 [PHP-FPM][1]简单可靠的 FastCGI 进程管理器(FastCGI Process Manager),从 [PHP 5.3.3][2] 开始就成为了 PHP 的内置管理器。Apache 官方网站也提供了配置 Apache httpd 2.4.x 使用 mod_proxy_fcgi 和 PHP-FPM 运行 php 程序的基本方法和设置运行方式的简单介绍。 ## DSO方式 yum安装php,默认会将php作为httpd的模块,编译安装需要使用apxs将php编译为httpd模块。 ## FCGI方式 ### 两种监听方式 ~~~ TCP socket listen = 127.0.0.1:9000 UDS 方式 Unix Domain Socket (UDS)(Apache 2.4.9 及以上版本才支持此方式),通过路径指明 socket 的位置 listen = /var/run/php-fpm/php-fpm.sock ~~~ ### SETHANDLER 这种处理方式的适应性最强:在 Apache 范围内部署一次之后,所有的虚拟主机 `<VirtualHost >` 里的 PHP 文件都会由它来处理。跟 mod_php 的便利程度是一样的。当然,也就没法针对每个 VirtualHost 来控制 PHP-FPM 的运行用户和资源分配了。可惜需要到 Apache 2.4.9 才能用上,当然,或者自己打[补丁][3]也行。 ~~~ <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </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> ~~~ ~~~ <FilesMatch \.php$> SetHandler "proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost" </FilesMatch> ~~~ ### PROXYPASSMATCH¶ 需要在每个 <VirtualHost > 中分别设置,即使使用相同的 pool,也需要在设置的时候修改 pool 后面的 webroot 路径 >[danger] 这种方法在httpd 2.4.9之前和之后的版本中使用都可以 ~~~ ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/webroot/$1 ~~~ ### PROXYPASS¶ ~~~ <LocationMatch ^(.*\.php)$> ProxyPass fcgi://127.0.0.1:9000/path/to/webroot/$1 ProxyErrorOverride on </LocationMatch> ~~~ 仍然需要在每个 <VirtualHost > 中分别设置。可以放在 </Directory> 之后。 ### MOD_REWRITE 这个方法,利用 mod_rewrite 的 P 标志将地址重写并传递给 mod_proxy。本来应该是挺好的,还可以用来解决这里提到的一个严重警告。可惜: [mod_rewrite 页面][4]写得很清楚,这个方法不支持持久连接(persistent connections); [1]:https://php-fpm.org/ [2]:http://php.net/archive/2010.php#id2010-07-22-2 [3]:https://bz.apache.org/bugzilla/show_bug.cgi?id=54101 [4]:http://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_p