我是 ubuntu 新手,希望能够帮助解决设置 LAMP 时遇到的障碍,本篇文章标题中的软件版本(我相信截至 2016 年 11 月为止)是这样的。 该问题似乎在于无法使用 php7 mods 配置 Apache 2。
我使用的是使用“tasksel install lamp-server”安装的默认软件包,但下载的 Apache2 软件包似乎没有按照 php7 mods 的配置进行安装。例如,文件“php7.0conf”和“php7.0load”未复制到文件夹“etc/apache2/mods-enabled”中。使用“libapache2-mod-php7.0”似乎也无法启用 php7.0 mods。我发现启用 php7.0 mods 的唯一指令是“a2enmodphp7.0”,它确实将 php7“conf”和“load”文件复制到 Apache2 的“mods-enabled”文件夹中,但 Apache2 无法重新启动并出现以下错误:
“Apache 正在运行线程 MPM,但您的 PHP 模块未编译为线程安全的。您需要重新编译 PHP。AH00013:预配置失败
httpd.service:控制进程已退出,代码=已退出状态=1“
我单独下载 Apache2(使用“apt-get install apache2”)然后下载“apt-get libapache2-mod-php7.0”和“a2enmodphp7.0”,得到了相同的结果。
我的研究表明这是 Apache2 和 php7 之间已知的不兼容性。Apache 上的 wiki 表示 Apache 运行线程 MPM,而 PHP7 未编译为线程安全的。它建议使用手动更改 Apache 配置文件的解决方法。请参阅第 4.3 节https://wiki.archlinux.org/index.php/LAMP#PHP。
在我开始修修补补之前,我想请教社区是否有更加优选的解决方案? 我对那些整合默认软件包的人的信任让我希望他们能够内置某种东西来将它们组合在一起。
答案1
有多种方法可以将 PHP 连接到 Apache。这些方法称为服务器 API或者业务应用程序接口. 使用 Apache 模块mod_php就是这样一个 SAPI。但是有些 PHP 模块(例如 MySQL 模块)还不能处理多线程,它们不是线程安全的. mod_php 是 Apache 和 PHP 之间相对紧密的耦合,因此您不能同时使用线程 MPM 和非线程安全的 PHP 模块。
您有两个选择:第一个选择是切换到非线程 MPM,即prefork
。这可能会带来性能损失。
第二种选择是,切换到耦合不那么紧密的 SAPI,例如fcgi
或PHP-FPM
。它们基本上作为自己的守护进程运行,因此 Apache MPM 不必关心 PHP-FPM 守护进程中的任何模块是否是线程安全的。但要设置它们,您需要做的不仅仅是使用 安装包apt
,因此存在学习曲线。