Build and compile PHP from source on Debian with Nginx and MongoDB

Building PHP from source

Building PHP from source includes 3 main steps:

  • ./configure - this step creates so called Makefiles required to compile PHP source code based on the given configure options (--with-foo, --enable-bar, etc).
  • make - this step starts the actual compilation of the C files.
  • make install - this step copies built files to system folders.

To build PHP from source code you will need the following prerequisites first:

  • autoconf
  • gcc
  • g++
  • make
  • rc2

First let's get the PHP sources. You have multiple options here. You can download prepaired archive from the php.net downloads section or you can download source code from the Git repository. Difference between the two options is that the prepared downloads come with the configure script.

PHP from the Git repository requires to create a configure script before proceeding. In the root folder there is a buildconf script which does that:

./buildconf

After that you can start with configuring your build with the configure script.

cd /usr/src/php
./configure
make
make install

See also

Install nginx

sudo apt-get install nginx

To successfully run PHP using Nginx, you should use the PHP FPM SAPI.

sudo apt-get install php7.2-fpm

Configure Nginx

# /etc/nginx/conf.d/default.conf
server {
    server_name example.com;
    root /var/www/app/public;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        # When you are using symlinks to link the document root to the
        # current version of your application, you should pass the real
        # application path instead of the path to the symlink to PHP
        # FPM.
        # Otherwise, PHP's OPcache may not properly detect changes to
        # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # for more information).
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/index.php/some-path
        # Remove the internal directive to allow URIs like this
        #internal;
    }

    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }
}

Intall MongoDB

Development on localhost using built-in web server

If you're developing PHP applications on your local workstation, PHP also has a useful built-in web server for localhost development. It is not intended to be used for production environments.

Inside your project folder you can run it from the command line using PHP CLI SAPI:

php -S localhost:8000

Visit http://localhost:8000/ in your browser to access it.