En introduksjon til distribusjon av WordPress med Mina

Som en PHP-applikasjon, er WordPress vanligvis distribuert av en veldig gammel metode: opplasting av filer via FTP.

Vi har noen distribusjonsverktøy, men de krever ofte en type Ruby-ferdighet. For eksempel er et populært, kraftig verktøy Capistrano, men det er også veldig tungt med mange Ruby / Rails-relaterte funksjoner. Jeg tror også at det er litt vanskelig å installere Capistrano for en PHP-utvikler uten noen Ruby-kunnskaper.

Så hvilke alternativer har vi som WordPress-utviklere?

I denne opplæringen vil jeg introdusere deg Mina: Et lite, lett verktøy tar sikte på rask distribusjon og serverautomatisering.

Hvorfor trenger vi automatisert distribusjon?

Automatisert distribusjon sparer oss tid til å gjenta oppgaver hver gang vi begynner å distribuere vårt WordPress-prosjekt. Det bidrar også til å minimere nedetid under distribusjon og eliminere menneskelige feil som manglende filer, opplasting av feilfiler og så videre.

Denne automatiseringsprosessen kan deles mellom flere utviklere i teamet og dermed skape en unik metode for distribusjon i hele teamet. Ett selskap gikk nesten konkurs på grunn av mangelen på en god distribusjonsprosess. En automatisert distribusjonsmetode er vanligvis knyttet til et kildekodesystem: Git, SVN, Mercurial, og så videre.

I omfanget av denne opplæringen vil vi ta en titt på Git. Hvis du hadde et Git-depot, kan du ikke bruke det. Ellers ta en gratis en på BitBucket eller GitLab. Disse tjenestene tillater deg å opprette private Git-arkiver.

Før vi går videre, må du sørge for at vi oppfyller kravene:

  • en SSH-tilkobling
  • et Git-depot
  • overgang til å redigere og endre webserverkonfigurasjon.

[notat] Jeg antar at du kjører WordPress på Apache med PHP installering som Apache PHP-modul. Hvis du bruker PHP med FPM eller CGI, vennligst vær fleksibel når vi snakker om vår webserver eller vår PHP-prosess. [/Merk]

Distribusjon med Git kroker

Den generelle ideen er at når vi presser til serveren, vil Git påkalle en nettadresse som kan referere til et PHP-skript for å utføre distribusjon ved å trekke eller slå sammen den nyeste koden fra depotet.

Selv om dette fungerer perfekt, og det er veldig nyttig, avslører det et hull: Vi åpnet en hemmelig dør på serveren. Hvis noen kjenner den URL-adressen, kan de utløse en distribusjon manuelt. En annen fare er at vi må bygge egenskaper for rydde opp, for tilbakeringing, for låsing (for å sørge for at bare en enkelt distribusjonsprosess kjører), og så videre.

Hvis vi begynner å kode disse funksjonene, oppdager vi hjulet, så hvorfor ikke bruke et eksisterende verktøy?

Hva er Mina?

Mina er et distribusjonsverktøy som skal være veldig raskt; Du vil bli overrasket over hvor fort det er når du prøver det. Ifølge Mina nettside:

Virkelig rask distribusjonsverktøy og serverautomatiseringsverktøy. Virkelig blodig fort.

Enkelt sagt, her 'hvordan du tenker på Mina: I stedet for å logge inn på serveren og skrive en rekke kommandoer som skal distribueres. Mina genererer et shell-skript som er et sett med disse kommandoene.

  1. Opprett en ny katalog,
  2. Trekk siste koden inn i denne katalogen,
  3. Gjør symbolsk poeng til vanlige ressurser,
  4. Pek den offentlige katalogen til denne nye katalogen,
  5. Rengjør de gamle dataene.

Mina laster opp dette shell-skriptet til serveren og kjører det. Denne generasjonsprosessen kjøres på din lokale maskin.

Alle Mina-oppgaver er bare en sekvens av skallkommandoer. Fordi det bare er shell kommandoer, har du ikke tilgang til fantastisk Ruby hjelper som i Capistrano eller Vlad.

En annen måte å tenke på Mina er dette: Mina organiserer dine shell kommandoer som du må kjøre på ekstern maskin i kodeblokker (som kalles Mina-oppgaver).

Trinn 1. Forbered serverlayout for Mina

Mina krever en katalogoppsett for nettstedet ditt. Du må endre den offentlige katalogen på din webserver. For å gjøre det enklere, må du anta at din nåværende serverkatalogstruktur som følger.

 /var/www/yourdomain.com/ # Den offentlige katalogen der WordPress sitter | - index.php | - wp-admin | - wp-content | - wp-includes | - wp-login.php | - wp-aktiver. php | - ... .

yourdomain.com peker på /var/www/yourdomain.com/, og index.php fil, som sitter inne i denne katalogen, utføres og svarer på forespørselen din. Med Mina må du endre katalogoppsettet litt.

Mina forventer denne strukturen:

 /var/www/yourdomain.com/ # Deploy_to path | - utgivelser / # Holder utgivelser, en subdir per utgivelse | | - 1 / # Hver av WordPress-distribusjonen er her | | - 2 / # Hver av WordPress-distribusjonen er her | | - 3 / # Hver av WordPress-distribusjonen er her | | - ... | - delt / # Holder filer som deles mellom utgivelser: som loggfil, config, ... | | - logger / # Loggfiler blir vanligvis lagret her | - ... | - nåværende / # En symlink til den nåværende utgivelsen i utgivelser, dette vil bli ny offentlig mappe

Mina legger til tre kataloger:

  1. utgivelser: Hver distribusjon vil bli lagret i separate kataloger i denne mappen som gjør at vi kan vedlikeholde versjon 1, versjon 2, versjon 3 og så videre.
  2. delt: inneholder vanlige filer / mapper som deles mellom flere distribusjoner. Et eksempel er wp-innhold / opplasting. Ved hver distribusjon vil vi ha en ny katalog wp-innhold / opplasting som er forskjellig fra tidligere wp-innhold / opplasting katalogen. Og innhold inni er borte. Derfor bruker vi en felles katalog: felles / wp-content / uploads. Vi vil ha: /var/www/yourdomain.com/releases/7/wp-contents/uploads er en symlink-poeng til /var/www/yourdomain.com/shared/wp-content/uploads.
  3. nåværende: peker på gjeldende utgivelse. Eksempel: /var/www/yourdomain.com/current poeng til /var/www/yourdomain.com/releases/7.

Ifølge Wikipedia:

En symbolsk lenke (også symlink eller soft link) er en spesiell type fil som inneholder en referanse til en annen fil eller katalog i form av en absolutt eller relativ vei, og som påvirker opplasting av stinavn. Symboliske koblinger var allerede til stede i 1978 i mini-operativsystemer fra DEC og Data General's RDOS. I dag støttes de av POSIX-operativsystemstandarden, de fleste Unix-lignende operativsystemer som FreeBSD, GNU / Linux og Mac OS X, og også Windows-operativsystemer som Windows Vista, Windows 7 og til en viss grad i Windows 2000 og Windows XP i form av snarvei filer.

Yourdomain.com nå må man peke på /var/www/yourdomain.com/current i stedet for /var/www/yourdomain.com. Web server vil kjøre filen /var/www/yourdomain.com/current/index.php når du besøker http://yourdomain.com. Vi må omkonfigurere webserveren (Apache, Nginx) for å peke dokumentroten(eller offentlig katalog) til dette nåværende katalog.

Endre DocumentRoot for Apache

Åpne din /etc/httpd/conf/httpd.conf, Finn Document linje og endre den til.

 DocumentRoot /var/www/yourdomain.com/current

Endre dokumentrot for Nginx

Rediger din /etc/nginx/nginx.conf og oppdater din rot definisjon.

 server server_name log.axcoto.com www.log.axcoto.com; root /srv/http/domain/log.axcoto.com/current/; # ...

Trinn 2. Installere Mina

Mina er en Ruby perle, så du må installere Ruby. Installasjon er ganske esy. Hvis du kjører OS X eller Linux, er det sjansene for at du allerede har Ruby installert; Ellers kan du følge disse veiledningene for å installere Ruby:

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

En gang har du Ruby, fortsett å installere perlen. Bare løp:

 $ perle installasjon mina

Bekreft at Mina kjører riktig.

 $ mina -V

Du bør se noe lignende.

 Mina, versjon v0.3.0

WordPress Deployment med Mina

En av de tingene som gjør PHP-applikasjoner mindre sikre, er å sette feil rettigheter.

Ta WordPress til et eksempel: Jeg vil kanskje laste opp plugin, eller laste opp tema for å prøve det. For å gjøre dette, ender jeg opp med å laste dem opp i WordPress dashboard. Hvis jeg eller en av administratorene mistet administrasjonspassordet, kommer noen inn, og de kan laste opp en PHP-fil og kjøre den, som en plugin, og ikke bare hacke siden min, men hele min server også.

Tilfelle i punkt: De kan lese en fil i / etc, lære serverkonfigurasjonen, og deretter begynne å kjøre skallkommandoer via PHP.

Jeg tror vi bør behandle en WordPress-instans som en skrivebeskyttet installasjon. For installering av tema og plugin kan vi installere ved å legge til filer lokalt, og deretter distribuere via Mina. Utplassering med Mina er billig og veldig rask, på min 512 MB RAM DigitalOcean-server tar det mindre enn 30 sekunder å distribuere.

For brukeropplastet innhold (for eksempel bilder og lydfiler), vil vi sammenkoble dem til utenfor kildekoden, og det vil være best hvis vi kan konfigurere serveren for å hindre kjøring av noen PHP-fil i den brukeropplastede innholdsmappen, men det er ikke tilgjengelig for denne opplæringen.

For nå vil vi prøve å bruke Mina for rask distribusjon, og legge til tema eller et plugin, og vi vil gjøre det lokalt, slik at vi kan unngå å gi webserver tillatelse til å skrive inn i disse katalogene.

Trinn 1. Oppsett Mina med WordPress

Som nevnt i begynnelsen av opplæringen må du ha et Git-lager for ditt WordPress-nettsted. La oss gjenskape hva vi trenger her:

La oss anta at ...

  1. Ditt WordPress-prosjekt vil være i ~ / Site / wordpress.
  2. Ditt WordPress git repository er [email protected]/yourname/wordpress
  3. Du kan få tilgang til serveren din via ssh med et kontonropsnavn på yourdomain.com

Hvis du ikke er kjent med Git, kan du lese følgende veiledninger:

  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/

Hvis din WordPress-kildekode ikke er et Git-depot, la oss gjøre det nå; ellers hoppe til neste trinn.

 $ cd ~ / Site / wordpress $ git init $ git ekstern legg til opprinnelse [email protected]: kureikain / wordpress.git $ git add. $ git push origin master

Kjør under kommando for å starte oppsettet Mina for prosjektet ditt.

 $ mina init

Dette vil skape deg en mappe config med en enkelt fil deploy.rb inne i den.

 $ ls config wp-blog-header.php wp-load.php index.php wp-kommentarer-post.php wp-login.php latest.tar.gz wp-config-sample.php wp-mail.php license.txt wp-innhold wp-settings.php readme.html wp-cron.php wp-signup.php wp-activ.php wp-inkluderer wp-trackback.php wp-admin wp-koblinger-opml.php xmlrpc.php $ ls config deploy.rb

Trinn 2. Konfigurer config / deploy.rb

Nå, åpne config / deploy.rb i forrige trinn, og la oss definere noen konfigurasjon.

Denne deploy.rb-filen inneholder distribusjonskonfigurasjon, og et sett med Mina-oppgave. Hver oppgave er pakket innvendig Oppgave: Oppgavenavn blokkere. Inne i hver oppgave kan vi påkalle en annen oppgave med påberope For å kjøre en kommando på server, spesifiserer du den med kommando.

For eksempel kan en oppgave se slik ut:

 Oppgave: Nøkkelen gjør: Vedlikehold: Påkoble: Endre køen 'rm -rf / tmp / cache' slutten

Med det i tankene, la oss begynne å redigere denne deploy.rb-filen.

Fjern ubrukte linjer

Kommentere denne linjen siden vi ikke vil bruke dem.

 #require 'mina / bundler' #require 'mina / rails'

Konfigurer serverdefinisjon

Standardkoden ser slik ut

 sett: bruker, 'brukernavn' sett: domene, 'foobar.com' sett: deploy_to, '/var/www/foobar.com' sett: repository, 'git: // ...' sett: gren, 'master'
  1. domene er domenet til domenenavnet på ditt WordPress-nettsted.
  2. deploy_to er der du vil at WordPress-prosjektet ditt skal finne.
  3. oppbevaringssted er din Git-depotadresse.
  4. gren distribusjonsgrenen din. Git støtter mange grener, og litt peppel vil ha en utplassere gren for distribusjonsformål.

La oss oppdatere det med vår serverkonfigurasjon:

 sett: domene, 'yourdomain.com' sett: deploy_to, '/var/www/yourdomain.com' sett: depot, 'https: //[email protected]/kureikain/wordpress.git' sett: gren, 'master 'sett: bruker,' ditt_brukernavn '# Brukernavn i serveren til SSH til.

Pass på at du kan nå oppbevaringssted på fjernmaskinen din.

Deretter skal vi håndtere wp-innhold / opplasting mappe. Denne mappen inneholder brukeropplastet innhold. Hver gang vi distribuerer, blir det en annen mappe fra den som vi bruker for øyeblikket, fordi den nylig distribuerte koden sitter i annen mappe inne utgivelser.

Hvis vi beholder denne nye mappen, vil vi miste alt gammelt innhold. Som sådan må vi bruke en symlink for å peke den til et annet sted. Når du har blitt distribuert, oppdaterer vi den for å korrigere en.

Finn denne linjen:

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

Og endre den til:

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

shared_paths er en samling av felles ressurser (fil / mappe) mellom de ulike utgivelsene og kan være forskjellig mellom utgivelsen. Som loggfiler skal brukeropplastet innhold settes i shared_paths. Hvis vi ikke gjør det, vil vi miste dataene med hver ny versjon.

For eksempel: Når en bruker laster opp en fil, lagrer WordPress den inn /var/www/yourdomain.com/current/wp-content/upload/2014/01/29/picture.png. Men /var/www/yourdomain.com/current er et symlink punkt til /var/www/yourdomain.com/releases/4/ som er vår nåværende utgave. Derfor er den faktiske filen plassert på: /var/www/yourdomain.com/releases/4/wp-content/upload/2014/01/29/picture.png.

Nå, hvis du har laget en ny utgave, nåværende vil peke på /var/www/yourdomain.com/releases/5. Filen /var/www/yourdomain.com/current/wp-content/upload/2014/01/29/picture.png er ikke lenger der, fordi /var/www/yourdomain.com/releases/5/wp-content/uploads er en ny mappe, uten innhold.

Som sådan må vi sette den inn i shared_paths, og Mina vil opprette en symlink til poeng /www/yourdomain.com/releases/5/wp-content/uploads til /www/yourdomain.com/shared/wp-content/uploads.

Konfigurer vår oppsettoppgave

Dette er oppgaven vi kjører på første gang for å forberede vårt servermiljø. Standardinnstillingen ser slik ut:

 Oppgave: setup =>: miljøet gjør køen! % [mkdir -p "# deploy_to / shared / log"] kø! % [chmod g + rx, u + rwx "# deploy_to / shared / log"] kø! % [mkdir -p "# deploy_to / shared / config"] kø! % [chmod g + rx, u + rwx "# deploy_to / shared / config"] kø! % [berør "# deploy_to /shared/config/database.yml"] kø% [echo "-----> Pass på å redigere 'shared / config / database.yml'."] slutten

La oss endre det til:

 Oppgave: setup =>: miljøet gjør køen! % [mkdir -p "# deploy_to / shared / wp-content / uploads"] slutten

Oppsettoppgaven oppretter bare en wp-innhold / opplasting katalog.

Konfigurer vår distribusjonsoppgave

Standard oppgave ser slik ut.

 Oppgave: deploy =>: Miljø deployer gjør # Legg ting som vil sette opp en tom katalog i et fullstendig oppsett av ditt prosjekt. påkalle: 'git: klone' påkalle: 'deploy: link_shared_paths' påkalle: 'bundle: install' påkalle: 'skinner: db_migrate' påkalle: 'skinner: assets_precompile' til: start kjøre "trykk # deploy_to / tmp / restart .txt "slutten slutten

Vi trenger ikke noe som har å gjøre med Rails. Også siden distribusjonen av WordPress ikke krever en webserver eller PHP-prosessstart, så trenger vi bare å påkalle git: klone og distribuere: link_shared_paths-oppgave.

La dem skifte til:

 Oppgave: deploy =>: Miljø deployer gjør # Legg ting som vil sette opp en tom katalog i et fullstendig oppsett av ditt prosjekt. påkalle: 'git: klon' påkaller: 'deploy: link_shared_paths' slutten

Konfigurer vår tilbakestillingsoppgave

Dessverre har Mina ikke en offisiell metode for tilbakeringing, så jeg opprettet en oppgave for vår egen tilbakekallingsprosess. Hva rollback oppgaven vil gjøre er at den vil fjerne nåværende utgivelse, og re point nåværende symlink til tidligere utgivelse. Legg til denne oppgaven på slutten av deploy.rb

 desc "Tilbakestill til forrige verison." oppgave: rollback =>: miljø gjør kø% [echo "----> Start å tilbakestille"] kø% [hvis [$ (ls # deploy_to / releases | wc -l) -gt 1]; ekko "----> Relink til previos release" && unlink # deploy_to / current && ln -s # deploy_to / utgivelser / "$ (ls # deploy_to / releases | tail -2 | head -1 ) "# deploy_to / current && echo" Fjern gamle utgivelser "&& rm -rf # deploy_to / utgivelser /" $ (ls # deploy_to / releases | tail -1) "&& echo" $ (ls #  deploy_to / releases | tail -1) "> # deploy_to / last_version && echo" Ferdig. Tilbakestill til v $ (cat # deploy_to / last_version) "; Ellers ekko "Ikke mer utgivelse for å tilbakestille"; fi] ende

Koden ovenfor ser kompleks ut, men det er faktisk en enkeltlinjeversjon av følgende kode. Jeg vil bryte den ned og legge en kommentar på toppen av hver kommando.

 # Sjekk om vi har 1 utgivelse hvis [$ (ls /var/www/yourdomain.com/releases | wc -l) -gt 1] ekko "----> Relink til previos release" # Fjern nåværende symlink unlink /var/www/yourdomain.com/current # Pek den til den forrige utgivelsen ln -s /var/www/yourdomain.com/releases/"$(ls/var/www/yourdomain.com/releases | tail -2 | head -1) "/var/www/yourdomain.com/current echo" Fjern gamle utgivelser "# Fjern siste utgivelse som vi allerede tilbakelevering rm -rf /var/www/yourdomain.com/releases/"$(ls / var / www / yourdomain.com / utgivelser | hale -1) "# Logg gjeldende versjon til last_version fil ekko" $ (ls /var/www/yourdomain.com/releases | tail -1) "> /var/www/yourdomain.com / last_version # Ut sett litt info til bruker ekko "Ferdig. Tilbakestill til v $ (cat /var/www/yourdomain.com/last_version)" ellers # Hvis vi ikke har mer enn 1 utgivelser, kan vi ikke vende tilbake. ekko "Ikke mer utgivelse for tilbakestilling" fi

På dette tidspunktet konfigurerer vi serveren, redigerer oppsettoppgave, distribuerer oppgave og tilbakestillingsoppgave. La begynne å faktisk bruke Mina nå.

Distribusjon med Mina

I denne delen vil jeg vise deg hvordan du kjører Mina til oppsett server, distribuere til server og utføre en tilbakestilling. Mina er et kommandolinjeverktøy. Du må ha tilgang til en terminal. Hver Mina-oppgave vil bli påkalt fra terminal.

Trinn 1. Forbered deg

Vi kjører bare dette første gangen vi forbereder oss på å distribuere til en server. SSH til server og opprett deploy_to katalogen. Det er /var/www/yourdomain.com i vårt tilfelle.

 $ ssh [email protected] # på fjernmaskinen din (etter at du er koblet til via SSH), kjør denne $ sudo mkdir -p /var/www/yourdomain.com $ sudo chown -R ditt navn /var/www/yourdomain.com

Når vi kjører chown kommando, vi vil endre eieren av /var/www/yourdomain.com til brukeren navnet ditt. Derfor kan ikke webserveren skrive noe til denne katalogen. Vårt WordPress-nettsted vil bli sikret på denne måten. Neste, på din lokale, løp mina oppsett. Det gir noe slikt ut:

 $ mina oppsett -----> Sette opp /var/www/yourdomain.com totalt 16 drwxr-xr-x 4 kurei root 4096 27 jan 22:51. drwxr-xr-x 3 rotrot 4096 Jan 27 00: 16 ... drwxr-xr-x 2 kurei-brukere 4096 27 jan 22:51 utgivelser drwxr-xr-x 2 kurei-brukere 4096 Jan 27 22:51 shared ----- > Ferdig. Forløpt tid: 1,00 sekunder

Hvis du vil bekrefte hva Mina opprettet for oss på serveren, la oss sjekke det på ekstern maskin:

 $ cd /var/www/yourdomain.com $ ls utgivelser delte $ ls delte / wp-innholdsopplastinger

På dette punktet er alt nesten klart. Husk at opplastingsmappen lagrer brukeropplastet innhold. Derfor må webserveren kunne skrive til den. Vi må avgjøre hvilken bruker Apache / Nginx (eller PHP FPM-prosessen, avhengig av hvordan du konfigurerer serveren din) kjører, og endrer eieren av opplastingsmappen til den, slik at webserver skrives til denne mappen. Vanligvis, hvis du åpner Apache config-fil eller Nginx config-fil, kan du finne denne brukeren, noe som ligner på:

[Sourecode]
# For Apache, åpne /etc/httpd/conf/httpd.conf
Bruker www Gruppe www

# For Nginx, åpne /etc/nginx/nginx.conf

bruker http http; worker_processes 2;
[/ Sourecode]

La oss anta at Apache kjører på www bruker.

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

Trinn 2. Distribuere

Hver gang vi vil distribuere koden, bruker vi denne oppgaven.

Prosessen er:

  • oppdater koden
  • forplikte forandringen.
  • trykk til Git-serveren.

Når koden din var oppe på Git-serveren.

La oss distribuere

 $ mina distribuere

Om noen sekunder skal det være ferdig. Her er et eksempel utgang av distribusjonsresultat:

 $ mina distribuere -----> Opprette en midlertidig byggesti -----> Hente nye git commits -----> Bruke git grenen 'master' Cloning til '.' ... ferdig. -----> Bruke denne git commit kureikain (347d9b3):> Oppdater ny config / deploy -----> Symlinking delte baner -----> Bygg ferdig -----> Flytt bygg til utgivelser / 2 -----> Oppdaterer gjeldende symlink -----> Lansering -----> Done. Utplassert v2 Forløpt tid: 1,00 sekunder

Trinn 3. Tilbakestilling

Hvis en utgave har en kritisk feil, eller bare vi ønsker å tilbakestille koden til tidligere utgave av en eller annen grunn, gjør vi dette:

 $ mina tilbakebetaling

Dens produksjon er noe som

 ----> Begynn å tilbakestille ----> Tilbakestill til forrige utgave Fjern gamle utgaver Utført. Tilbakestilling til v2 Tilkobling til axcoto.com stengt. Forløpt tid: 0,00 sekunder

Konklusjon

Du lærte å distribuere med Mina. Utplasseringsprosessen er ganske rask nå. Nettstedet ditt vil oppleve null nedetid. Men ikke stopp ved det, gå til Mina-nettstedet og lene mer om det. Jeg delte et eksempel på WordPress-prosjekt som bruker Mina på GitHub.

I neste del lærer vi om WP-CLI. Spesielt vil vi lære å utnytte det og utføre vanlige adminoppgaver, for eksempel å oppdatere WordPress, installere temaer, plugins og så videre alle via WP-CLI på toppen av en Mina-oppgave. Vi vil også se på hvordan vi bruker den for å gjøre vår WordPress-installasjon mer sikker.

Inntil da, legg en kommentar til hva du gjør for å gjøre WordPress-distribusjonen til en bris.