Heroku Procfile not working

Pablo picture Pablo · Apr 7, 2015 · Viewed 10k times · Source

I'm trying use Nginx + Phalcon. So I have the root folder (app) and my public folder (app/public).

Inside the root (app) I have the Procfile:

web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/

And inside my public folder I have my index.php

<?php exit('hello');

With this simple example, shouldn't print hello when I access the url myapp.herokuapp.com?

If my thought is right, which is not working. My second problem is that the nginx_app.conf seems that are not been reading by the server. Because every f* page that I tried access I got 404.

So, what am I doing wrong?

[UPDATED]

Here's the log:

heroku[web.1]: State changed from down to starting
heroku[web.1]: Starting process with command `php -S 0.0.0.0:57262`
heroku[web.1]: State changed from starting to up
app[web.1]: [Tue Apr  7 11:08:07 2015] 10.185.81.31:28258 Invalid request (Unexpected EOF)
app[web.1]: [Tue Apr  7 11:08:07 2015] 172.19.28.141:33686 Invalid request (Unexpected EOF)
heroku[router]: at=info method=GET path="/" host=myapp.herokuapp.com request_id=d39f119a-fd95-4887-809f-74712925606f fwd="200.221.158.131" dyno=web.1 connect=2ms service=4ms status=404 bytes=668
app[web.1]: [Tue Apr  7 11:08:44 2015] 10.61.196.230:38679 [404]: / - No such file or directory

[UPDATED]

$ git push ...
[...]
remote: -----> Discovering process types
remote:        Procfile declares types -> web

$ heroku run bash
$ cat Procfile
~ $ : vendor/bin/heroku-php-nginx public/~ $

And according the documentation should be

heroku run bash
Running `bash` attached to terminal... up, run.5662
$ cat Procfile
web: vendor/bin/heroku-php-apache2

A little detail that I have tried:

cat Procfile
~ $ vendor/bin/heroku-php-nginx public/c/~ $
vendor/bin/heroku-php-nginx public/
DOCUMENT_ROOT changed to 'public/'
Optimzing defaults for 1X dyno...
4 processes at 128MB memory limit.
Starting php-fpm...
Starting nginx...

I'm waiting... let's see what happens

Answer

dzuelke picture dzuelke · Apr 7, 2015

Something is wrong with your Procfile; as you can see, Heroku is booting in the default php -S mode. This happens when a Procfile is present, but no "web" process type is declared; this should also be written out in a message towards the very end of a git push heroku master (something about the Procfile not declaring a "web" process type and it then using a default).

That rules out your Procfile not being checked into Git or having the wrong name (e.g. lowercase procfile).

The culprit is very, very likely a Unicode Byte Order Mark that the editor you're using is inserting at the beginning of the file: https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8

So your Procfile doesn't look like this:

web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/

but actually like this:

\0xEF\0xBB\0xBFweb: vendor/bin/heroku-php-nginx -C nginx_app.conf public/

Your editor (and most editors for that matter) simply don't display the BOM.

To fix the issue, save your Procfile without a BOM (and, while your at it, configure your editor to never save a UTF-8 BOM, because its use is highly discouraged and causes myriads of problems just like this one).