En tant qu'application PHP, WordPress est généralement déployé selon une méthode très ancienne: le téléchargement de fichiers via FTP..
Nous disposons de quelques outils de déploiement, mais ils nécessitent souvent un certain type de compétences Ruby. Par exemple, Capistrano est un outil puissant et populaire, mais il est également très lourd avec de nombreuses fonctionnalités liées à Ruby / Rails. Je pense également que l'installation de Capistrano pour un développeur PHP sans aucune connaissance de Ruby est un peu délicate..
Alors, quelles options avons-nous en tant que développeurs WordPress?
Dans ce tutoriel, je vais vous présenter Mina: un petit outil léger destiné au déploiement rapide et à l’automatisation du serveur..
Le déploiement automatisé nous évite de répéter des tâches chaque fois que nous commençons à déployer notre projet WordPress. Cela aide également à minimiser les temps d'arrêt pendant le déploiement et à éliminer les erreurs humaines telles que les fichiers manquants, le téléchargement de mauvais fichiers, etc..
Ce processus d'automatisation peut être partagé entre plusieurs développeurs de l'équipe, créant ainsi une méthode unique de déploiement dans toute l'équipe. Une entreprise a failli faire faillite en raison de son manque de processus de déploiement. Une méthode de déploiement automatisé est généralement liée à un système de contrôle de code source: Git, SVN, Mercurial, etc..
Dans le cadre de ce didacticiel, nous allons examiner Git. Si vous avez un référentiel Git, n'hésitez pas à l'utiliser. sinon, prenez-en un gratuitement chez BitBucket ou GitLab. Ces services vous permettent de créer des référentiels Git privés..
Avant d'aller plus loin, assurons-nous que nous répondons aux exigences:
[note] Je suppose que vous utilisez WordPress sur Apache avec PHP en tant que module Apache PHP. Si vous utilisez PHP avec FPM ou CGI, veuillez faire preuve de souplesse lorsque nous parlons de notre serveur Web ou de notre processus PHP. [/Remarque]
L'idée générale est que lorsque nous appuierons sur le serveur, Git invoquera une URL pouvant faire référence à un script PHP pour effectuer le déploiement en extrayant ou en fusionnant le code le plus récent depuis le référentiel..
Bien que cela fonctionne parfaitement et qu'il soit très utile, il expose un trou: nous avons ouvert une porte secrète sur le serveur. Si quelqu'un connaît cette URL, il peut déclencher un déploiement manuellement. Un autre danger est que nous devons créer des fonctionnalités de nettoyage, de restauration, de verrouillage (pour s’assurer qu’un seul processus de déploiement est en cours d’exécution), etc..
Si nous commençons à coder ces fonctionnalités, nous réinventons la roue, alors pourquoi ne pas utiliser un outil existant?
Mina est un outil de déploiement visant à être très rapide; Vous serez surpris de la rapidité avec laquelle vous essayez. Selon le site Web de Mina:
Outil de déploiement et d’automatisation de serveur très rapide. Vraiment sanglant.
En termes simples, voici comment penser à Mina: Au lieu de vous connecter au serveur et de taper une séquence de commandes à déployer. Mina générer un script shell qui est un ensemble de ces commandes.
Mina télécharge ce script shell sur le serveur et l'exécute. Ce processus de génération est exécuté sur votre ordinateur local.
Toutes les tâches de Mina ne sont qu'une séquence de commandes shell. Parce que ce ne sont que des commandes shell, vous n’avez pas accès à la fantastique aide Ruby comme dans Capistrano ou Vlad.
Une autre façon de penser à Mina est la suivante: Mina organise vos commandes de shell que vous devez exécuter sur une machine distante en blocs de code (appelés tâches Mina)..
Mina nécessite une structure de répertoire pour votre site Web. Vous devrez changer le répertoire public de votre serveur Web. Pour simplifier les choses, supposons que la structure de répertoires de votre serveur actuel soit la suivante:.
/var/www/yourdomain.com/ # Répertoire public où se trouve votre WordPress | - index.php | - wp-admin | - wp-content | - wp-includes | - wp-login.php | - wp-activate. php | -… .
yourdomain.com pointe vers /var/www/votredomaine.com/
, et index.php
Le fichier, qui se trouve dans ce répertoire, est exécuté et répond à votre demande. Avec Mina, vous devez modifier un peu la disposition des répertoires.
Mina attend cette structure:
/var/www/votredomaine.com/ # chemin_déploiement de | | releases / # Maintient les releases, un sous-répertoire par release | | - 1 / # Chacun des déploiements WordPress est assis ici | | - 2 / # Chacun des déploiements WordPress est assis ici | | - 3 / # Chacun des déploiements WordPress est assis ici | | -… | - shared / # Contient les fichiers partagés entre les versions: tels que le fichier journal, la configuration,… | | - logs / # Les fichiers journaux sont généralement stockés ici | -… | - current / # Un lien symbolique vers la version actuelle des versions, ce sera un nouveau dossier public
Mina ajoute trois répertoires:
les libérations
: chaque déploiement sera stocké dans des répertoires distincts à l'intérieur de ce dossier, ce qui nous permet de conserver les versions 1, 2, 3, etc..partagé
: contient des fichiers / dossiers communs partagés entre plusieurs déploiements. Un exemple est wp-content / uploads
. A chaque déploiement, nous aurons un nouveau répertoire wp-content / uploads
qui est différent de précédent wp-content / uploads
annuaire. Et le contenu à l'intérieur est parti. Par conséquent, nous allons utiliser un répertoire commun: shared / wp-content / uploads
. Nous aurons: /var/www/votredomaine.com/releases/7/wp-contents/uploads
est un lien symbolique vers /var/www/votredomaine.com/shared/wp-content/uploads
.actuel
: pointe vers la version actuelle. Exemple: /var/www/votredomaine.com/current
pointe vers /var/www/votredomaine.com/releases/7.
Selon Wikipedia:
Un lien symbolique (également un lien symbolique ou un lien symbolique) est un type spécial de fichier qui contient une référence à un autre fichier ou répertoire sous la forme d'un chemin absolu ou relatif et qui affecte la résolution du chemin d'accès. Les liaisons symboliques étaient déjà présentes en 1978 dans les systèmes d'exploitation pour mini-ordinateurs de RDOS et RDOS de Data General. Aujourd'hui, ils sont pris en charge par le système d'exploitation POSIX, la plupart des systèmes d'exploitation de type Unix tels que FreeBSD, GNU / Linux et Mac OS X, ainsi que des systèmes d'exploitation Windows tels que Windows Vista, Windows 7 et, dans une certaine mesure, Windows 2000. et Windows XP sous forme de fichiers de raccourci.
Votredomaine.com
doit maintenant pointer vers /var/www/votredomaine.com/current
au lieu de /var/www/votredomaine.com
. Le serveur Web exécutera le fichier /var/www/votredomaine.com/current/index.php
quand vous visitez http://votredomaine.com
. Nous devons reconfigurer le serveur Web (Apache, Nginx) pour pointer docroot
(ou annuaire public
) pour ça actuel
annuaire.
Ouvrez votre /etc/httpd/conf/httpd.conf
, trouvez le DocumentRoot
ligne et le changer en.
DocumentRoot /var/www/yourdomain.com/current
Modifier votre /etc/nginx/nginx.conf
et mettre à jour votre racine
définition.
serveur nom_serveur log.axcoto.com www.log.axcoto.com; root /srv/http/domain/log.axcoto.com/current/; #…
Mina est un joyau Ruby, vous devez donc installer Ruby. L'installation est assez simple. Si vous utilisez OS X ou Linux, Ruby est probablement déjà installé. sinon, vous pouvez suivre ces tutoriels pour installer Ruby:
Une fois que vous avez Ruby, installez gem. Il suffit de courir:
$ gem installer mina
Confirmez que Mina fonctionne correctement.
$ mina -V
Vous devriez voir quelque chose de similaire.
Mina, version v0.3.0
L'une des choses qui rendent les applications PHP moins sécurisées est la définition d'autorisations incorrectes..
Prenons WordPress pour un exemple: je peux télécharger un plugin ou télécharger un thème pour l'essayer. Pour ce faire, je les télécharge dans un tableau de bord WordPress. Si l'un des administrateurs du site ou moi-même perdons le mot de passe de l'administrateur, quelqu'un entre et peut télécharger un fichier PHP et l'exécuter sous forme de plug-in, et non seulement pirater mon site, mais également l'ensemble de mon serveur..
Exemple: ils peuvent lire un fichier dans / etc, apprendre la configuration du serveur, puis commencer à exécuter des commandes shell via PHP..
Je pense que nous devrions traiter une instance WordPress comme une installation en lecture seule. Pour l’installation de thèmes et de plugins, nous pouvons installer via l’ajout de fichiers localement, puis le redéployer via Mina. Le déploiement avec Mina est économique et très rapide. Sur mon serveur 512 Mo de RAM DigitalOcean, le déploiement prend moins de 30 secondes..
Pour les contenus téléchargés par l'utilisateur (tels que les images et les fichiers audio), nous allons les lier de manière symétrique à l'extérieur du répertoire du code source, et il sera préférable de configurer le serveur pour empêcher l'exécution de tout fichier PHP dans le dossier de contenu téléchargé par l'utilisateur, mais c'est hors de portée de ce tutoriel.
Pour le moment, nous allons essayer d'utiliser Mina pour un déploiement rapide et l'ajout d'un thème ou d'un plugin. Nous le ferons localement afin d'éviter d'autoriser le serveur Web à écrire dans ces répertoires..
Comme indiqué au début du didacticiel, vous devez disposer d’un référentiel Git pour votre site WordPress. Récapitulons ce dont nous avons besoin ici:
Supposons que…
Si vous n'êtes pas familier avec Git, veuillez lire les tutoriels suivants:
Si votre code source WordPress n'est pas un référentiel Git, faisons-le maintenant. sinon, passez à l'étape suivante.
$ cd ~ / Site / wordpress $ git init $ git remote add origine [email protected]: kureikain / wordpress.git $ git add. $ git push origine master
Exécuter la commande ci-dessous pour commencer à configurer Mina pour votre projet.
$ mina init
Cela va vous créer un dossier config
avec un seul fichier deploy.rb à l'intérieur.
$ ls config wp-blog-header.php wp-load.php index.php wp-comments-post.php wp-login.php latest.tar.gz wp-config-sample.php wp-mail.php license.txt wp-content wp-settings.php readme.html wp-cron.php wp-signup.php wp-active.php wp-comprend wp-trackback.php wp-admin wp-links-opml.php xmlrpc.php $ ls config deploy.rb
Maintenant, ouvrez config / deploy.rb à l’étape précédente et définissons une configuration..
Ce fichier deploy.rb contient la configuration de déploiement et un ensemble de tâches Mina. Chaque tâche est emballée à l'intérieur tâche: nom de la tâche
bloc. Dans chaque tâche, nous pouvons invoquer une autre tâche avec invoquer
Pour exécuter une commande sur le serveur, vous le spécifiez avec queue
commander.
Par exemple, une tâche peut ressembler à ceci:
tâche: bas invoquer: maintenance_on invoquer: redémarrer la file d'attente 'rm -rf / tmp / cache' end
Dans cet esprit, commençons à éditer ce fichier deploy.rb.
Commentez ces lignes car nous ne les utiliserons pas.
#require 'mina / bundler' #require 'mina / rails'
Le code par défaut ressemble à ceci
set: utilisateur, 'username' set: domaine, 'foobar.com' set: deploy_to, '/var/www/foobar.com' set: référentiel, 'git: //…' set: branch, 'master'
domaine
est domain au nom de domaine de votre site WordPress.deploy_to
est l'endroit où vous voulez localiser votre projet WordPress.dépôt
est l'adresse de votre référentiel Git.branche
votre branche de déploiement. Git supporte de nombreuses branches, et quelques-uns veulent avoir un déployer
branche à des fins de déploiement.Mettons-le à jour avec la configuration de notre serveur:
set: domaine, 'votredomaine.com' set: deploy_to, '/var/www/yourdomain.com' set: référentiel, 'https: //[email protected]/kureikain/wordpress.git' set: branche, 'maître 'set: utilisateur,' votre_nom_utilisateur '# Nom d'utilisateur sur le serveur sur SSH pour.
Assurez-vous que vous pouvez atteindre le dépôt
sur votre machine distante.
Ensuite, nous allons gérer le wp-content / uploads
dossier. Ce dossier contient le contenu téléchargé par l'utilisateur. Chaque fois que nous déployons, ce sera un dossier différent de celui que nous utilisons actuellement, car le code récemment déployé se trouve dans un autre dossier à l'intérieur. les libérations
.
Si nous conservons ce nouveau dossier, nous perdrons tout l'ancien contenu. En tant que tel, nous devons utiliser un lien symbolique pour le pointer ailleurs. Une fois déployé, nous le mettrons à jour pour qu'il en corrige un.
Trouvez cette ligne:
set: chemins_partagés, ['config / database.yml', 'log']
Et changez le en:
set: chemins_partagés, ['wp-content / uploads']
chemins_partagés
est un ensemble de ressources communes (fichier / dossier) entre les différentes versions et peut être différent d’une version à l’autre. Comme les fichiers journaux, le contenu téléchargé par l'utilisateur doit être placé dans shared_paths. Si nous ne le faisons pas, nous perdrons les données à chaque nouvelle version..
Par exemple: lorsqu'un utilisateur télécharge un fichier, WordPress le stocke dans /var/www/votredomaine.com/current/wp-content/upload/2014/01/29/picture.png
. Mais /var/www/votredomaine.com/current
est un lien symbolique vers /var/www/votredomaine.com/releases/4/
qui est notre version actuelle. Par conséquent, le fichier actuel se trouve à l'adresse suivante: /var/www/votredomaine.com/releases/4/wp-content/upload/2014/01/29/picture.png
.
Maintenant, si vous avez fait une nouvelle version, actuel
pointera vers /var/www/votredomaine.com/releases/5
. Le fichier /var/www/votredomaine.com/current/wp-content/upload/2014/01/29/picture.png
n'est plus là, car /var/www/votredomaine.com/releases/5/wp-content/uploads
est un nouveau dossier, sans contenu.
En tant que tel, nous devons le mettre dans shared_paths, et Mina créera un lien symbolique pour pointer /www/votredomaine.com/releases/5/wp-content/uploads
à /www/votredomaine.com/shared/wp-content/uploads.
C'est la tâche que nous exécutons pour la première fois afin de préparer notre environnement de serveur. Celui par défaut ressemble à ceci:
tâche: configuration =>: environnement ne file d'attente! % [mkdir -p "# deploy_to / shared / log"] file d'attente! % [chmod g + rx, u + rwx "# deploy_to / shared / log"] file d'attente! % [mkdir -p "# deploy_to / shared / config"] file d'attente! % [chmod g + rx, u + rwx "# deploy_to / shared / config"] file d'attente! % [touch "# deploy_to /shared/config/database.yml"] file d'attente% [echo "-----> Assurez-vous de bien éditer 'shared / config / database.yml'."] end
Changeons cela en:
tâche: configuration =>: environnement ne file d'attente! % [mkdir -p "# deploy_to / shared / wp-content / uploads"] end
Notre tâche de configuration crée simplement un wp-content / uploads
annuaire.
La tâche par défaut ressemble à ceci.
task: deploy =>: environment do deploy do # Placez les éléments qui vont configurer un répertoire vide dans une instance # de configuration complète de votre projet. invoke: 'git: clone' invoke: 'deploy: link_shared_paths' invoke: 'bundle: install' invoke: 'rails: db_migrate' invoke: 'rails: assets_precompile' pour: lancer la file d'attente "touch # deploy_to / tmp / restart .txt "fin fin fin
Nous n'avons besoin de rien qui a à voir avec Rails. De plus, puisque le déploiement de WordPress ne nécessitait ni redémarrage de serveur Web ni de processus PHP, il ne nous reste plus qu'à appeler git: clone et deploy: link_shared_paths.
Laisse les changer pour:
task: deploy =>: environment do deploy do # Placez les éléments qui vont configurer un répertoire vide dans une instance # de configuration complète de votre projet. invoke: 'git: clone' invoke: 'deploy: link_shared_paths' fin fin
Malheureusement, Mina n'a pas de méthode officielle de restauration, alors j'ai créé une tâche pour notre propre processus de restauration. Ce que la tâche de restauration fera, c’est qu’elle supprimera la version actuelle et actuel
lien symbolique vers la version précédente. Ajouter cette tâche à la fin de votre deploy.rb
desc "Revenir à la version précédente." tâche: rollback =>: l'environnement fait la file d'attente% [echo "----> Start to rollback"] la file d'attente% [if [$ (ls # deploy_to / releases | wc -l) -gt 1]; then echo "----> Relier à la version précédente" && unlink # deploy_to / current && ln -s # deploy_to / releases / "$ (ls # deploy_to] / releases | tail -2 | head -1 ) "# deploy_to / current && echo" Supprimer les anciennes versions "&& rm -rf # deploy_to / releases /" $ (ls # deploy_to / releases | tail -1) "&& echo" $ (ls # deploy_to / releases | tail -1) "> # deploy_to / last_version && echo" Terminé. Revenir à v $ (cat # deploy_to / last_version) "; else echo "Plus de version à annuler"; fi] fin
Le code ci-dessus semble complexe, mais il s’agit en fait d’une version à une seule ligne du code suivant. Je vais le décomposer et mettre une annotation au-dessus de chaque commande.
# Vérifiez si nous avons plus d'une version si [$ (ls /var/www/votredomaine.com/releases | wc -l) -gt 1] then echo "----> Relier à la version précédente" # Supprimer le lien symbolique actuel unlink /var/www/yourdomain.com/current # Pointez-le sur la version précédente ln -s /var/www/yourdomain.com/releases/"$(ls /var/www/yourdomain.com/releases | tail -2 | head -1) "/var/www/yourdomain.com/current echo" Supprimer les anciennes versions "# Supprimer la dernière version que nous avons déjà annulée rm -rf /var/www/yourdomain.com/releases/"$(ls / var / www / votredomaine.com / releases | tail -1) "# Enregistrez la version actuelle dans le fichier last_version echo" $ (ls /var/www/votredomaine.com/releases | tail -1) "> /var/www/votredomaine.com / last_version # Out a mis quelques informations à l'utilisateur echo "Terminé. Revenir à v $ (cat /var/www/votredomaine.com/last_version)" else # Si nous n'avons pas plus d'une version, nous ne pouvons pas revenir en arrière. echo "Pas plus de release à rollback" fi
À ce stade, nous configurons le serveur, modifions la tâche de configuration, la tâche de déploiement et la tâche de restauration. Commençons à utiliser Mina maintenant.
Dans cette partie, je vais vous montrer comment exécuter Mina pour configurer le serveur, le déployer sur le serveur et effectuer une restauration. Mina est un utilitaire de ligne de commande. Vous devez avoir accès à un terminal. Chaque tâche Mina sera appelée à partir du terminal.
Nous n'exécutons ceci que la première fois que nous préparons le déploiement sur un serveur. SSH au serveur et créer le deploy_to
annuaire. Ses /var/www/votredomaine.com
dans notre cas.
$ ssh [email protected] # sur votre machine distante (après vous être connecté via SSH), lancez $ sudo mkdir -p /var/www/votredomaine.com $ sudo chown -R votre_nom /var/www/votredomaine.com
Une fois que nous courons le chown
commande, nous allons changer le propriétaire de /var/www/yourdomain.com en utilisateur votre nom
. Par conséquent, le serveur Web ne peut rien écrire dans ce répertoire. Notre site WordPress sera plus sécurisé de cette façon. Ensuite, sur votre local, lancez configuration mina
. Il en sort quelque chose comme ceci:
$ mina setup -----> Installation /var/www/votredomaine.com total 16 drwxr-xr-x 4 racine kurei 4096 27 jan. 22:51. drwxr-xr-x 3 racine 4096 27 janvier 00 00: 16… drwxr-xr-x 2 utilisateurs de kurei 4096 27 janvier 22:51 de presse drwxr-xr-x 2 utilisateurs de kurei 4096 janv. 27 22:51 partagé ----- > Fait. Temps écoulé: 1.00 secondes
Si vous voulez confirmer ce que Mina a créé pour nous sur le serveur, vérifions-le sur une machine distante:
$ cd /var/www/yourdomain.com $ ls publie des téléchargements partagés $ ls partagés / wp-content
À ce stade, tout est presque prêt. N'oubliez pas que le répertoire de téléchargement stocke le contenu téléchargé par l'utilisateur. Par conséquent, le serveur Web doit pouvoir y écrire. Nous devons déterminer quel utilisateur votre Apache / Nginx (ou le processus FPM PHP, en fonction de la configuration de votre serveur) est en cours d'exécution, et changer le propriétaire du dossier uploads afin de permettre au serveur Web d'écrire dans ce dossier. Généralement, si vous ouvrez votre fichier de configuration Apache ou votre fichier de configuration Nginx, vous pouvez trouver cet utilisateur, quelque chose de similaire:
[code source]
# Pour Apache, ouvrez /etc/httpd/conf/httpd.conf
Utilisateur www groupe www
# Pour Nginx, ouvrez /etc/nginx/nginx.conf
utilisateur http http; worker_processes 2;
[/ code source]
Supposons qu'Apache s'exécute www
utilisateur.
[code_source] ssh [email protected] sudo chown -R www /var/www/votredomaine.com/wp-content/uploads [/ sourecode]
Chaque fois que nous voulons déployer le code, nous utilisons cette tâche.
Le processus est:
Une fois votre code en place sur le serveur Git.
Déployons
$ mina deploy
Dans quelques secondes, ça devrait finir. Voici un exemple de sortie du résultat de déploiement:
$ mina deploy -----> Création d'un chemin de construction temporaire -----> Récupération de nouveaux commits git -----> Utilisation de la branche git 'maître' Clonage dans '.'… terminé. -----> Utilisation de ce commit git kureikain (347d9b3):> Mise à jour de la nouvelle configuration / déploiement -----> Symllinking des chemins partagés -----> Construction terminée -----> Déplacement de la version vers les versions / 2 -----> Mise à jour du lien symbolique actuel -----> Lancement -----> Terminé. Temps déployé v2: 1,00 secondes
Si une version contient un bogue critique ou si nous voulons simplement restaurer le code à la version précédente pour une raison ou une autre, nous procédons comme suit:
$ mina rollback
Sa sortie quelque chose comme
----> Commencer à revenir en arrière ----> Relier à la version précédente Supprimer les anciennes versions Terminé. Restauration en v2 Connexion à axcoto.com fermée. Temps écoulé: 0.00 secondes
Vous avez appris à vous déployer avec Mina. Le processus de déploiement est assez rapide maintenant. Votre site Web n'aura aucun temps d'arrêt. Mais ne vous arrêtez pas là-dessus, rendez-vous sur le site Web de Mina pour en savoir plus. J'ai partagé un exemple de projet WordPress utilisant Mina sur GitHub.
Dans la prochaine partie, nous en apprendrons plus sur WP-CLI. Plus précisément, nous allons apprendre à l'utiliser et à effectuer des tâches administratives courantes telles que la mise à jour de WordPress, l'installation de thèmes, de plug-ins, etc., via WP-CLI au-dessus d'une tâche Mina. Nous verrons également comment nous l'utilisons pour rendre notre installation WordPress plus sécurisée..
Jusque-là, laissez un commentaire sur ce que vous faites pour rendre votre déploiement WordPress un jeu d'enfant.