Cloud Foundry PHP 网站实例因自定义 mime 配置而崩溃

Posted

技术标签:

【中文标题】Cloud Foundry PHP 网站实例因自定义 mime 配置而崩溃【英文标题】:Cloud Foundry PHP website instance crashes with custom mime configuration 【发布时间】:2017-10-19 12:25:10 【问题描述】:

我正在尝试在 Cloud Foundry 部署一个带有 html 扩展名的基本 php 页面,更准确地说是在 Swisscom Application Cloud。

这是我唯一的源文件,位于$APP_ROOT/www/index.html

<html>
<?php
    phpinfo();
?>
</html>

我的配置文件如下。

.bp-config/options.json:


  "WEBDIR": "www",
  "PHP_VERSION": "PHP_56_LATEST",
  "WEB_SERVER": "httpd"

.bp-config/httpd/httpd.conf:

ServerRoot "$HOME/httpd"
Listen $PORT
ServerAdmin "$HTTPD_SERVER_ADMIN"
ServerName sample-app.scapp.io
DocumentRoot "$HOME/#WEBDIR"
Include conf/extra/httpd-modules.conf
Include conf/extra/httpd-mime.conf

我从 Swisscom App Cloud 中的设置中获取的服务器名称:

.bp-config/httpd/extra/httpd-modules.conf:

LoadModule mpm_event_module modules/mod_mpm_event.so

根据错误日志,这似乎是必需的,如果不包括在内。

.bp-config/httpd/extra/httpd-mime.conf:

<IfModule mime_module>
    AddType application/x-httpd-php .php .htm .html
</IfModule>

为方便起见,可以通过this GitHub repo 访问上面的源代码。

实例无法启动,但我找不到任何描述性错误消息。这些是来自 Swisscom 应用程序云的日志:

2017-05-19 12:56:26 [API/1] OUT Created app with guid 383e1568-29e9-4ef5-9825-3e1248a85b8e
2017-05-19 12:56:28 [API/3] OUT Updated app with guid 383e1568-29e9-4ef5-9825-3e1248a85b8e ("route"=>"025e8337-7fd2-42c8-a325-d535af3db460", :verb=>"add", :relation=>"routes", :related_guid=>"025e8337-7fd2-42c8-a325-d535af3db460")
2017-05-19 12:56:38 [API/1] OUT Updated app with guid 383e1568-29e9-4ef5-9825-3e1248a85b8e ("state"=>"STARTED")
2017-05-19 12:56:38 [STG/0] OUT Downloading dotnet_core_buildpack...
2017-05-19 12:56:38 [STG/0] OUT Downloading nodejs_buildpack...
2017-05-19 12:56:38 [STG/0] OUT Downloading python_buildpack...
2017-05-19 12:56:38 [STG/0] OUT Downloading binary_buildpack...
2017-05-19 12:56:38 [STG/0] OUT Downloading go_buildpack...
2017-05-19 12:56:39 [STG/0] OUT Downloaded nodejs_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloading php_buildpack...
2017-05-19 12:56:39 [STG/0] OUT Downloaded dotnet_core_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloading java_buildpack...
2017-05-19 12:56:39 [STG/0] OUT Downloaded binary_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloading staticfile_buildpack...
2017-05-19 12:56:39 [STG/0] OUT Downloaded python_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloading ruby_buildpack...
2017-05-19 12:56:39 [STG/0] OUT Downloaded go_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloaded java_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloaded php_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloaded staticfile_buildpack
2017-05-19 12:56:39 [STG/0] OUT Downloaded ruby_buildpack
2017-05-19 12:56:39 [STG/0] OUT Creating container
2017-05-19 12:56:39 [STG/0] OUT Successfully created container
2017-05-19 12:56:39 [STG/0] OUT Downloading app package...
2017-05-19 12:56:39 [STG/0] OUT Downloaded app package (1.5K)
2017-05-19 12:56:39 [STG/0] OUT Staging...
2017-05-19 12:56:41 [STG/0] OUT -------> Buildpack version 4.3.31
2017-05-19 12:56:41 [STG/0] OUT Installing HTTPD
2017-05-19 12:56:41 [STG/0] OUT HTTPD 2.4.25
2017-05-19 12:56:42 [STG/0] OUT Downloaded [file:///tmp/buildpacks/d16e91f150d8c31f69507a615bf75f08/dependencies/https___buildpacks.cloudfoundry.org_dependencies_httpd_httpd-2.4.25-linux-x64-bf8851c4.tgz] to [/tmp]
2017-05-19 12:56:42 [STG/0] OUT Installing PHP
2017-05-19 12:56:42 [STG/0] OUT PHP 5.6.30
2017-05-19 12:56:42 [STG/0] OUT Downloaded [file:///tmp/buildpacks/d16e91f150d8c31f69507a615bf75f08/dependencies/https___buildpacks.cloudfoundry.org_dependencies_php_php-5.6.30-linux-x64-13625eaa.tgz] to [/tmp]
2017-05-19 12:56:44 [STG/0] OUT Finished: [2017-05-19 10:56:44.679464]
2017-05-19 12:56:53 [STG/0] OUT Exit status 0
2017-05-19 12:56:53 [STG/0] OUT Staging complete
2017-05-19 12:56:53 [STG/0] OUT Uploading droplet, build artifacts cache...
2017-05-19 12:56:53 [STG/0] OUT Uploading droplet...
2017-05-19 12:56:53 [STG/0] OUT Uploading build artifacts cache...
2017-05-19 12:56:53 [STG/0] OUT Uploaded build artifacts cache (198B)
2017-05-19 12:57:01 [STG/0] OUT Uploaded droplet (55.3M)
2017-05-19 12:57:01 [STG/0] OUT Uploading complete
2017-05-19 12:57:01 [STG/0] OUT Destroying container
2017-05-19 12:57:02 [CELL/0] OUT Creating container
2017-05-19 12:57:02 [CELL/0] OUT Successfully created container
2017-05-19 12:57:04 [STG/0] OUT Successfully destroyed container
2017-05-19 12:57:06 [CELL/0] OUT Starting health monitoring of container
2017-05-19 12:57:07 [APP/PROC/WEB/0] OUT 10:57:07 php-fpm | [19-May-2017 10:57:07] NOTICE: fpm is running, pid 40
2017-05-19 12:57:07 [APP/PROC/WEB/0] OUT 10:57:07 php-fpm | [19-May-2017 10:57:07] NOTICE: ready to handle connections
2017-05-19 12:57:07 [APP/PROC/WEB/0] OUT Exit status 1
2017-05-19 12:57:07 [CELL/0] OUT Exit status 0
2017-05-19 12:57:07 [CELL/0] OUT Destroying container
2017-05-19 12:57:07 [API/3] OUT Process has crashed with type: "web"
2017-05-19 12:57:07 [API/3] OUT App instance exited with guid 383e1568-29e9-4ef5-9825-3e1248a85b8e payload: "instance"=>"", "index"=>0, "reason"=>"CRASHED", "exit_description"=>"2 error(s) occurred:\n\n* 2 error(s) occurred:\n\n* Exited with status 1\n* cancelled\n* cancelled", "crash_count"=>1, "crash_timestamp"=>1495191427514377386, "version"=>"ede7276b-e0a6-467c-a86a-5c60f1c36021"

我想肯定还有其他日志,其中包含有关崩溃的更多信息,但我不知道在哪里可以找到它们。

是什么导致了崩溃,我该如何解决?

【问题讨论】:

【参考方案1】:

我不确定您的应用失败的原因。我的猜测是 HTTPD 不喜欢该配置并且它正在退出。日志中没有来自 HTTPD 的输出,您应该会看到它正在启动,就像这样。

例如:

2017-05-20T08:26:18.76-0400 [APP/PROC/WEB/0] OUT 12:26:18 httpd   | [Sat May 20 12:26:18.741822 2017] [mpm_event:notice] [pid 103:tid 140440543442816] AH00489: Apache/2.4.25 (Unix) configured -- resuming normal operations
2017-05-20T08:26:18.77-0400 [APP/PROC/WEB/0] OUT 12:26:18 httpd   | [Sat May 20 12:26:18.741947 2017] [mpm_event:info] [pid 103:tid 140440543442816] AH00490: Server built: Dec 20 2016 22:27:46
2017-05-20T08:26:18.77-0400 [APP/PROC/WEB/0] OUT 12:26:18 httpd   | [Sat May 20 12:26:18.741961 2017] [core:notice] [pid 103:tid 140440543442816] AH00094: Command line: '/app/httpd/bin/httpd -f /home/vcap/app/httpd/conf/httpd.conf -D FOREGROUND'

如果您想让 PHP-FPM 处理您的 HTML 文件,您需要进行一些更改。

1.) 在.bp-config/httpd/extra/httpd-php.conf 中,您需要修改或附加&lt;Directory "$HOME/#WEBDIR"&gt; 块,以便它将.html 文件发送到PHP-FPM。如果您不这样做,HTTPD 只会为它们提供服务或返回 404。

例如:同时发送 .php.html

<Directory "$HOME/#WEBDIR">
  <Files *.php>
      <If "-f %REQUEST_FILENAME"> # make sure the file exists so that if not, Apache will show its 404 page and not FPM
          SetHandler proxy:fcgi://#PHP_FPM_LISTEN
      </If>
  </Files>
  <Files *.html>
      <If "-f %REQUEST_FILENAME"> # make sure the file exists so that if not, Apache will show its 404 page and not FPM
          SetHandler proxy:fcgi://#PHP_FPM_LISTEN
      </If>
  </Files>
</Directory>

2.) 您需要指示 PHP-FPM 处理带有.html 扩展名的文件。默认情况下它不会,因为它试图通过错误配置来防止滥用(即防止攻击者评估具有意外扩展名的文件)。

为此,您需要添加文件.bp-config/php/fpm.d/php-process-html.confphp-process-html 部分无关紧要,但名称需要以.conf 结尾)。在其中,您需要输入以下内容:

[www]
security.limit_extensions = .php .html

这告诉 PHP-FPM 处理 .php.html 文件。

注意:这至少需要 v4.3.32 的 PHP 构建包,在我写这篇文章时它还是很新的。如果您使用的是旧版本的构建包,它仍然是可能的,但您需要提供一个完整的自定义 php-fpm.conf 配置文件,而不是仅仅覆盖这个属性并且该文件将进入.bp-config/php/php-fpm.conf。从here 获取php-fpm.conf 文件之一,如果您卡在较旧的构建包上,可以将其作为开始使用的基础。

【讨论】:

我已经复制了whole default config 并解决了崩溃问题,但我仍然无法成功应用您的配置:Got error 'Access to the script '/home/vcap/app/www/index.html' has been denied (see security.limit_extensions)。最新更改为here。 记录一下,php build pack版本是4.3.31,所以我是用复制整个php-fpm.conf文件的方式 你需要像上面的例子一样设置security.limit_extensions。默认文件已将其注释掉,因此取消注释并将列表设置为.php .html。对于它的价值,不要在你的应用程序中包含你没有覆盖的配置文件。这让构建包提供默认值。我看到你那里也有php.ini。您只需要您要覆盖的一个文件。 您也可以考虑使用cf push -b https://github.com/cloudfoundry/php-buildpack#v4.3.33。只要您的 CF 安装有 Internet 访问权限,它就会下载并使用目前最新的 v4.3.33。然后你不需要覆盖整个文件,你可以使用上面的说明。 成功了!太感谢了!作为记录,这是我按照您的指示所做的。 1) 保留所有 httpd 默认配置,否则容器崩溃,没有有意义的错误消息,2) 删除所有其他默认配置文件,3) 应用您在 .bp-config/httpd/httpd.conf.bp-config/php/fpm.d/php-process-html.conf 中指示的更改和 4) 在命令中指定按照您的指示排列 php-buildpack 的 4.3.33 版本。工作版本可用here。

以上是关于Cloud Foundry PHP 网站实例因自定义 mime 配置而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP Cloud Foundry 应用程序连接到 IBM zOS 系统/DB2 表

借助自动缩放功能在Cloud Foundry上进行分布式计算

谷歌云平台上的 Cloud Foundry

Cloud Foundry平台中国唯一云供应商,阿里云持续链接Cloud Foundry/Kuber

Cloud FoundryCould Foundry学习——Could Foundry浅谈

Cloud FoundryCould Foundry学习——核心组件分析