星路

追寻那一缕星光,在漆黑夜晚前行

0%

Apache2.4启用FastCGI+FPM

由于有一个需求,希望前端请求后服务器可以直接返回,不用等待服务器端长时间的处理,查找一番发现PHP有fastcgi_finish_request()函数可以满足需求,但需要运行在FastCGI模式时,并且是需要PHP-FPM进程管理器才有这个功能。于是乎网上找了资料,发现没有比较完整的记录,折腾了一下午才搞掂,做个总结吧。


1.环境

Ubuntu 18.04 64位
Apache2.4.29(apt自动挡安装)
PHP 7.2(apt自动挡安装)


2.过程

2.1.安装fastcgi

1
$ sudo apt install libapache2-mod-fcgid

一个坑

对应的模块是mod_fcgid,网上搜到很多教程用的实际是mod_fastcgi,结果配置老是不对,版本的区别可以看[这里][1]。

2.2.安装php-cgi、php-fpm

1
2
$ sudo apt install php-cgi
$ sudo apt install php-fpm

Tips

php-fpm会开启多个php-cgi程序进行管理,需要安装php-cgi。

2.3.启用模块

1
2
3
$ sudo a2dismod php7.2
$ sudo a2enmod fcgid
$ sudo a2enmod proxy_fcgid

Tips

php7.2 mod是内置进程管理器,需要关闭。安装php-fpm会加入/etc/apache2/conf-enabled/php7.2-fpm.conf,包含了mod_proxy_fcgi模块的设置,不需要额外设置。

2.4.配置fcgid模块

编辑/etc/apache2/mods-enabled/fcgid.conf,加入以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<IfModule mod_fcgid.c>
FcgidConnectTimeout 20

# Where to look for the php.ini file?
FcgidInitialEnv PHPRC /etc/php/7.2/fpm
# Set PHP_FCGI_MAX_REQUESTS to greater than or equal to FcgidMaxRequestsPerProcess
# to prevent php-cgi process from exiting before all requests completed
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
# Maximum requests a process should handle before it is terminated
FcgidMaxRequestsPerProcess 1000
# Maximum number of PHP processes
FcgidMaxProcesses 5
# Number of seconds of idle time before a php-cgi process is terminated
FcgidIOTimeout 120
FcgidIdleTimeout 120
#Path to php-cgi
FcgidWrapper /usr/bin/php-cgi .php
# Define the MIME-Type for ".php" files
AddType application/x-httpd-php .php

<IfModule mod_mime.c>
AddHandler fcgid-script .fcgi .php
</IfModule>
</IfModule>

2.5.配置目录权限

编辑/etc/apache2/apche2.conf,给网址目录加上ExecCGI权限

1
2
3
4
5
<Directory /var/www>
Options -Indexes +FollowSymLinks +ExecCGI
AllowOverride None
Require all granted
</Directory>

!!! info 目录
包含有FCGI脚本的目录要加上,否则可省略。
!!!

2.6.重启apache2生效

1
$ sudo service apache2 restart