将Apache从prefork切换到Ubuntu 16中的事件,使php 7正常工作


11

Apache生产运行缓慢。在寻找答案一段时间后,我终于进入#apache IRC频道,专业人士让我使用以下命令检查apache模式:

sudo apachectl -V

并被警告发现Server MPMprefork。他们强调说,请勿在生产服务器上使用PREFORK。事实证明,Ubuntu软件包(大概是从Debian继承的?)坚持要求以prefork模式运行apache,尽管事实是,推荐的与Apache一起运行PHP的方法显然推荐了proxy_fcgi和php-fpm,然后是fcgid并最终说您不应该这样做使用前叉:

为什么您不应该再将mod_php与prefork mpm一起使用

  • 始终将mod_php加载到每个httpd进程中。即使httpd提供静态/非PHP内容,该内存也正在使用中。
  • mod_php不是线程安全的,会迫使您坚持使用prefork mpm(多进程,无线程),这是最慢的配置

该页面还包含有关PHP-FPM的一些详细信息,但这似乎有些复杂和不清楚,并且似乎涉及许多手动配置。我感到失望和惊讶,Ubuntu 16没有fastCGI模式之类的软件包选项。

我尝试使用a2enmod 将apache切换到事件模式,并且尝试备份apache时,出现错误:

Apache正在运行线程MPM,但您的PHP模块未编译为线程安全的。您需要重新编译PHP

无论如何,我想知道是否有人通过尽可能少地依赖软件包安装程序来获得一些最少的逐步说明,以使fastCGI模式在具有PHP 7.0 Ubuntu 16上运行我目前正在查看许多解释不清,含糊不清的说明,而且我担心因决策错误而破坏了我的生产环境。

同样,有人应该将mpm-event添加为标记选项。这就是#apache IRC家伙推荐的。


最后一个错误是因为您切换到事件,但仍在使用mod_php。禁用mod_php并切换到php-fpm,它将消失。我可以推荐nginx吗?
迈克尔·汉普顿'18

@MichaelHampton的标题应该提到PHP。将Apache切换为事件并不难。很难将apache切换到event并使php 7正常工作。
S. Imp

1
@MichaelHampton当然,您知道我对如何“禁用mod_php并切换到php-fpm”感到困惑。这不是我在帖子中提出的问题吗?同样,问题不在于nginx,它代表了另一个学习领域。切换到Nginx在该项目中不切实际,因为我正在与一个团队合作。
S. Imp

我没有提到如何禁用Apache模块,因为您证明了您已经知道如何执行此操作。至于使PHP-FPM,看到了这个问题的答案,网上教程等
迈克尔·汉普顿

Answers:


15

ezra-s提出了一种不错的方法,但其中并未包含一些细节,这些细节可能会使依赖软件包管理器的人们感到困惑。注意:我不确定这些步骤是否正确。如果有人遇到麻烦或发现问题,请告诉我,我将更新此帖子。

首先,在撰写本文时,如果要安装PHP,Ubuntu的apache2软件包会坚持使用prefork。不过,请不要失望,因为您仍然可以使用软件包安装程序来安装和更新PHP apache2,并且仍然可以按照Apache Wiki的建议使用PHP-FPM 在事件模式下使配置与Apache一起使用,并在High-在Apache httpd 2.4.x上使用mod_proxy_fcgi和php-fpm性能PHP。基本思想是apache2和PHP-FPM通过套接字而不是通过Apache模块运行的PHP进行通信。

1)删除或禁用Apache PHP模块

因为Ubuntu软件包在安装PHP时坚持使用prefork Apache,所以我们必须将它们分开。我通过使用apt卸载libapache2-mod-php7.0来完成此操作,因为我不再需要该软件包:

sudo apt-get remove libapache2-mod-php7.0

或者,您可以改为禁用php7.0 Apache模块,但这不会从您的系统中删除apt程序包,这会导致烦人的系统崩溃。

sudo a2dismod php7.0

2)将Apache切换到事件模式并启用fcgid

我相信这些命令应该可以解决问题:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3)安装PHP-FPM

我已经安装了带有各种模块的PHP 7,因此只需使用以下命令安装PHP-FPM:

sudo apt-get install php7.0-fpm

4)编辑您的VirtualHost配置,以使用PHP-FPM处理PHP文件:

就我而言,我编辑了默认的SSL主机/etc/apache2/sites-available/default-ssl.conf,并将此行添加到顶部附近:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

重要说明:这指示Apache使用PHP-FPRM处理PHP文件请求,并且此伪指令中的路径(/run/php/php7.0-fpm.sock)必须与文件/ etc / php中listen伪指令指定的路径匹配。/7.0/fpm/pool.d/www.conf

5)重新启动Apache

sudo service apache2 restart

要检查是否启用了事件模式,请使用以下命令:

sudo apachectl -V

在输出中,您应该看到以下内容:

Server MPM:     event

尝试创建一个phpinfo页面并在浏览器中访问它。您应该Server API: FPM/FastCGI在输出中看到。


5
我建议不要使用ProxyPassMatch,因为它将不允许在目录中使用.htaccess。改用它:<FilesMatch \ .php $> SetHandler“ proxy:unix:/run/php/php7.0-fpm.sock | fcgi:// localhost /” </ FilesMatch>
waza123


如果我不像您要求的那样不触摸此文件,将会发生什么情况:/etc/apache2/sites-available/default-ssl.conf ,?我的https&http都工作正常
user5858 '19

我遵循了答案,除了ProxyPassMatch,将@ waza123的注释中的Filesmatch行添加到000-default.conf的顶部,然后重新启动了apache2,一切正常。多亏了你们两个,我的小VPS通过mpm_prefork saving节省了大量内存和CPU
dw1

我不必使用Ubuntu Server 19.10进行ProxyPass或文件编辑。完成第3步(安装PHP-FPM)之后,a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apache当我创建了<?php phpinfo();内部的phpinfo.php文件时,服务器API行显示FPM / FastCGI。顺便说一句,我安装了php7.3,因为在撰写本文时,至少应该在该版本上(如果不是更高版本),并且Ubuntu Server 19.10的Ubuntu apt存储库目前已升至php7.3。
ServerChecker

6

为了方便起见,发行版提供了“ mod_php”方法。

虽然最有效的方式是使用w / event + mod_proxy_fcgi-> php-fpm的apache。

也许他们应该与时俱进,但是当这么多框架以“即插即用”方式附带.htaccess mod_php配置时,这对他们来说就很难。最后,只有管理员才能正确管理和配置其站点。

如果您正在生产中,建议您使用测试服务器练习升级和更改。

关于Wiki,我更喜欢或建议您使用“处理程序”方法。 https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler

也就是说,将php-fpm配置为已准备好套接字,并且具有足够的权限供Apache用户向其发送请求并配置Apache以使用它。

一个简单的例子:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

编辑:

通过这种方式,使用哪种PHP版本都没有关系,因为Apache不在乎,它只会将适当的请求反向代理到php-fpm。

另外,不要忘记卸载mod_php才能使用mpm_event。

编辑2:

根据要求,您无需从debian / ubuntu卸载mod_php软件包,Apache只关心其配置,因此卸载模块即可。


感谢您的答复。我已经做了很多次反复试验,而这似乎是目前可行的方法。实际过程会涉及到更多点,因为您必须从prefork到事件获取apache,卸载libapache2-mod-php7.0等。我希望在这里稍作一些完整的回答。
S. Imp

无需从apache httpd立场“卸载”,只需卸载模块即可。与事件/前叉相同,mpm在2.4中也是模块,因此可以卸载前叉并加载事件。
ezra-s

好的,所以也许您不必卸载软件包,但是您必须至少禁用apache的php模块-而且我担心apt-get升级会破坏安装程序。您的答案中缺少这些详细信息。如果您将它们添加进来,我会感到很高兴,因为我对自己能准确了解我所做的事情的能力并不特别自信。
S. Imp

也许我以为它们是Apache也不在乎debian软件包,而只是在乎其功能配置。
ezra-s

Apache 在意apt软件包更新是否会更改其配置,这是我曾经遇到的一个问题。本着我原始帖子的精神,我想为其他像我一样依赖软件包安装程序(和更新)的人提供详细说明。
S. Imp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.