我已经为 centos 7 服务器编译了 php 7.4。我还安装了 apache 2.4。
问题是我不知道下一步该怎么做才能让它工作。之前我有 2 个站点使用官方包,所以配置应该没问题 - 唯一改变的是 php - 完全改变。为什么我需要这个编译后的 php,为什么我不喜欢这个包?这是因为我需要 php 的 ZTS 支持,而预编译版本中没有,而且它对于并行支持(多线程)是必需的
在 Windows 上,整个编译 php 并使其运行的过程与此相比简直就是笑话(这就像 1 天,而且没有任何知识)。我刚刚配置了编译器、编译并替换了 Web 服务器中的 php 文件夹,它运行正常,网站中的每个测试也都通过了。
另一方面,在 centos 中,我编译了 php 和一些扩展 + 额外包以使其工作。当我用 检查模块时php -m
,它们看起来都很好。唯一的问题是网络服务器不再加载网站。这也是我受此困扰的第 4 天 - 总是有新类型的问题。
编译完 php 后,我替换了 PHP CLI 二进制文件中的二进制文件。实际上,我不知道这样做是否正确,因为我找不到有关此部分的任何信息,因为大多数描述都以运行 make install 命令或执行一些额外操作结束。
因此我需要有人给予指导,能够向我解释需要做什么以及为什么要这样做。
二进制文件中还编译了 php-fpm,但我不知道它是否会对其产生影响。
我也不知道该如何调试这种情况。我可以访问服务器,并且可以看到默认的 apache 测试页面,所以正如预期的那样,它没有发生任何变化,并且正常工作。
所以我想知道一些关于如何解决这个问题的线索,或者关于什么文件应该放在哪里以及为什么放的一些解释?
谢谢!
根据建议进行更新:
我又重新经历了整个过程——从我开始处理这个问题之前制作的快照中创建了一个新卷,然后从零开始重新启动。今天的进展是,在那之后甚至连模块都没有加载——zend_opcache 和 mongodb。现在运行 cmd 后sudo make install
,它清楚地说明了将模块放在哪里:/usr/local/php7/lib/php/extensions/no-debug-zts-20190902/
我找到的描述还说明了在哪里修改哪个 ini 文件以使其工作:
https://shaunfreeman.name/blog/compiling-php-7-on-centos
sudo vim /usr/local/php7/etc/conf.d/modules.ini
但这不再起任何作用,就像以前一样。还有一个建议复制的 php.ini 文件:
sudo cp -v ./php.ini-production /usr/local/php7/lib/php.ini
但是修改该 php.ini 文件以动态加载扩展也没有任何作用,所以我猜应该使用该 ini 文件的 php 根本看不到该文件。所以我检查了一下,whereis php
它显示:php: /usr/share/php /usr/local/php7/bin/php
第二个是我放入变量中的$PATH
,但我认为加载顺序是加载第一个。这是由第一个 make install 创建的,当我再次运行它时,这个 php 文件没有变化。也许它与此完全无关。
然后,当我运行 cmd 时,我又遇到了一种与 httpd 相关的问题httpd -V
:
AH00526: Syntax error on line 216 of /etc/httpd/conf.d/ssl.conf:
SuexecUserGroup configured, but suEXEC is disabled: Invalid owner or file mode for /usr/sbin/suexec
它具有 510 权限,具有 root:apache 用户:组对。将其更改为 0750 解决了此问题。我也不知道它是否真实存在 - 我猜这次一定是真实的,因为我找到的有关 suexec 的描述说它正在运行 php-cgi。但它对整体情况没有帮助。
然后我检查了 httpd 模块,我确实在/etc/httpd/modules/
文件夹中有这个模块:mod_proxy_fcgi.so
only,这当然并不意味着它正在用这个运行 php,但我可以在不检查文件的情况下进行假设 - 我应该从配置文件中确认它。
conf.d 文件夹中有一个文件:php.conf.rpmsave
,其中内容如下:
# Proxy declaration
<Proxy "unix:/var/run/php-fpm/default.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>
# Redirect to the proxy
<FilesMatch \.php$>
SetHandler proxy:fcgi://php-fpm
</FilesMatch>
我不确定这是否重要,因为它可能只是上一个包管理器 php 版本的已保存配置文件。此外,如果我说:sudo find / -name php.conf
或sudo find / -name *hp.con*
,那么我只会返回这一个文件,因此看起来编译版本没有为 apache 生成配置文件 - 也许它根本不必,但也许这是这里的问题。使用 mv 将其重命名为 php.conf,实际上将端口 80 的默认响应从花哨的测试 123.. 更改为 503 服务不可用。这可能是因为上次编译 php 时我排除了 php-fpm,所以现在我要再次重新编译它。完成后重新启动 httpd 和 php-fpm 服务 - 对情况没有帮助。
据我所知,系统中可能有多个版本的 php 脚本文件 - 这有点合乎逻辑 - 并且 cgi - fcgi、fpm 和 cli 版本也都是不同的脚本。
线程只能从 CLI 版本实现,所以如果我将包版本用于站点,然后对于线程,我会调用编译的 CLI php 版本,那么它可能会做我真正想要的事情 - 作为 B 计划。
此外,每次使用 cmd 安装编译版本后,php 命令都无法识别make install
。也许这是安装程序应该处理的问题 - 也可能不是,毕竟我将编译后的二进制文件夹放入了 $PATH 变量中,并将其添加到 profile.d 文件夹中的 .sh 脚本中
答案1
不要替换发行版提供的任何文件,因为这会严重破坏您的系统。自编译版本的正确位置在 下/usr/local/
。
对于你的 CentOS 7,你可以利用这些教程:
PHP-FPM 与 PHP7 源代码。这将指导您编译并安装 PHP-FPM
/usr/local/php7/
并在那里创建配置。在 CentOS 上将 PHP-FPM 与 Apache 2 结合使用。一旦您的 PHP-FPM 开始运行,您就可以轻松地将您的 Apache 切换为其 UNIX 套接字,而不是发行版提供的套接字。