Apache/2.4.27+PHP+HTTP/2

最近将VPS上的Apache升级至2.4.27时,发现Change Log中有如下内容:

COMPATIBILITY: mod_http2: Disable and give warning when using Prefork.
The server will continue to run, but HTTP/2 will no longer be negotiated.
[Stefan Eissing]

Apache提供了三个MPM*1(Multi-Processing Modules)——prefork|worker|event,必须有且只有一个被启用。按照更新日志,我只需要使用非mpm_prefork即可。


但并不那么简单,当尝试停用mpm_prefork时,问题出来了:

root@HWS-Node3:~# a2dismod mpm_prefork 
ERROR: The following modules depend on mpm_prefork and need to be disabled first: php7.1

由于mod_php7.1依赖于mpm_prefork,所以不能将后者停用,除非先停用前者,而VPS上托管的许多网站是基于PHP……

因此不能再继续使用Apache的mod_php7.1来解析PHP,而要使用php-fpm:

#停用mpm_prefork和mod_php7.1,启用mpm_event
a2dismod php7.1 mpm_prefork
a2enmod mpm_event
#安装php-fpm并启用
apt install php7.1-fpm
a2enconf php7.1-fpm
#使php-fpm随系统启动
systemctl enable php7.1-fpm
#修改配置文件
vim /etc/php/7.1/fpm/php.ini

修改配置文件如下处*2:

# vim /etc/php/7.1/fpm/php.ini

cgi.fix_pathinfo=1
file_uploads = Off
upload_max_filesize = 8M
post_max_size = 12M

如果不存在,则要手动创建,内容如下:

# vim /etc/apache2/conf-available/php7.1-fpm

<IfModule !mod_php7.1.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>
 
    # Set a sufficient timeout to avoid 504 when POST
    ProxyTimeout 600
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.1-fpm.sock|fcgi://localhost"
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

执行a2enconf php7.1-fpm以加载该配置文件,最后执行/etc/init.d/apache2 restart来重启Apache,如无意外*3,便可同时让网站使用PHP和HTTP/2


*1.关于三种MPM,更多的介绍可参见:http://balich.blog.51cto.com/6641781/1743798
*2.我的网站不需要上传功能,如你的需要,则不要添加第2和3行
*3.如果访问时返回503错误,且vHost的错误日志中有类似『无法连接至/run/php/php7.1-fpm.sock』的记录,检查是否存在/run/php/php7.1-fpm.sock,如不存在,考虑重启php7.1-fpm.