illustration

Installer une application Symfony 3 sur un serveur de test

Vous avez une application sur Symfony 3 et vous souhaitez la mettre en test ? Dans cet article, nous allons installer un serveur sous Debian 8 ( Jessie ) avec PHP7 et Nginx. Pour déployer notre application nous utiliserons l'outil php "deployer". A vos claviers !

Lorsque vous souhaitez tester des nouveaux outils, ou mettre en place de nouvelles configurations, je vous conseille de réaliser cela sur un serveur temporaire et prendre note de vos actions.

Pour ma part, j'ai opté pour les offres Public Cloud d'OVH. Cela vous permet de démarrer un serveur virtuel rapidement et être facturé à l'heure ( le moins cher est pour le moment à 0,008€ HT / heure ). C'est idéal lorsque je souhaite tester une configuration sur la journée. Assez de publicité pour eux et passons aux choses sérieuses !

Je vais nommer mon projet "projet"... pas très original, je n'étais pas inspiré !
Choisissez le DNS que vous utiliserez pour votre test. Afin de garder de la cohérence, j'ai opté pour projet.kezaweb.fr. Faites pointer votre DNS sur votre serveur.

Connectez-vous à votre serveur fraichement installé, et commencez par mettre à jour les dépôts

sudo apt-get update

Nous allons installer PHP 7.1 qui n'est pas présent dans les dépôts officiels pour Debian 8. Créez le fichier /etc/apt/sources.list.d/php.list et ajoutez-y la ligne suivante :

deb https://packages.sury.org/php jessie main

Ensuite, mettez à jour votre gestionnaire de paquets puis installez PHP7.1 ainsi que Nginx, Git, Mysql et Curl.

sudo apt-get install apt-transport-https lsb-release ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo apt-get update
sudo apt-get install --no-install-recommends php7.1 php7.1-fpm php7.1-mysql php7.1-curl php7.1-json php7.1-gd php7.1-mcrypt php7.1-msgpack php7.1-memcached php7.1-intl php7.1-sqlite3 php7.1-gmp php7.1-geoip php7.1-mbstring php7.1-redis php7.1-xml php7.1-zip
sudo apt-get install mysql-server mysql-client nginx git curl

Parfait ! Nous avons tout installé pour que Symfony 3 puisse fonctionner. Nous allons maintenant créer un utilisateur pour notre projet Symfony. Je ne suis pas inspiré, alors je l'ai appelé "projet"

sudo adduser projet

On va maintenant définir un pool php fpm qui utilisera cet utilisateur. ( Si vous mettez plusieurs applications sur votre serveur, cela vous permettra facilement de les distinguer les unes des autres ).

debian@test:/etc/php/7.1/fpm/pool.d$ sudo cp www.conf projet.conf

Dans ce nouveau fichier projet.conf, changez le nom du pool par "projet", l'utilisateur par "projet" ainsi que l'adresse du socket : /var/run/php/php7.1-fpm-projet.sock. Un fois cela fait, redémarrez php-fpm via la commande suivante : 

sudo service php7.1-fpm restart

Afin de confirmer que tout s'est passé comme prévu, rendez-vous à l'endroit où doivent être générés les fichiers.

debian@test:/var/run/php$ ls
php7.1-fpm-projet.sock  php7.1-fpm.pid  php7.1-fpm.sock

J'utilise une base de donnée pour mon projet Symfony. C'est du test, alors je ne vais pas créer d'utilisateur spécifique sur mysql. L'utilisateur root fera l'affaire.

debian@test:~$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 226
Server version: 5.5.55-0+deb8u1 (Debian)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database projet;
Query OK, 1 row affected (0.00 sec)

Préparons le terrain pour nginx. 

debian@test:~$ sudo mkdir -p /var/www/projet.kezaweb.fr/shared/app/config
debian@test:~$ sudo chown -R projet:www-data /var/www/projet.kezaweb.fr

Dans app/config, placez-y le fichier parameters.yml avec les données correspondant à votre serveur. ( notamment les accès à la base de données ).
Il est temps de mettre en place votre vhost. Nous allons créer un nouveau fichier et le placer dans /etc/nginx/sites-available/projet.kezaweb.fr 

server {
        listen 80;
        server_name projet.kezaweb.fr;
        root /var/www/projet.kezaweb.fr/current/web;

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

        # PROD
        location ~ ^/app\.php(/|$) {
            fastcgi_pass unix:/var/run/php/php7.1-fpm-projet.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;
        }

        # 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;
        }

}

Faites un lien symbolique de ce fichier dans /etc/nginx/sites-enabled/ puis testez votre nouvelle configuration nginx à tapant la commande suivante :

debian@test:~$ sudo nginx -t

Si la réponse est positive, c'est parfait !
Pour la denière étape, l'utilisation de deployerPHP, je suis parti du principe que vous historisez bien votre code sur un serveur accessible depuis notre nouveau serveur de test. Pour intaller deployer, plusieurs méthodes sont disponibles. Pour ma part, j'ai choisi de l'intégrer à mon projet via composer.
Avant d'aller plus loin, il faut que vous vous assuriez que vous avez bien une passerelle ssh entre votre machine et projet@serveurdetest. Si c'est pas le cas, mettez en un. Il faut également que votre projet git puisse être cloner depuis le compte de l'utilisateur projet sans demander de mot de passe. Une fois que vous avez fini de jouer avec vos clés ssh, nous pouvons mettre en place la cerise sur le gateau.

Définissez le fichier suivant à la racine de votre projet symfony

<?php
namespace Deployer;
require 'recipe/symfony3.php';

// Configuration

set('ssh_type', 'native');
set('ssh_multiplexing', true);

set('repository', 'git@bitbucket.org:kezaweb/projet.git');

add('shared_files', []);
add('shared_dirs', ['web/uploads']);

add('writable_dirs', ['web/uploads']);

// Servers
set('default_stage', 'test');


server('test', 'projet.kezaweb.fr')
    ->user('projet')
    ->identityFile()
    ->set('deploy_path', '/var/www/projet.kezaweb.fr')
    ->stage('test')
    ->set('branch', 'master')
    ->pty(true);
// Tasks

after('deploy:symlink', 'deploy:create_cache_dir');

// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');

// Migrate database before symlink new release.
before('deploy:symlink', 'database:migrate');

Remarrer nginx sur le serveur distant. Puis, sur votre projet, executez la commande ./dep deploy... Tout simplement !

Et normalement, ça devrait bien se passer :)