Caution: You are browsing the legacy symfony 1.x part of this website.

Jour 22 : Le déploiement

1.4 / Propel
Symfony version
1.2
Language ORM

Hier, avec la configuration du système de cache, le site Jobeet est prêt à être déployé sur les serveurs de production.

Pendant vingt-deux jours, nous avons développé Jobeet sur une machine de développement, et pour la plupart d'entre vous, cela signifie probablement sur votre machine locale; sauf si vous développez sur le serveur de production directement, ce qui est évidemment une très mauvaise idée. Maintenant, il est temps de passer le site vers un serveur de production.

Aujourd'hui, nous allons voir ce qui doit être fait avant d'aller en production, quel genre de stratégies de déploiement pouvez vous utiliser, et aussi les outils dont vous avez besoin pour un déploiement réussi.

Préparation du serveur de production

Avant de déployer le projet en production, nous devons être sûr que le serveur de production est correctement configuré. Vous pouvez relire le jour 1, où nous avons expliqué comment configurer le serveur web.

Dans cette section, nous supposons que vous avez déjà installé le serveur web, le serveur de base de données et PHP 5.2.4 ou ultérieur.

note

Si vous ne disposez pas d'un accès SSH au serveur web, ignorez la partie où vous avez besoin d'avoir accès à la ligne de commande.

Configuration du serveur

D'abord, vous devez vérifier que PHP est installé avec toutes les extensions nécessaires et qu'il est correctement configuré. Comme pour le jour 1, nous allons utiliser le script fourni check_configuration.php avec symfony. Comme nous ne voulons pas installer symfony sur le serveur de production, téléchargez le fichier directement sur le site de symfony :

http://trac.symfony-project.org/browser/branches/1.4/data/bin/check_configuration.php?format=raw

Copiez le fichier dans le répertoire racine Web et exécutez-le depuis votre navigateur et en ligne de commande :

$ php check_configuration.php

Corrigez les erreurs fatales que le script trouve et répétez le processus jusqu'à ce que tout fonctionne bien dans les deux environnements.

Accelerateur PHP

Pour le serveur de production, vous voudrez probablement la meilleure performance possible. L'installation d'un accélérateur PHP vous donnera la meilleure amélioration possible.

note

Extrait de Wikipedia: Un accélérateur PHP fonctionne en mettant en cache le code compilé des scripts PHP pour éviter le surcoût de l'analyse et la compilation du code source sur chaque requête.

APC est l'un des plus populaire et il est assez simple à l'installer :

$ pecl install APC

En fonction de votre système d'exploitation, vous serez également capable de l'installer avec le gestionnaire de paquet natif de l'OS.

note

Prenez le temps d'apprendre à configurer APC.

Les bibliothèques de symfony

Intégration de symfony

Une des grandes forces de symfony est que le projet est auto-contenue. Tous les fichiers nécessaires pour que le projet fonctionne, sont sous le répertoire principal racine du projet. Et vous pouvez déplacer le projet dans un autre répertoire sans rien changer au projet lui-même car symfony n'utilise que des chemins relatifs. Cela signifie que le répertoire sur le serveur de production ne doit pas être le même que celui de votre machine de développement.

Le seul chemin absolu qui peut éventuellement être trouvé est dans le fichier config/ProjectConfiguration.class.php, mais nous avons pris soin de cela pendant la journée 1. Assurez-vous qu'elle contient en fait un chemin relatif vers le chargeur automatique du noyau de symfony :

// config/ProjectConfiguration.class.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

Mise à jour de symfony

Même si tout est auto-contenue dans un seul répertoire, la mise à niveau de symfony pour une version plus récente est pourtant incroyablement facile.

Vous souhaitez mettre à niveau symfony vers la dernière version mineure de temps en temps, comme nous corrigeons en permanence des bugs et éventuellement, les questions de sécurité. Les bonnes nouvelles sont que toutes les versions de symfony sont maintenues pendant au moins un an et pendant la période de maintenance, nous n'ajoutons jamais de nouvelles fonctionnalités, même les plus petites. Ainsi, il est toujours rapide, sûr et sécurisé pour passer d'une version mineure à une autre.

La mise à jour de symfony est aussi simple que de changer le contenu du répertoire lib/vendor/symfony/. Si vous avez installé symfony avec l'archive, supprimez les fichiers actuels et remplacez les par les plus récents.

Si vous utilisez Subversion pour votre projet, vous pouvez aussi lier votre projet au dernièr tag de symfony 1.4 :

$ svn propedit svn:externals lib/vendor/
  # symfony http://svn.symfony-project.com/tags/RELEASE_1_4_0/

La mise à jour de symfony est donc aussi simple que de changer le tag de la dernière version de symfony.

Vous pouvez également utiliser la branche 1.4 pour corriger en temps réel :

$ svn propedit svn:externals lib/vendor/
  # symfony http://svn.symfony-project.com/branches/1.4/

Maintenant, chaque fois que vous faites un svn up, vous avez la dernière version 1.4 de symfony.

Lors de la mise à jour d'une nouvelle version, il vous est conseillé de toujours vider le cache, en particulier dans l'environnement de production :

$ php symfony cc

tip

Si vous avez aussi un accès FTP au serveur de production, vous pouvez simuler un symfony cc simplement en enlevant tous les fichiers et répertoires sous le répertoire cache/.

Vous pouvez même tester une nouvelle version de symfony, sans remplacer l'existant. Si vous voulez juste tester une nouvelle version, et nous voulons être en mesure de restaurer facilement, installer symfony dans un autre répertoire (lib/vendor/symfony_test par exemple), changer le chemin dans la classe ProjectConfiguration, videz le cache et c'est fini . Le retour arrière est aussi simple que la suppression du répertoire et le changement du chemin dans ProjectConfiguration.

Peaufiner la configuration

Configuration de la base de données

La plupart du temps, la base de données de production a des droits différents de ceux en local. Grâce aux environnements de symfony, il est assez simple d'avoir une configuration différente pour la base de données de production :

$ php symfony configure:database "mysql:host=localhost;dbname=prod_dbname" prod_user prod_pass

Vous pouvez également modifier le fichier de configuration databases.yml directement.

Ressources

Comme Jobeet utilise des plugins qui intègrent des ressources, symfony crée des liens symboliques relatifs dans le répertoire web/. La tâche plugin:publish-assets les régénère ou les crée si vous installer des plugins sans la tâche plugin:install :

$ php symfony plugin:publish-assets

Personnalisation des Pages d'erreur

Avant d'aller en production, il est préférable de personnaliser les pages de symfony par défaut, comme la "Page introuvable" ou la page d'exceptions par défaut.

Nous avons déjà configuré la page d'erreur pour le format YAML pendant le jour 15, en créant les fichiers error.yaml.php et exception.yaml.php dans le répertoire config/error/. Le fichier error.yaml.php est utilisé dans l'environnement prod, alors que exception.yaml.php est utilisé dans l'environnement de dev.

Donc, pour personnaliser la page d'exception par défaut pour le format HTML, créez deux fichiers : config/error/error.html.php et config/error/exception.html.php.

La page 404 (page introuvable) peut être personnalisée en changeant les paramètres error_404_module et error_404_action :

# apps/frontend/config/settings.yml
all:
  .actions:
    error_404_module: default
    error_404_action: error404

Personnalisation de la structure de répertoire

Afin de mieux structurer et de normaliser votre code, symfony a une structure de répertoire par défaut avec des noms prédéfinis. Mais parfois, vous n'avez pas le choix, il faut changer la structure à cause de certaines contraintes extérieures.

La configuration des noms de répertoire peut être fait dans la classe config/ProjectConfiguration.class.php.

Le répertoire racine web

Chez certains hébergeurs, vous ne pouvez pas changer le nom du répertoire racine web. Disons que chez votre hébergeur, il est nommé public_html/ au lieu de web/ :

// config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->setWebDir($this->getRootDir().'/public_html');
  }
}

La méthode setWebDir()prend le chemin absolu du répertoire racine web. Si vous déplacez aussi ce répertoire ailleurs, n'oubliez pas de modifier les scripts du contrôleur pour vérifier que les chemins du fichier config/ProjectConfiguration.class.php sont toujours valables :

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

Les répertoires Cache et Log

Le framework Symfony écrit que dans deux répertoires: cache/ et log/. Pour des raisons de sécurité, certains hébergeurs n'acceptent pas les permissions en écriture dans le répertoire principal. Si tel est le cas, vous pouvez déplacer ces répertoires ailleurs sur le système de fichiers :

// config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->setCacheDir('/tmp/symfony_cache');
    $this->setLogDir('/tmp/symfony_logs');
  }
}

Comme pour la méthode setWebDir(), setCacheDir() et setLogDir() prennent un chemin absolu pour les répertoires respectifs cache/ et log/.

Personnalisation des objets du noyau de symfony (via les factories)

Pendant le jour 16, nous avons un peu parlé des factories de symfony. Être en mesure de personnaliser les factories, signifie que vous pouvez utiliser une classe personnalisée pour les objets du noyau de symfony à la place de celui par défaut. Vous pouvez également modifier le comportement par défaut de ces classes en changeant les paramètres qui leurs sont envoyés.

Jetons un oeil sur quelques personnalisations classisue que vous pouvez faire.

Nom du Cookie

Pour gérer la session utilisateur, symfony utilise un cookie. Ce cookie a un nom par défaut symfony, qui peut être changé dans factories.yml. Sous la clé all, ajoutez la configuration suivante pour changer le nom du cookie en jobeet :

# apps/frontend/config/factories.yml
storage:
  class: sfSessionStorage
  param:
    session_name: jobeet

Stockage de Session

La classe de session par défaut de stockage est sfSessionStorage. Ceci utilise le système de fichiers pour stocker les informations de session. Si vous avez plusieurs serveurs web, vous souhaitez stocker les sessions dans un endroit central, comme une table de base de données :

# apps/frontend/config/factories.yml
storage:
  class: sfPDOSessionStorage
  param:
    session_name: jobeet
    db_table:     session
    database:     propel
    db_id_col:    id
    db_data_col:  data
    db_time_col:  time

Timeout d'une session

Par défaut, le timeout d'une session utilisateur est 1800 secondes. Ceci peut être modifié en éditant l'entrée user :

# apps/frontend/config/factories.yml
user:
  class: myUser
  param:
    timeout: 1800

Journalisation

Par défaut, il n'y a pas de journalisation dans l'environnement prod parce que le nom de la classe du journal est sfNoLogger :

# apps/frontend/config/factories.yml
prod:
  logger:
    class:   sfNoLogger
    param:
      level:   err
      loggers: ~

Vous pouvez par exemple activer la journalisation du système de fichiers en changeant le nom de la classe ddu journal en sfFileLogger :

# apps/frontend/config/factories.yml
logger:
  class: sfFileLogger
  param:
    level:   err
    loggers: ~
    file:    %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log

note

Dans le fichier de configuration factories.yml, les chaines %XXX% sont remplacées par leurs valeurs correspondantes depuis l'objet sfConfig. Ainsi, %SF_APP% dans un fichier de configuration est équivalent à sfConfig::get('sf_app') dans du code PHP. Cette notation peut aussi être utilisé dans le fichier de configuration app.yml. Il est très utile lorsque vous avez besoin de faire référence à un chemin dans un fichier de configuration sans coder en dur le chemin (SF_ROOT_DIR, SF_WEB_DIR, ...).

Déploiement

Ce qu'il faut déployer?

Lors du déploiement du site Jobeet vers le serveur de production, nous devons veiller à ne pas déployer les fichiers inutiles ou remplacer les fichiers téléchargés par nos utilisateurs, comme les logos d'entreprise.

Dans un projet symfony, il existe trois répertoires à exclure du transfert : cache/, log/ et web/uploads/. Tout le reste peut être transférée tel quel.

Pour des raisons de sécurité, vous pouvez aussi ne pas vouloir transférer les contrôleurs frontaux de «non-production» , comme les scripts frontend_dev.php, backend_dev.php et frontend_cache.php.

Stratégies de déploiement

Dans cette section, nous supposerons que vous avez le contrôle total sur le(s) serveur(s) de production. Si vous ne pouvez accéder au serveur avec un compte FTP, la seule solution de déploiement possible est de transférer tous les fichiers chaque fois que vous déployez.

Le plus simple pour déployer votre site web est d'utiliser la tâche intégrée project:deploy. Elle utilise SSH et rsync pour connecter et transférer les fichiers d'un ordinateur à un autre.

Les serveurs pour la tâche project:deploy peuvent être configurés dans le fichier de configuration config/properties.ini :

# config/properties.ini
[production]
  host=www.jobeet.org
  port=22
  user=jobeet
  dir=/var/www/jobeet/

Pour déployer sur le serveur nouvellement configuré de production, utilisez la tâche project:deploy :

$ php symfony project:deploy production

note

Avant de lancer la tâche project:deploy pour la première fois, vous devez vous connecter manuellement au serveur pour ajouter la clé dans le fichier des host connus.

tip

Si la commande ne fonctionne pas comme prévue, vous pouvez passer l'option -t pour voir l'affichage en temps réel de la commande rsync.

Si vous exécutez cette commande, symfony va seulement simuler le transfert. Pour déployer réellement le site, ajoutez l'option --go :

$ php symfony project:deploy production --go

note

Même si vous pouvez fournir le mot de passe SSH dans le fichier properties.ini, il est préférable de configurer votre serveur avec une clé SSH pour allouer un mot de pass de connexion.

Par défaut, symfony ne va pas transférer les répertoires dont nous avons parlé dans la section précédente, ni le script du contrôleur frontal du dev. Car la tâche project:deploy exclut des fichiers et des répertoires configurés dans le fichier config/rsync_exclude.txt :

# config/rsync_exclude.txt
.svn
/web/uploads/*
/cache/*
/log/*
/web/*_dev.php

Pour Jobeet, nous devons ajouter le fichier frontend_cache.php :

# config/rsync_exclude.txt
.svn
/web/uploads/*
/cache/*
/log/*
/web/*_dev.php
/web/frontend_cache.php

tip

Vous pouvez également créer un fichier config/rsync_include.txt pour forcer certains fichiers ou répertoires d'être transférés.

Même si la tâche project:deploy est très flexible, vous pouvez encore plus la personnaliser. Comme le déploiement peut être très différent en fonction de votre configuration de serveur et de topologie, n'hésitez pas à étendre la tâche par défaut.

Chaque fois que vous déployez un site web pour la production, n'oubliez pas au moins de vider le cache de configuration sur le serveur de production :

$ php symfony cc --type=config

Si vous avez modifié certaines routes, vous aurez également besoin de vider le cache de routage :

$ php symfony cc --type=routing

note

Vider le cache de manière sélective permet de conserver certaines parties du cache, tels que le cache de template.

À demain

Le déploiement d'un projet est la dernière étape du cycle de vie de développement de symfony. Cela ne signifie pas que vous avez terminé. C'est en fait tout le contraire. Un site web est quelque chose qui a une vie. Vous aurez probablement à corriger les bugs et vous aurez également à ajouter de nouvelles fonctionnalités au fil du temps. Mais grâce à la structure de symfony et les outils à votre disposition, mettre à niveau votre site est simple, rapide et sécurisé.

Demain, c'est le dernier jour du tutoriel Jobeet. Il sera temps de prendre un peu de recul et jetez un œil à ce que vous avez appris au cours des vingt-trois jours de Jobeet.