Introducere în implementarea WordPress cu Mina

Ca aplicație PHP, WordPress este de obicei implementată printr-o metodă foarte veche: încărcarea fișierelor prin FTP.

Avem unele instrumente de implementare, dar de multe ori necesită un anumit tip de abilitate Ruby. De exemplu, un instrument popular, puternic, este Capistrano, dar este, de asemenea, foarte greu cu multe caracteristici legate de Ruby / Rails. De asemenea, cred că este puțin complicat să instalați Capistrano pentru un dezvoltator PHP fără cunoștințe Ruby.

Deci, ce opțiuni avem ca dezvoltatori WordPress?

În acest tutorial, vă prezint Mina: Un instrument mic, ușor, are ca scop implementarea rapidă și automatizarea serverului.

De ce avem nevoie de implementare automată?

Implementarea automată ne salvează timpul de a repeta sarcinile de fiecare dată când începem să implementăm proiectul nostru WordPress. De asemenea, ajută la minimizarea timpului de dezactivare în timpul implementării și la eliminarea greșelilor umane, cum ar fi lipsa fișierelor, încărcarea fișierelor greșite și așa mai departe.

Acest proces de automatizare poate fi împărțit între mai mulți dezvoltatori din echipă, creând astfel o metodă unică de implementare în întreaga echipă. O companie aproape a falimentat din cauza lipsei unui bun proces de implementare. O metodă de implementare automată este de obicei legată de un sistem de control al codului sursă: Git, SVN, Mercurial și așa mai departe.

În scopul acestui tutorial vom analiza Git. Dacă aveați un depozit Git, nu ezitați să îl utilizați; în caz contrar, apucați unul gratuit la BitBucket sau GitLab. Aceste servicii vă permit să creați depozite private Git.

Înainte de a merge mai departe, asigurați-vă că respectăm cerințele:

  • o conexiune SSH
  • un depozit Git
  • oermission pentru a edita și schimba configurația serverului web.

[notă] Presupun că rulați WordPress pe Apache cu PHP instalând ca modul Apache PHP. Dacă utilizați PHP cu FPM sau CGI, vă rugăm să fiți flexibil atunci când vorbim de serverul nostru web sau de procesul nostru PHP. [/Notă]

Implementare cu cârlige Git

Ideea generală este că atunci când împingem spre server, Git va invoca o adresă URL care ar putea să facă referire la un script PHP pentru a efectua implementarea prin tragerea sau îmbinarea celui mai nou cod din depozit.

În timp ce acest lucru funcționează perfect și este foarte util, acesta expune o gaură: Am deschis o ușă secretă pe server. Dacă cineva știe acea adresă URL, poate declanșa o implementare manuală. Un alt pericol este că trebuie să construim caracteristici pentru curățare, răsturnare, blocare (pentru a ne asigura că se execută doar un singur proces de implementare) și așa mai departe.

Dacă începem să codificăm aceste caracteristici, reinventăm roata, de ce să nu folosim un instrument existent?

Ce este Mina?

Mina este un instrument de implementare care are scopul de a fi foarte rapid; Veți fi surprins de cât de rapid este atunci când o încercați. Potrivit site-ului Mina:

Instrument de depanare și server de automatizare foarte rapid. Foarte rapid sângeros.

Pur și simplu puneți aici cum să vă gândiți la Mina: În loc să vă conectați la server și să tastați o secvență de comenzi pentru implementare. Mina generează un script shell care este un set de aceste comenzi.

  1. Creați un nou director,
  2. Trageți ultimul cod în acest director,
  3. Indicați simbolic resursele comune,
  4. Îndreptați directorul public către acest nou director,
  5. Curățați datele vechi.

Mina încarcă acest script shell pe server și îl execută. Acest proces de generare este rulat pe mașina dvs. locală.

Toate sarcinile Mina, sunt doar o secvență de comenzi pentru shell. Pentru că este vorba doar de comenzi de shell, nu veți avea acces la un ajutor fantastic Ruby, ca la Capistrano sau Vlad.

O altă modalitate de a vă gândi la Mina este următoarea: Mina organizează comenzile shell pe care trebuie să le executați pe mașină la distanță în blocuri de coduri (care sunt numite sarcini Mina).

Pasul 1. Pregătiți aspectul serverului pentru Mina

Mina necesită un aspect director pentru site-ul dvs. Va trebui să schimbați directorul public al serverului dvs. web. Pentru a face mai ușor, să presupunem că structura curentă a directorului serverului este următoarea.

 /var/www/yourdomain.com/ # Directorul public unde stă cuvântul dvs. WordPress | - index.php | - wp-admin | - wp-content | - wp-include | - wp-login.php | - wp-activate. php | - ... .

yourdomain.com arată spre /var/www/yourdomain.com/, și index.php fișierul, care se află în acest director, este executat și răspunde solicitării dvs. Cu Mina, trebuie să schimbi puțin aspectul directorului.

Mina se așteaptă ca această structură:

 /var/www/yourdomain.com/ # Deploy_to path | - releases / # Holds lansări, un subdir per release | | - 1 / # Fiecare implementare WordPress sta aici | | - 2 / # Fiecare implementare WordPress sta aici | | - 3 / # Fiecare implementare WordPress sta aici | | - ... | - shared / # Susține fișiere partajate între versiuni: cum ar fi fișier jurnal, config, ... | | - fișierele log / de obicei sunt stocate aici | - ... | - curent / # Un sincronizare cu versiunea curentă în versiuni, acesta va fi un nou dosar public

Mina adaugă trei directoare:

  1. de presă: fiecare implementare va fi stocată în directoare separate în interiorul acestui dosar care ne permite să păstrăm versiunea 1, versiunea 2, versiunea 3 și așa mai departe.
  2. impartit: conține fișiere / foldere comune care sunt distribuite între mai multe implementări. Un exemplu este wp-content / încărcări. La fiecare implementare, vom avea un nou director wp-content / încărcări care este diferit de cele anterioare wp-content / încărcări director. Și conținutul din interior a dispărut. Prin urmare, vom folosi un director comun: partajate / wp-content / încărcări. Noi vom avea: /var/www/yourdomain.com/releases/7/wp-contents/uploads este un semn de simbol /var/www/yourdomain.com/shared/wp-content/uploads.
  3. actual: indică lansarea curentă. Exemplu: /var/www/yourdomain.com/current arata spre /var/www/yourdomain.com/releases/7.

Potrivit Wikipedia:

O legătură simbolică (de asemenea, simbolică sau legătura soft) este un tip special de fișier care conține o referință la un alt fișier sau un director sub forma unei căi absolute sau relative și care afectează rezoluția numelui de cale. Conexiunile simbolice au fost deja prezente până în 1978 în sistemele de operare mini-computer de la DEC și Data General's RDOS. Astăzi, acestea sunt susținute de standardul de operare POSIX, majoritatea sistemelor de operare asemănătoare Unix, cum ar fi FreeBSD, GNU / Linux și Mac OS X, precum și sistemele de operare Windows precum Windows Vista, Windows 7 și, într-o oarecare măsură, în Windows 2000 și Windows XP sub formă de fișiere rapide.

Yourdomain.com acum trebuie să puncteze /var/www/yourdomain.com/current in loc de /var/www/yourdomain.com. Serverul Web va rula fișierul /var/www/yourdomain.com/current/index.php când vizitați http://yourdomain.com. Trebuie să re-config server web (Apache, Nginx) la punctul docroot(sau directorul public) la acest actual director.

Schimba DocumentRoot pentru Apache

Deschide-ți /etc/httpd/conf/httpd.conf, găsi DocumentulRădăcină line și schimbați-l.

 DocumentRoot /var/www/yourdomain.com/current

Modificați rădăcina documentului pentru Nginx

Editați-vă /etc/nginx/nginx.conf și actualizați-vă rădăcină definiție.

 server numele serverului log.axcoto.com www.log.axcoto.com; root /srv/http/domeniu/log.axcoto.com/current/; # ...

Pasul 2. Instalarea Minei

Mina este o bijuterie Ruby, așa că trebuie să instalați Ruby. Instalarea este destul de eseu. Dacă utilizați OS X sau Linux, este posibil să aveți deja instalat Ruby; în caz contrar, puteți urma aceste tutoriale pentru a instala Ruby:

  • http://net.tutsplus.com/tutorials/why-you-should-use-rvm/
  • http://net.tutsplus.com/tutorials/ruby/how-to-install-ruby-on-a-mac/

Odată, aveți Ruby, continuați să instalați bijuterie. Fugi:

 $ gem instalează mina

Confirmați că Mina rulează corect.

 $ mina -V

Ar trebui să vedeți ceva similar.

 Mina, versiunea v0.3.0

Implementarea WordPress cu Mina

Unul dintre lucrurile care fac ca aplicațiile PHP să fie mai puțin sigure este setarea permisiunilor incorecte.

Ia WordPress pentru un exemplu: poate aș vrea să încarc plugin sau să încarc tema pentru a încerca. Pentru a face acest lucru, am terminat încărcarea lor în tabloul de bord WordPress. Dacă eu sau unul dintre administratorii site-ului am pierdut parola de administrator, cineva intră și pot să încarce un fișier PHP și să-l ruleze ca un plug-in și nu doar să-mi hack site-ul, ci și întregul meu server.

Cazul în cauză: pot citi un fișier din / etc, pot învăța configurația serverului și apoi încep să ruleze comenzi shell prin PHP.

Cred că ar trebui să tratăm o instanță WordPress ca o instalare numai pentru citire. Pentru instalarea temelor și pluginurilor, putem instala prin adăugarea fișierelor la nivel local, apoi re-implementăm prin Mina. Implementarea cu Mina este ieftină și foarte rapidă, pe serverul meu 512MB RAM DigitalOcean, este nevoie de sub 30 de secunde pentru a implementa.

Pentru conținutul încărcat de utilizatori (cum ar fi imagini și fișiere audio), le vom simula în afara directorului de cod sursă și va fi mai bine dacă putem configura serverul pentru a împiedica executarea oricărui fișier PHP în interiorul acelui director încărcat de conținut, dar acest lucru nu face parte din acest tutorial.

Pentru moment, vom încerca să folosim Mina pentru o implementare rapidă și să adăugăm o temă sau un plugin și o vom face la nivel local pentru a evita să oferim serverului web permisiunea de a scrie în aceste directoare.

Pasul 1. Configurați Mina cu WordPress

După cum sa menționat la începutul tutorialului, trebuie să aveți un depozit Git pentru site-ul dvs. WordPress. Să recapitulăm ceea ce avem nevoie aici:

Să presupunem că ...

  1. Proiectul WordPress va fi în ~ / Site / wordpress.
  2. Reprezentanța dvs. WordPress git este [email protected]/yourname/wordpress
  3. Puteți accesa serverul dvs. prin intermediul ssh cu un cont pe numele dvs. la domenii.com

Dacă nu sunteți familiarizat cu Git, vă rugăm să citiți următoarele tutoriale:

  1. http://net.tutsplus.com/sessions/git-succinctly/
  2. http://net.tutsplus.com/tutorials/other/easy-version-control-with-git/
  3. http://net.tutsplus.com/tag/git/

Dacă codul dvs. sursă WordPress nu este un depozit Git, hai să o facem acum; în caz contrar, treceți la pasul următor.

 $ cd ~ / Site / wordpress $ git init $ git adăugați la distanță origine [email protected]: kureikain / wordpress.git $ git add. $ git împinge master de origine

Rulați comanda de mai jos pentru a începe configurarea Minei pentru proiectul dvs..

 $ mina init

Acest lucru vă va crea un dosar config cu un singur fișier deploy.rb în interiorul acestuia.

 $ ls config wp-blog-header.php wp-upload.php index.php wp-comments-post.php wp-login.php wt-config-sample.php wp-mail.php license.txt wp-content wp-settings.php readme.html wp-cron.php wp-signup.php wp-activate.php wp-include wp-trackback.php wp-admin wp-links-opml.php xmlrpc.php $ ls config deploy.rb

Pasul 2. Configurați config / deploy.rb

Acum, deschideți config / deploy.rb în pasul anterior și să definim unele configurații.

Acest fișier deploy.rb conține configurația de implementare și un set de sarcină Mina. Fiecare sarcină este înfășurată în interior sarcină: taskname bloc. În cadrul fiecărei sarcini, putem invoca o altă sarcină invoca Pentru a rula un comandă pe server, îl specificați cu coadă comanda.

De exemplu, o sarcină poate arăta astfel:

 sarcina: în jos invoca: maintenance_on invoke: coada de repornire 'rm -rf / tmp / cache' end

În acest sens, să începem editarea acestui fișier deploy.rb.

Îndepărtați liniile neutilizate

Comentați această linie, deoarece nu le vom folosi.

 #încărcați "mina / bundler" #require 'mina / rails'

Configurați definiția serverului

Codul implicit arată astfel

 set: utilizator, setul "nume de utilizator": domeniu, "foobar.com" set: deploy_to, '/var/www/foobar.com' set: repository, 'git:
  1. domeniu este domeniu pentru numele domeniului site-ului dvs. WordPress.
  2. deploy_to este locul în care doriți să localizați proiectul dvs. WordPress.
  3. repertoriu este adresa dvs. de depozit Git.
  4. ramură ramura de desfășurare. Git susține multe ramuri, iar unele pepple doresc să aibă a lansa ramificație pentru scopuri de desfășurare.

Să o actualizăm cu configurația serverului nostru:

 set: domeniu, setul "yourdomain.com": deploy_to, '/var/www/yourdomain.com' set: depozit, 'https: //[email protected]/kureikain/wordpress.git' set: branch, master 'set: user,' your_username '# Nume de utilizator pe server la SSH la.

Asigurați-vă că puteți ajunge la repertoriu pe mașina dvs. la distanță.

În continuare, vom rezolva problema wp-content / încărcări pliant. Acest dosar conține conținut încărcat de utilizatori. De fiecare dată când vom implementa, va fi un director diferit de cel pe care îl folosim în prezent deoarece codul recent dislocat se află în interiorul unui folder diferit de presă.

Dacă păstrăm acest nou dosar, vom pierde tot conținutul vechi. Ca atare, trebuie să folosim o simbolică pentru a o indica în altă parte. Odată implementat, îl vom actualiza pentru a indica corect unul.

Găsiți această linie:

 set: shared_paths, ['config / database.yml', 'log']

Și schimbați-l la:

 set: shared_paths, ['wp-content / uploads']

shared_paths este o colecție de resurse comune (fișier / dosar) între diferitele versiuni și poate fi diferită între lansare. Ca și fișierele de jurnal, conținutul încărcat de utilizatori ar trebui să fie pus în modurile shared_paths. Dacă nu facem asta, atunci vom pierde datele cu fiecare lansare nouă.

De exemplu: Când un utilizator încarcă un fișier, WordPress îl stochează /var/www/yourdomain.com/current/wp-content/upload/2014/01/29/picture.png. Dar /var/www/yourdomain.com/current este un punct de simbol /var/www/yourdomain.com/releases/4/ care este eliberarea noastră actuală. Prin urmare, fișierul real se află la: /var/www/yourdomain.com/releases/4/wp-content/upload/2014/01/29/picture.png.

Dacă ai făcut o nouă versiune, actual va indica /var/www/yourdomain.com/releases/5. Fișierul /var/www/yourdomain.com/current/wp-content/upload/2014/01/29/picture.png nu mai există, pentru că /var/www/yourdomain.com/releases/5/wp-content/uploads este un dosar nou, fără conținut.

Ca atare, trebuie să o punem în partajările comune, iar Mina va crea un simbolink pentru a indica /www/yourdomain.com/releases/5/wp-content/uploads la /www/yourdomain.com/shared/wp-content/uploads.

Configurați sarcina noastră de configurare

Aceasta este sarcina pe care o conducem la prima dată pentru a pregăti mediul serverului nostru. Această opțiune implicită arată astfel:

 sarcina: setup =>: mediu nu coada! % [mkdir -p "# deploy_to / partajat / jurnal"] coadă! % [cozi chmod g + rx, u + rwx "# deploy_to / shared / log"] coadă! % [mkdir -p "# deploy_to / shared / config"] coadă! % [coadă chmod g + rx, u + rwx "# deploy_to / shared / config"] coadă! % [atingeți "# deploy_to /shared/config/database.yml"] coadă% [echo "-----> Asigurați-vă că editați" shared / config / database.yml ".

Să o schimbăm la:

 sarcina: setup =>: mediu nu coada! % [mkdir -p "# deploy_to / shared / wp-content / uploads"] sfârșit

Sarcina noastră de configurare creează pur și simplu a wp-content / încărcări director.

Configurați sarcina noastră de implementare

Sarcina implicită arată astfel.

 task: deploy =>: mediul se implementează # Puneți lucrurile care vor configura un director gol într-o instanță complet setată # a proiectului dvs. invocați: 'git: clone' invoke: 'implementați: link_shared_paths' invoke: 'bundle: install' invoke: 'rails: db_migrate' invoke: 'rails: assets_precompile' .txt "sfârșitul final

Nu avem nevoie de nimic care să aibă legătură cu Rails. De asemenea, deoarece implementarea programului WordPress nu a necesitat reportarea unui server web sau a procesului PHP, trebuie doar să invocăm git: clona și implementarea: task_link_shared_paths task.

Să le schimbați la:

 task: deploy =>: mediul se implementează # Puneți lucrurile care vor configura un director gol într-o instanță complet setată # a proiectului dvs. invoca: 'git: clone' invoke: 'implementare: link_shared_paths' end end

Configurați sarcina noastră de reluare

Din păcate, Mina nu are o metodă oficială de revocare, așa că am creat o sarcină pentru propriul nostru proces de revocare. Ceea ce va face sarcina de revocare este că va elimina eliberarea curentă și va reintra actual sincronizare cu versiunea anterioară. Adăugați această sarcină la sfârșitul deploy.rb

 desc "Revine la versiunea anterioară." sarcină: rollback =>: mediu does queue% [echo "----> Start to rollback"] coadă% [dacă [$ (ls # deploy_to / releases | wc -l) -gt 1]; apoi echo "----> Reluați la lansarea previos" && unlink # deploy_to / curent && ln -s # deploy_to / releases / "$ (ls # deploy_to / releases | ) "# deploy_to / current && echo" Eliminați versiunile vechi "&& rm -rf # deploy_to / releases /" $ (ls # deploy_to / releases | tail -1)  \ deploy_to / releases | tail -1) "> # deploy_to / last_version && echo" Efectuat. altceva echo "Nu mai este lansat la rollback"; fi] sfârșitul

Codul de mai sus pare complex, dar de fapt este o versiune cu o singură linie a codului următor. O voi rupe și voi pune o notă deasupra fiecărei comenzi.

 # Verificați dacă avem mai mult de 1 lansări dacă [$ (ls /var/www/yourdomain.com/releases | wc -l) -gt 1] apoi echo "----> Reluați la eliberarea anterioară" # Eliminați deblocarea curentă a linkurilor /var/www/yourdomain.com/current # Indicați-l la versiunea anterioară ln -s /var/www/yourdomain.com/releases/"$(ls/var/www/yourdomain.com/releases | tail -2 | cap -1) "/var/www/yourdomain.com/current echo" Eliminați versiunile vechi "# Eliminați ultima versiune pe care deja o lansăm rm -rf /var/www/yourdomain.com/releases/"$(ls / var / www / yourdomain.com / releases | tail -1) "# Versiunea curentă a versiunii la ultimul fișier ecou" $ (ls /var/www/yourdomain.com/releases | tail -1) "> /var/www/yourdomain.com / last_version # Nu puneți niște informații la ecoul utilizatorului "Efectuat. Reveniți la v $ (cat /var/www/yourdomain.com/last_version)" altceva # Dacă nu avem mai mult de 1 versiuni, atunci nu putem reveni. echo "Fără eliberare până la revenire" fi

În acest moment, configrăm serverul, modificăm sarcina de setare, implementăm sarcina și reluăm sarcina. Să începem să folosim Mina acum.

Cu Mina

În această parte, vă voi arăta cum să rulați Mina să configureze serverul, să se implementeze pe server și să efectueze o revocare. Mina este un utilitar pentru linia de comandă. Trebuie să aveți acces la un terminal. Fiecare sarcină Mina va fi invocată de la terminal.

Pasul 1. Pregătiți-vă

Efectuăm numai această operațiune pentru prima dată când ne pregătim să implementăm un server. SSH pentru server și pentru a crea deploy_to director. este /var/www/yourdomain.com în cazul nostru.

 $ ssh [email protected] # pe mașina dvs. la distanță (după ce ați conectat prin SSH), executați acest $ sudo mkdir -p /var/www/yourdomain.com $ sudo chown -R your_name /var/www/yourdomain.com

Odată ce vom rula chown comanda, vom schimba proprietarul /var/www/yourdomain.com catre utilizator Numele dumneavoastră. Prin urmare, serverul web nu poate scrie nimic în acest director. Site-ul nostru WordPress va fi mai sigur prin acest mod. Apoi, la locul tău local, alerga configurarea mina. Efectuează ceva de genul:

 $ mina setup -----> Configurarea /var/www/yourdomain.com total 16 drwxr-xr-x 4 kurei rădăcină 4096 27 ianuarie 22:51. drwxr-xr-x 3 rădăcină rădăcină 4096 Jan 27 00: 16 ... drwxr-xr-x 2 utilizatori kurei 4096 27 Jan 22 22:51 versiuni drwxr-xr-x 2 utilizatori kurei 4096 27 Jan 22 22:51 partajat ----- > Efectuat. Timp scurs: 1,00 secunde

Dacă doriți să confirmați ceea ce Mina a creat pentru noi pe server, să o verificăm pe o mașină de la distanță:

 $ cd /var/www/yourdomain.com $ ls eliberează încărcări partajate de $ ls shared / wp-content

În acest moment, totul este aproape gata. Rețineți că directorul de încărcare stochează conținut încărcat de utilizatori. Prin urmare, serverul web trebuie să fie capabil să-l scrie. Trebuie să determinăm utilizatorul pe care îl executați Apache / Nginx (sau procesul PHP FPM, depinde de configurarea serverului dvs.) și să schimbați proprietarul dosarului încărcări în el, pentru a permite serverului web să scrie în acest folder. De obicei, dacă deschideți fișierul de configurare Apache sau fișierul de configurare Nginx, puteți găsi acest utilizator, ceva similar:

[Sourecode]
# Pentru Apache, deschideți /etc/httpd/conf/httpd.conf
Grupul www al utilizatorului www

# Pentru Nginx, deschideți /etc/nginx/nginx.conf

utilizator http http; lucrări_procese 2;
[/ Sourecode]

Să presupunem că Apache rulează www utilizator.

[sourecode] ssh [email protected] sudo chown -R www /var/www/yourdomain.com/wp-content/uploads [/ sourecode]

Pasul 2. Implementați

De fiecare dată când vrem să implementăm codul, folosim această sarcină.

Procesul este:

  • actualizați codul
  • să comită schimbarea.
  • apăsați pe serverul Git.

Odată ce codul vostru era pe serverul Git.

Să ne desfășurăm

 $ mina se implementează

În câteva secunde, ar trebui să termine. Iată un exemplu de ieșire a rezultatului implementării:

 $ mina deploy -----> Crearea unei căi temporare de construire -----> Fetching noi comenzi git -----> Folosind git branch 'master' Clonarea în '.' ... terminat. -----> Folosind acest git commit kureikain (347d9b3):> Actualizați noul config / deploy -----> Simbolizând căile comune -----> Construiți terminat -----> Mutarea construirii în versiuni / 2 -----> Actualizarea sincronizării curente -----> Lansarea -----> Efectuată. Depășit v2 Timp scurs: 1,00 secunde

Pasul 3. Revenire

Dacă o versiune are bug-uri critice sau pur și simplu vrem să redeschidem codul la versiunea anterioară pentru un motiv sau altul, facem acest lucru:

 $ mina rollback

Ieșirea lui ceva de genul

 ----> Start to rollback ----> Reluați la lansarea anterioară Eliminați vechile ediții Efectuate. Revin la v2 Conexiunea la axcoto.com este închisă. Timp scurs: 0,00 secunde

Concluzie

Ai învățat cum să te descurci cu Mina. Procesul de implementare este destul de rapid acum. Site-ul dvs. va avea zero timp de inactivitate. Dar nu te opri, mergi la site-ul Mina și te sprijini mai mult. Am împărtășit un exemplu de proiect WordPress care folosește Mina pe GitHub.

În partea următoare, vom afla despre WP-CLI. În mod specific, vom învăța cum să-l folosim și să efectuăm sarcini comune de administrare, cum ar fi actualizarea WordPress, instalarea de teme, plugin-uri și așa mai departe prin intermediul WP-CLI în partea de sus a unei sarcini Mina. Ne vom uita, de asemenea, cum îl folosim pentru a face instalarea WordPress mai sigură.

Până atunci, lăsați un comentariu ce faceți pentru a face implementarea WordPress o briză.

Cod