背景:我的服务器太旧,无法升级。某些软件只能在 PHP 5.6 上运行,与较新版本的 PHP 不兼容。新的服务器托管包不支持 PHP 5.6,因为它不久前已被弃用。
我正在将应用程序移动到支持 docker 的新服务器,并打算将 PHP 5.6 及其所有依赖项打包到 docker 映像中。然后,我将重新配置 Apache 2.4 以使用 fcgi/php-fpm 与需要 PHP 5.6 的域的容器化 php 通信。我的容器化 PHP-FPM 版本可以与平台的 MySQL 和 Mongo 通信。
我一直在阅读 PHP-FPM 文档,但不清楚文件如何从 Apache 传输到 PHP-FPM,或者 PHP-FPM 是否从文件系统读取文件。
PHP-FPM 是一个纯网络应用程序吗?也就是说,我可以把它放在网络上的任何机器上,它会转换 PHP 文件并返回输出,而无需访问文件系统?在新的设置中,PHP 将在自己的容器中运行,并拥有自己的文件系统。我需要关心这个吗?
有人能帮助我理解 PHP-FPM、Apache、源文件和文件系统之间的关系吗?
答案1
简化:
Apache httpd 将传入的请求映射到 Web 服务器文件系统上的某个位置(即,在解析DocumentRoot
和任何/所有适用的Alias
、、Location
mod_rewrite 和其他扩展之后)。
当该请求映射到 PHP 文件时,Apache httpd 会将该文件的文件系统位置传递给 PHP-FPM 进行处理,并将 PHP-FPM 生成的输出返回给网站访问者。
因此当您的 Apache 配置如下所示时:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/www.example.com
DirectoryIndex index.html index.php
Alias "/my-app" "/var/www/apps/my-app/release-2.3"
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
该目录/var/www/apps/my-app/release-2.3
没有index.html
,但包含index.php
以及可能用于您的 Web 应用程序的其他数据。
因此,对的请求http:///www.exaple.com/my-app
将映射到文件系统上的 PHP 文件,以 /var/www/apps/my-app/release-2.3/index.php
该位置将传递给 PHP-FPM。
相当于“请帮 /var/www/apps/my-app/release-2.3/index.php
我解析”
Apache 不会将内容发送/var/www/apps/my-app/release-2.3/index.php
到 PHP-FPM。这有几个原因:但其中一个原因是 PHP 应用程序很少只包含单个 PHP 文件的内容。通常,应用程序代码的其他部分会加载和include
/或require
PHP 指令,而 PHP 解释器 PHP-FPM 也需要加载这些文件。
当您在 docker 容器中运行 PHP-FPM 时,您需要确保您的 PHP 源可用并且映射到与 PHP 源驻留在 Web 服务器上的相同文件系统位置。