Debian Jessie 8: install and configure the latest version of Nginx and PHP 7 FPM

In this article, we will install the latest version of NGINX web server that will be associated with the new PHP7 FPM.

In the past, I was a Apache httpd addict and I have used it a lot every time that I'm looking for a web server.
But since I tried Nginx, I adopted it...Nginx is really fast, powerful and consumes fewer resources than Apache.

PHP 7.0 is a worthy successor to PHP5 (yes I know, PHP 6 was swept under the carpet in the middle).

This basic installation will be used later in the next articles to add the support for HTTPS and HTTP/2 protocols.


Add Dotdeb and Nginx repositories to your Debian config

We will install the latest versions of Nginx and PHP 7. Debian Jessie repository is not really up to date, so we will use:

  • the official repository of Nginx
  • Dotdeb repository for PHP 7.0

Start by opening sources.list used by apt-get.

sudo nano /etc/apt/sources.list

Then add the 2 following lines at the end of the file.

deb jessie all
deb jessie nginx

The packages of these 2 repositories are signed. So to use it, you have to download and install the encryption keys.

cd /tmp
sudo apt-key add dotdeb.gpg

sudo apt-key add nginx_signing.key

Finally, update the list of packages.

sudo apt-get update


Installation of Nginx and PHP 7.0 FPM

We install in one command Nginx and PHP 7.0 FPM including some very useful PHP modules. yes

sudo apt-get install nginx php7.0 php7.0-fpm php7.0-gd php7.0-mysql php7.0-cli php7.0-common php7.0-curl php7.0-opcache php7.0-json php7.0-imap

At the end of the installation, you can check the installed versions with the following commands:

sudo php -v
PHP 7.0.3-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
sudo nginx -v
nginx version: nginx/1.9.11

If you open your Internet browser at the IP address of your server, you will receive the Nginx default page.


Configuration of PHP 7.0 FPM

We will now configure PHP 7.0 FPM and Nginx to allow them to communicate together.

Let's open the PHP 7.0 FPM configuration file.

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

Check that this file contains the following configuration.
In summary, the communication mode is a UNIX socket (/run/php/php7.0-fpm.sock) and it is run by the www-data user and owned by the www-data group.

user = www-data
group = www-data
listen = /run/php/php7.0-fpm.sock
listen.owner = www-data = www-data

Let's open now the Nginx configuration file

sudo nano /etc/nginx/nginx.conf

Again, check that this file contains the following configuration.
There is a good chance that the default user was nginx, replace it by www-data​

user www-data;

Now we must explain to Nginx how to handle PHP files.
For this, open the default vHost configuration file.

sudo nano /etc/nginx/conf.d/default.conf

And add the following configuration

    # pass the PHP scripts to FastCGI server listening on /run/php/php7.0-fpm.sock
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   unix:/run/php/php7.0-fpm.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

To finish, restart PHP 7.0 FPM and Nginx services to enable the changes.

sudo systemctl restart php7.0-fpm
sudo systemctl restart nginx


Check that PHP is running

The location of the files published by the Nginx default vHost is /usr/share/nginx/html.
We move to that directory and we create a phpinfo.php file.

cd /usr/share/nginx/html
sudo nano phpinfo.php

Add the following code inside the phpinfo.php that we have just created.

<?php   phpinfo(); ?>

You can now open this phpinfo.php file in your browser to get PHP answer. smiley

If you want to go further in the configuration of Nginx and PHP FPM 7, you can read my next article.


Today, when I try to update my server with sudo apt-get update I got the following error

sudo apt-get update
Hit jessie InRelease
Ign jessie InRelease
Hit jessie/updates InRelease
Ign jessie InRelease
Get:1 jessie Release.gpg [287 B]
Hit jessie Release.gpg
Get:2 jessie Release [2,331 B]
Hit jessie Release
Get:3 jessie/all amd64 Packages [86.5 kB]
Err jessie Release

Hit jessie/updates/main amd64 Packages
Hit jessie/updates/main Translation-en
Ign jessie/all Translation-en_US
Ign jessie/all Translation-en
Hit jessie/main amd64 Packages
Hit jessie/main Translation-en
Fetched 89.1 kB in 1s (67.2 kB/s)
Reading package lists... Done
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: jessie Release: The following signatures were invalid: KEYEXPIRED 1471427554

W: Failed to fetch

W: Some index files failed to download. They have been ignored, or old ones used instead.

it looks than the NGINX key is no longer valid ... So I check with the sudo apt-key list command.

sudo apt-key list

pub   2048R/7BD9BF62 2011-08-19 [expired: 2016-08-17]
uid                  nginx signing key <>


The key has expired !!

So you have to reinstall it, like in the tutorial of this topic with the 3 following commands:

cd /tmp
sudo apt-key add nginx_signing.key

And that's it  smiley

Server update with sudo apt-get update works again.
And if you run it again sudo apt-key list , you will find that the expiration date is in the future...

thanks this tutorial helped me. 

Add new comment

You must have Javascript enabled to use this form.