Škálovatelný PHP hosting s podporou Git deploymentu

7. 4. 2014
Doba čtení: 7 minut

Sdílet

Programujete v PHP a závidíte kolegům s Ruby/Node.js cloudovou platformu Heroku? Deployment přes git push, škálování posunutím slideru a změnu verze jedním tlačítkem? Možná chcete taky něco víc než jen archaické nahrávání zdrojáků přes FTP, které už do moderní doby nepatří. Existuje řešení i pro PHP.

Přestože články o výhodách deploymentu přes VCS (nejčastěji Git) kolují internetem už řadu let a přestože je PHP platformou s nejširším hostingovým ekosystémem, většina webhosterů stále nabízí pouze archaické FTP. PaaS služby typu Heroku (platforma, databáze, deployment strategie, logování…) byste pro PHP spočítali na prstech jedné ruky nepříliš zdatného dřevorubce. A jednu z nich – pro někoho možná překvapivě – provozuje Microsoft.

Korporátní vsuvka: V posledních letech Microsoft prochází velkou transformací. Snaží se být méně závislý na prodeji softwaru, místo toho se orientuje na služby. A ty prodává bez ohledu na ideologii open source/proprietární – používejte si, co chcete, když jim za to zaplatíte.

Moje první Azure Website

Azure nabízí hosting v několika plánech, první použitelný je Shared Plan za zaváděcí cenu cca 10 dolarů za měsíc (nižší Free není možné provozovat na vlastní doméně). Je to tedy citelně více, než je „český standard“, a je tedy na vašem zvážení, zda vám pokročilé služby na Azure za to stojí.

Nová Website se jako všechny ostatní služby dá naklikat z webové administrace. Stačí v levém menu vybrat druhou položku a kliknout na velké New, poněkud nelogicky umístěné v liště úplně dole (vůbec, tu šedou lištu s velice užitečnými kontextovými možnostmi lze až moc snadno přehlédnout). V režimu Quick Create si vyberete pouze URL, na které služba bude běžet, a region (v ČR bývá nejrychlejší West Europe). Defaultně se účtuje Free plan, který lze jedním kliknutím změnit na vyšší.

Dalším krokem pro nás bude nastavit deployment. To najdeme na dashboardu za odkazem „Set up deployment from source control“. Máme na výběr z řady možností, od zmíněného Gitu (lokálního, hookovaného na GitHub nebo Bitbucket) přes firemní Visual Studio až po dost netradiční Dropbox deploy, kdy můžete publikovat web z vybrané složky v Dropboxu. Zase věřím, že takhle by byla schopná spravovat web i má babička. Já budu dále používat lokální Git.

Po zvolení vašeho jména a hesla (SSH klíče bohužel Azure neumí) by na vás měl svítit HTTPS odkaz k novému prázdnému repozitáři. Můžete si ho naklonovat nebo, pokud už „doma“ repo máte, přidat jako remote. Máte k němu plná práva, tedy včetně push –force.

Pro začátek zkusme pushnout phpinfo, ať víme, na čem jsme:

veproza@veproza:/srv$ git clone https://veproza@test-root.scm.azurewebsites.net:443/test-root.git
Cloning into 'test-root'...
Password for 'https://veproza@test-root.scm.azurewebsites.net:443':
warning: You appear to have cloned an empty repository.
veproza@veproza:/srv$ cd test-root/
veproza@veproza:/srv/test-root$ echo "<?php phpinfo();" > index.php
veproza@veproza:/srv/test-root$ git add .
veproza@veproza:/srv/test-root$ git commit -m "phpinfo"
[master (root-commit) 5f830e9] phpinfo
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 index.php
 veproza@veproza:/srv/test-root$ git push
 Password for 'https://veproza@test-root.scm.azurewebsites.net:443':
 Counting objects: 3, done.
 Writing objects: 100% (3/3), 243 bytes, done.
 Total 3 (delta 0), reused 0 (delta 0)
 remote: Updating branch 'master'.
 remote: Updating submodules.
 remote: Preparing deployment for commit id '5f830e91ea'.
 remote: Generating deployment script.
 remote: Generating deployment script for Web Site
 remote: Generated deployment script files
 remote: Running deployment command...
 remote: Handling Basic Web Site deployment.
 remote: KuduSync.NET from: 'D:\home\site\repository' to: 'D:\home\site\wwwroot'
 remote: Deleting file: 'hostingstart.html'
 remote: Copying file: 'index.php'
 remote: Finished successfully.
 remote: Deployment successful.
 To https://veproza@test-root.scm.azurewebsites.net:443/test-root.git
  * [new branch]      master -> master
  

Běžná práce s gitem, navíc se po pushi vrací i realtime log deploymentu – hned v konzoli tedy víte, zda vše proběhlo v pořádku.

Výstup PHPInfo – máme moderní PHP 5.5 a moduly, na které jsme zvyklí. Jediný zádrhel může být, že jsme na Windows Server 2012 – Microsoft se svým altruismem nejde až tak daleko, aby nasazoval Apache.

Něco většího – Nette Framework

Podobně jako je PHP nejčastější jazyk menších webových projektů, je Nette v ČR asi nejoblíbenější PHP framework, zkusíme tedy deploynout ten. Postup je stejný jako výše, jen předsadíme vytvoření projektu composerem (a já přejdu z bashe na mně bližší powershell):

PS C:\wamp\www> mkdir .\nette-root
PS C:\wamp\www> cd .\nette-root
PS C:\wamp\www\nette-root> composer create-project nette\sandbox .
PS C:\wamp\www\nette-root> git init
PS C:\wamp\www\nette-root> git add .
PS C:\wamp\www\nette-root> git commit -m "init"
PS C:\wamp\www\nette-root> git remote add azure https://veproza@test-root.scm.azurewebsites.net:443/test-root.git
PS C:\wamp\www\nette-root> git push azure master

Nyní je ale na webu místo úvodní stránky frameworku pouze hláška „You do not have permission to view this directory or page“. Nette totiž počítá s tím, že jako root bude použita podsložka /www (a z webu nebude přístup do složek app, log a dalších). Oprava je snadná, v záložce Configure úplně dole změníme kořenový adresář z site\wwwroot  na  site\wwwroot\www.

Nyní se už nezobrazuje vůbec nic a vrací se HTTP 500, můžeme tedy otestovat debugovací schopnosti hostingu. Na Azure se k logům dostanete přes (S)FTP, jeho adresa je na dashboardu administrace websity. Používá login a heslo stejné jako do Gitu, ale s jednou záludností: username je prefixovaný názvem website, tedy ve tvaru website\username. Po přihlášení nás bude zajímat složka LogFiles a v ní soubor  php_errors.log.

[05-Apr-2014 06:49:35 America/Los_Angeles] PHP Warning:  require(D:\home\site\wwwroot\app/../vendor/autoload.php): failed to open stream: No such file or directory in D:\home\site\wwwroot\app\bootstrap.php on line 3

Chyba je jasná – v balíčku je rovnou rozumný gitignore, který zakazuje trackování modulů třetích stran a specifické konfigurace config.local.neon. Naštěstí použití Gitu nevypne možnost uploadu přes FTP, netrackované soubory tedy nahrajeme ručně. Web sídlí v adresáři  /site/wwwroot.

U defaultně nastaveného Nette se FTP hodí také pro prohlížení výstupu Laděnky – ta uklízí chybové hlášky do z webu nepřístupného adresáře /log a uživatelům místo nich zobrazuje lidsky čitelnou omluvu. A jinak než přes FTP se k logům nedostaneme.

Databáze a vlastní extensions

Hosting bez podpory databáze by velkou díru do světa neudělal. Azure nabízí svůj SQL Server, opensourcové MySQL a pro NoSQL nadšence Storage Tables. Oba SQLy jsou zdarma do 20 MB, za větší si paušálně připlatíte podle objemu; Tables jsou účtovány podle počtu transakcí a množství dat podobně, jako statické soubory v Blob Storage.

Pro účely předvedení budu používat SQL Server, protože na rozdíl od MySQL nemá defaultně nainstalovanou PDO extension. Můžeme si tedy ukázat, jak se instaluje a že na Azure lze PHP customizovat daleko za obvykle nabízené .user.ini/ .htaccess (ty jsou tu nastavitelné také).

Požadovanou extension je třeba sehnat ve VC9 NTS verzi, zde tedy php_pdo_sqlsrv_54_nts.dll. Tu následně gitem nebo (lépe) přes FTP uploadneme na server. Poté již stačí v Azure Portalu zvolit záložku Configure a v sekci App Settings přidat klíč PHP_EXTENSIONS s cestou k DLL, např. bin\php_pdo_sqlsrv_54_nts.dll, pokud je extension ve webové složce  site/wwwroot/bin.

Po vteřinovém restartu serveru by již phpinfo mělo hlásit přítomnost nového pdo_sqlsrv a my se můžeme věnovat vytvoření serveru. V sekci SQL Databases je opět dole tlačítko Add New, zde však nedoporučuji volit Quick Create a zvolit místo toho Custom. Quick totiž zvolí defaultní řazení podle Latin 1, což je pro češtinu a její diakritiku nevhodné.

Po vytvoření databáze je tu opět „welcome screen“ se dvěma užitečnými odkazy: Design your SQL Database, což je SQLSRV varianta PHPMyAdmina. Druhý je „View SQL Database connection strings for ADO .Net, ODBC, PHP, and JDBC“, kde je v copy&paste friendly formátu napsána konfigurace připojení k této konkrétní DB. PHP kód je bohužel (v době psaní článku) trochu rozbitý, pro čitelnost je potřeba nahradit \r\n skutečným newline a odescapovat uvozovky. Pak na vás vykoukne connection string, který lze zkopírovat do config(.local).neon, zhruba následovně:

ict ve školství 24

nette:
    database:
        dsn: 'sqlsrv:server = tcp:us5zs5to1s.database.windows.net,1433; Database = db2'
        user: dbuser
        password: dbpass

Po nahrání nového configu na server by již měla databáze pracovat. V mém testu odpovídá na jednoduché dotazy během 2–3 ms, latence je tedy vcelku standardní a výkon samozřejmě škálovatelný.

Shrnutí

Azure nabízí jednoduše spravovatelnou a přitom výkonnou platformu pro PHP a databázi dle vaší volby. Výhodou je snadné a rozsáhlé škálování (pokud je na víceinstancový běh napsána aplikace), včetně možnosti počet instancí měnit automaticky podle aktuálního zatížení nebo denní doby. Přes uzavřený „feel“ platformy jde PHP nastavit dle libosti, včetně načtení vlastních extensions nebo celého CGI runtime. Na druhou stranu si za to Microsoft nechá velmi dobře zaplatit, takže malým webům bez růstového potenciálu se málokdy vyplatí.

Autor článku

Marcel Šulek je vývojář webových i mobilních aplikací, vystudovaný dopravní pilot, nyní redakční vývojář IHNED.cz.