Search code examples
phpcloud-foundrymimehttpd.confswisscomdev

Cloud Foundry PHP website instance crashes with custom mime configuration


I am trying to deploy a basic php page with html extension at Cloud Foundry, more precisely at Swisscom Application Cloud.

This is my only source file, located at ${APP_ROOT}/www/index.html

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

My configuration files are as follows.

At .bp-config/options.json:

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

At .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

The server name I am taking from the setup in the Swisscom App Cloud: enter image description here

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

LoadModule mpm_event_module modules/mod_mpm_event.so

This seems to be required as per error logs, if not included.

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

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

The source code above can be accessed for convenience at this GitHub repo.

The instance can't be started but I can't find any descriptive error message. These are the logs from the Swisscom Application Cloud:

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"}

I guess there must be other logs with further information about the crash but I don't know where to find them.

What is causing the crash and how can I fix it?


Solution

  • I'm not sure about why your app is failing. My guess is that HTTPD doesn't like the configuration and it's exiting. There's no output from HTTPD in the log and you should see it starting up, like this.

    Ex:

    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'
    

    If you want to have PHP-FPM process your HTML files you need to make a couple changes.

    1.) In .bp-config/httpd/extra/httpd-php.conf, you need to either modify or append the <Directory "${HOME}/#{WEBDIR}"> block such that it sends .html files to PHP-FPM. If you don't, HTTPD is just going to serve them up or return a 404.

    Ex: which sends both .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.) You need to instruct PHP-FPM to process files with a .html extension. It does not by default because it is trying to prevent abuse through misconfiguration (i.e. prevents an attacker from evaluating a file with an unexpected extension).

    To do this, you need to add the file .bp-config/php/fpm.d/php-process-html.conf (the php-process-html part doesn't matter, but the name needs to end with .conf). Inside it, you need to put the following:

    [www]
    security.limit_extensions = .php .html
    

    This tells PHP-FPM to process both .php and .html files.

    Note: this requires at least v4.3.32 of the PHP build pack, which is pretty new as of me writing this. If you're on an older version of the build pack, it's still possible but you need to provide a full custom php-fpm.conf configuration file instead of just overriding this one property and that file would go in .bp-config/php/php-fpm.conf. Take one of the php-fpm.conf files from here and use it as a base to get started if you are stuck on an older build pack.