On travail ici sur un serveur vierge, sous debian 8 (jessie).

On commence donc par faire une actualisation des dépots distants.

sudo apt update

Installation de nginx

nginx est inclut par défaut dans les dépôts Debian, on exécute alors

sudo apt install nginx

Installation de PHP

Depuis la version 8 de debian, php n'est plus disponible par défaut dans les dépôts. Il faut les ajouter à la main. Afin de ne pas installer n'importe quoi (les dépôts et version de PHP par défaut changeant régulièrement), il est conseillé de consulter la documentation officielle afin d'avoir le dépôt correct.

Ici, nous allons utiliser le dépôt DotDeb, la configuration détaillée est disponible ici

C'est partie, on commence par ajouter la ligne suivante au fichier /etc/apt/sources.list :

deb http://packages.dotdeb.org jessie all

On update

sudo apt update

On utilise Nginx, celui-ci ne possède pas de modèle pré-configurer pour PHP, comme peu l'avoir Apache. On doit donc installer php en Fast-CGI. Pour cela installons les dépendances suivantes :

sudo apt install php7.0 php7.0-fpm

NOTE : En janvier 2017, le paquet php7.0 correspondait à la version la plus stable et la plus récente de PHP

Configuration de Nginx

Un peu de culture : Sous Apache, la relation entre PHP et Apache se fait grâce à un sous programme nommé "mod_php", celui-ci permet a Apache d’interpréter directement le code PHP. Nginx ne possède pas ce sous-programme, il va alors devoir envoyer la requête à PHP via son interface Fast-CGI, qui va l'interpréter lui-même et renvoyer le résultat à Nginx, puis à l'utilisateur. Nous devons donc configurer Nginx afin qu'il sache comment communiquer avec PHP.

Commençons par creer notre server-block, pour les familier d'Apache, unserver-block est l'équivalent d'un VirtualHost. Comme je cherche ici à installer le site de la télévision, je créer le fichier

sudo vim /etc/nginx/sites-available/TVonResEl

voici la configuration la plus simple d'un server block :

http {
  index index.html;

  server {
    listen 80 default_server;
    server_name _; # This is just an invalid value which will never trigger on a real hostname.
    access_log logs/default.access.log main;

    server_name_in_redirect off;

    root  /var/www/default/htdocs;
  }
}

Pour plus d'infos, voir ici

Comme j'utilise le framework Symfony, je vais utiliser le modèle donné sur la documentation officielle :

server {
    server_name tv.resel.fr;
    root /var/www/html/TVonResEl;

    location / {
        try_files $uri /app.php$is_args$args;
    }

    location ~ ^/app\.php(/|$) {
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        internal;
    }

    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/TVonResEl_error.log;
    access_log /var/log/nginx/TVonResEl_access.log;
}

Dans tous les cas, la configuration du fast-cgi ce fera grâce aux lignes suivantes, disposées dans un block "location"

fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffers 4 256k;
fastcgi_buffer_size 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;

NOTE : Ceci est un exemple

La ligne fastcgi_pass unix:/run/php/php7.0-fpm.sock; étant à modifier suivant votre version de PHP (typiquement fastcgi_pass unix:/var/run/php5-fpm.sock; pour PHP5)

Activation du site

Pour activer le site, il faut créer un lien symbolique vers sites-enabled :

sudo ln -s /etc/nginx/sites-available/TVonResEl /etc/nginx/sites-enabled/TVonResEl

Puis on relance nginx

sudo service nginx restart

Si aucune erreur ne se produit, votre configuration est terminée !

Dans le cas contraire, vous aurez une erreur de ce type : Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.

Tapez journalctl -xn pour voir la ligne posant problème.