Migrējam no WAMP uz Vagrant

Rakstā aprakstīts kā darbojas WAMP un Vagrant, par abu tehnoloģiskām priekšrocībām un trūkumiem. Iemesliem, kāpēc būtu vai nebūtu jāmigrē no vienas izstrādes vides uz citu. Aprakstīta uzstādīšanas gaita un problēmas ar kurām saskāros un kā tās tika atrisinātas.

Izstrādājot lielākus vai mazākus projekts (interneta vietnes, rīkus, sistēma) PHP/MySQL, var nonākt situācijā, kad produkcijas vide atšķiras no izstrādes vides. PHP un MySQL ir pieejams gan uz MS Windows, gan Mac, gan Linux, bet hostējas tādi projekti lielākoties uz Linux serveriem. Standarta PHP funkcionalitāte visās vidēs būs līdzīga, taču specifiskākiem projektiem produkcijas vide var piedāvāt specifiskus servisus, piemēram, Memcached, kurš šķiet joprojām nav portēts uz Windows.

Raksts paredzēts auditorijai, kurai jau ir pieredze ar PHP. Projektu izstrādē izmanto Apache/PHP/MySQL, kā arī citiem interesentiem, kuriem ir interese par Vagrant.

Izstrādes vide: MS Windows (7, 8.1, 10). 
Vagrant versija: 1.81. 
WAMP versija: 2.5 (MySQL  5.6.17;  PHP 5.5.12)

Kas ir WAMP?

WAMP ir programmu paka, abriviatūra vārdiem Windows/Apache/MySQL/PHP. Vēsturiski izveidojies, ka PHP rakstītos skriptus produkcijas vidē hostē uz Linux, WEB servera funkcijas pilda Apache, bet dati tiek glabāti MySQL datubāzē. Linux videi šo programmatūras paku sauktu par LAMP, bet Mac – MAMP, bet Windows - WAMP.

Kas ir Vagrant?

Vagrant ir palīgrīks, kurš automatizē virtuālās mašīnas uzstādīšanu un failu kopēšanu uz virtuālo mašīnu. Pats par sevi Vagrant nav ne Linux, ne vizualizācija programmatūra. Tamdēļ Vagrant neatņemama sastāvdaļa ir VirtualBox (vai VMWare).

No ilustrācijām redzams, ka divas lietas paliek nemainīgas: PHP fails jūsu datorā, veids kā interneta pārlūks iegūst un parāda rezultātu. Tā kā Vagrant gadījumā datorā vairs nav servisa, kurš kalpotu par web serveri, visus pieprasījumus pāradresējam uz virtuālo mašīnu. Pāradresējam arī datubāzes savienojuma pieprasījumus. Ar "pāradresēt pieprasījumus" šajā gadījumā jāsaprot ar portu pāradresāciju. Attiecīgi, Apache no host:80 uz guest:80, MySQL no host:3306 uz guest: 3306.

Mērķis ir pārslēgties no WAMP uz Vagrant saglabājot iespēju pārslēgties atpakaļ (attiecīgi visi pieprasījumi ietu caur WAMP).

1. Instalējam VirtualBox.

Lejuplādējam šeit – [1] un instalējam. Šī ir virtualizācijas programma, kas vēlāk ļaus izveidot virtuālās mašīnas (datorus).

2. Uzstādam Vagrant.

Lejuplādējam šeit – [1]. Manā gadījumā dati glabājas D:\ diskā, arī web projekti: D:\wamp\www. Instalējot norādam, ka arī Vagrant lai instalējas D:\HashiCorp. 

Svarīgi! 
Vagrant ideja tāda: atveram projekta folderi un startējam Vagrant. Katram (!) projektam tiek izveidota sava (!) virtuālā mašīna. Attiecīgi, viss ko sakonfigurēsiet vienam projektam nebūs pieejams citam. Ja PHP projektu nav daudz, varbūt ir vērts Vagrant darbināt www pamatfolderī.

Manā gadījumā izmantojam vienu projektu “tests”.

3. Konfigurējam Vagrant.

Atveram projekta folderi un komanrindā (cmd) izveidojam virtuālo mašīnu. Vagrant sarūpējis preinstalētās virtuālās [4] mašīnas, līdz ar to papildus instalēt neko nevajadzēs. Ne mazāk pārsteidzoši, ka pieejamas arī Windows prekonfigurētās mašīnas (trial?). Izmantošu Debian/Jessie64.

vagrant init debian/jessie64

Projekta folderī tiek izveidots Vagrantfile fails, kurā glabāsies projekta konfigurācija. Norādām, kurus portus pāradresēt un kurus folderus sinhronizēt. 

config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.network "forwarded_port", guest: 3306, host: 3306

Pēc noklusējuma, Vagrant sinhronizē projekta (.) folderi uz /vagrant. Tas mums neder, tamdēļ atslēdzam un norādam, lai sinhronizē uz /var/www/html/tests

config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder ".", "/var/www/html/tests", type: "rsync", owner: "www-data", group: "www-data", create: true 
vagrant up

startējot pirmo reizi, Vagrant lejuplādēs Debian/Jessie un konfigurēs virtuālo mašīnu, un...

“rsync” could not be found your PATH. (skat attēlu 1)

4. Instalējam Cygwin.

Lejuplādējam šeit – [3] un instalējam. Cygwin ir programma, kura ļauj uzinstalēt Linux programmas, kuras tiek darbinātas uz Windows. Nepieciešams: rsync un ssh (skat attēlu 5 un 6). Pārbaudām vai uzstādījies PATH. Advanced system settings > Advances > Environment Variables > pie Path jābūt D:\cygwin\bin (vai C: diska, ja instalējāt tur; tam, kur instalējat nav nozīmes).

vagrant reload

Rsyncing folder:
0 [main]  rsync 4732 D:\cygwin64\bin\rsync.EXE: *** fatal error in forked process – fork: can't reserve memory for parent stack 0x600000 – 0x800000. (skat attēlu 2)

Jāteic, 64 bitu cygwin komandu rsync uz 64 bitu MS Windows 10 tā arī neizdevās iedarbināt, lai arī bez komandrindas parametriem tā darbojās. Dzēšam 64 bitu versiju un instalējam 32.

vagrant reload

un... nekā. (skat attēlu 3)
There was an error when attempting to rsync a synced folder,
Please inspect the error message below for more info.

Svarīgi! Šis ir Vagrant bugs. No tā tik vaļā izdevās veicot labojumu Vagrant vienā no failiem – d:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.1\plugins\synced_folders\helper.rb

Atrodam:

        rsh = [
          "ssh -p #{ssh_info[:port]} " +
          proxy_command +
          "-o ControlMaster=auto " +
          "-o ControlPath=#{controlpath} " +
          "-o ControlPersist=10m " +

          "-o StrictHostKeyChecking=no " +
          "-o IdentitiesOnly=true " +
          "-o UserKnownHostsFile=/dev/null",
          ssh_info[:private_key_path].map { |p| "-i '#{p}'" },
        ].flatten.join(" ")

labojam uz:

        rsh = [
          "ssh -p #{ssh_info[:port]} " +
          proxy_command +
          "-o StrictHostKeyChecking=no " +
          "-o IdentitiesOnly=true " +
          "-o UserKnownHostsFile=/dev/null",
          ssh_info[:private_key_path].map { |p| "-i '#{p}'" },
        ].flatten.join(" ")

vagrant reload

un vu-a-la! (skat attēlu 4)
Tik vien, ka virtuālā Linux (Debian) mašīnā nav uzstādīts ne PHP, ne Apache, ne MySQL.

5. Uzstādām Apache/Mysql/PHP

Iekļūt virtuālajā mašīnā var caur ssh. Tā kā, līdz ar cygwin uzinstalēšanu, pieejama ssh komanda, varam izmantot to.

ssh vagrant@127.0.0.1 -p 2222

parole: vagrant.

apt-get install apache2 php5 php5-mysqlnd mysql-server mysql-client

kad programmatūras pakas uzinstalētas, atliek veikt konfigurācijas labojumus MySQL serverim.

5.1. Lai varam pievienoties ne tikai no lokālās adreses:

sudo nano /etc/mysql/my.cnf
# bind-address = 127.0.0.1
Ctrl+X un Y

5.2. arī root lietotājam nosakām, lai ļauj vienoties no jebkuras IP adreses:

use mysql;
update user set host='%' where user="root" and host="localhost";
flush privileges;
exit;

sudo service mysql restart

Apache un php nekādas papildus konfigurācijas nav jāveic.

Interneta pārlūkprogrammā rakstot: http://localhost/tests būs atrodmi projekta "tests" faili.

Noslēguma piezīmes

Vagrant pats neskatās vai ir veikti labojumi projekta failos. Sinhronizācija notiek startējot vai rakstot komandu vagrant rsync. 

Svarīgi! vagrant rsync-auto ir komanda, kas visu laiku (!) pārbaudīs vai ir izmaiņas projekta failos un tās sinhronizēs.

Secinājumi:

Pēc būtības Vagrant ir apmēram tas pats, kas uzstādītu virtuālo vai reālo Linux serveri un failus no lokālā datora kopētu uz serveri. Vagrant kā arī tika solīts ir tikai palīgprogramma, kas atvieglo darbības.

Tas, ka virtuālā linux datorā varat izmantot visus linux vidē pieejamos instrumentus un servisus, pat vēl vairāk – izstrādāt jaunus, nevajadzētu aizmirst, ka produkcijas vide, jeb vide, kur projekts atradīsies, kad būs izstrādāts, var atšķirties no jūsu testa vides. Pirms izmantot kādu papildus rīkus, der tomēr noskaidrot, vai tādi būs pieejami arī produkcijas vidē.

Avoti:
[1] https://www.virtualbox.org/
[2] https://www.vagrantup.com/downloads.html
[3] https://www.cygwin.com/
[4] https://atlas.hashicorp.com/boxes/search

Dalies:
Novērtē: 5 (1)

komentāri

Mr. V

Nav korekti dēvēt to par servera stack'a migrāciju, jo nekāda migrācija jau nenotiek, tu migrēt vari no Apache uz Nginx. Tas, ka uzliek konteineri pa vidu, nav migrācija.  

Kā arī, ja neizmanto to pašu Vagranta konfigurāciju arī produkcijā, tad jēgas nav no tā Vagranta... sēdi da kaut uz tā Windowsa kā iepriekš vai vienkārši palaid Linuhu parastā VirtualBoxā.

Ēriks
Mr. V

Atšķirībā no Docker, Vagrant izmanto virutālo mašīnu (VM), līdz ar to, vide, kurā tiek darbināts kods var būtiski atšķirties no darbastacijas OS. Nav šķēršļu arī VMā Apache vietā izmantot Nginx, Mysql vietā - Postgres, utt. Rakstā izmantots vienkāršotais scenārijs, ar iespējami mazāk darbībām, lai no WAMP pārceltos uz Vagrant.

Cache

Memcached jau gadu simteņus ir "portēts" uz Win un ir bez problēmām uzstādāms



Ko lasa citi?