Hlavní navigace

nixos + nginx + maridab | postgresql + PHP

21. 2. 2024 11:52 Živoslav Petr Bolf

nějaké kecy úvodem

Pamatuješ na LAMP? Byla s tím spousta legrace. Kdysi dávno, když ještě pán z Cukrové hory tahal kačera po chodbách Hardwardovy univerzity nebylo úplně jednoduché psát kraviny do všech těch internetů. Potřeboval jsi http server, PHP a databázi. A to vše krásně běželo na linuxu a o dost hůř na windows (WAMP).

Nedávno mi kamarádka IT světem nepolíbená říkala, že ty www stránky se už dnes moc nepoužívají. Tak je pravda, že si spousta lidí vystačí s propagací na sociální síti a pro náročnější věci potřebují v první řadě apku pro android a iphone. To sme to dopracovali. Celý život kopu za svobodný software, vysvětluji proč je M$ zlo, aby nakonec na tom svobodném software někdo vybudoval cenzurované globální sociální sítě a defacto uzavřenou platformu pro počítače do kapsy pro každodenní použití.

Webové stránky nejsou mrtvé. Můžeš na nich mít svůj vlastní cloud, galerii a úložiště fotek a i ten blog má smysl. Statické html stránky jsou jednoduchá technologie, která zažívá renesanci. Http server, databáze a případně i to PHP jsou pořád základ, na kterém lze stavět.

Jak se změnil klasický LAMP?

- L jako linux zůstává, nicméně je možné přijmout radikální proměnu v podobě nixos – je to pořád linux, neboj ništ, ale adminuje se trochu jinak

- A jako apache může zůstat, nicméně myslím si, že většina lidí dává přednost alterativnímu http serveru nginx. Já mám takový pocit, že od té doby, co ho koupila firma F5 tak to není úplně dobré, ale a tady se ukazuje síla svobodného software a moudrost pana Stallmana – jestvuje několik dobrých forků. Geopolitická citlivá záležitost je to, že nginx vznikl v Rusku. Další citlivá záležitost je to, že Richard Stallman se nějak škaredě vyjádřil v aféře Jeffrey Epsteina a „byl odejit“ z funkci prezidenta FSF a opustil MIT. To se děje v jeho svobodné zemi. Tohle není blog o politice a to, že svět se zbláznil můžeme řešit jinde. Chtěl jsem jen říct, že používám Angie, čte se to skoro stejně jako nginx, vyvíjí to stejní lidé, bez hlavního vývojáře Syslova. Dělají to někde na Sibiři, nebo kde a mě to je asi jedno. Byznys model nginxu se mi nelíbí, čínský forky nechci a nemyslím si, že by Putin zasahoval do zdrojových kódů http serveru. Respektive, kdyby chtěl, může strkat nos do jakéhokoliv otevřeného zdrojového kódu a stejně by mu to k ničemu nebylo. Takže písmeno A pro mě znamená teď Angie místo Apache.

- M jako myslql prošlo podobným byznysovým tlakem jako nginx. Vznikl fork zvaný mariadb a jako pohan musím uznat, že panenka Maria nad tím drží ochranou ruku. Mariadb je dobře fungující projekt, který původní mysql strčil do kapsy.

- u databáze ještě zůstaneme. Už v tom webovém pravěku byla možnost nahradit mysql databází postgresql. Tahle možnost pořád zůstává. Postgresql je pokročilejší databáze, umí toho víc, i když v řadě věcí se jí maridb vyrovná. Nicméně platí pořád, že mysql/mariadb je lehší, jednodušší a ve většině případů stačí, postgresql je robustnější řešení. Já používám obě databáze.

-  P je poslední písmeno ve zkratce LAMP a znamená PHP. Upřímně, myslím si totéž co původní autor PHP Rasmus Lerdorf a s ním celá řada dalších lidí. PHP nejde dobrou cestou. Ale to v zásadě nevadí. V PHP je vytvořeno spousta věcí, wordpress, který ovládá nemalou část internetu, nextcloud, matomo a piwick, dvě svobodné alternativy ke google analytics a spousta dalších užitečných věcí, které nemají náhradu napsanou v žádném lepším ani horším, ale o to propagovanějším jazyce. Osobně se snažím preferovat statické stránky před PHP, dost věcí lze řešit díky API a javascriptu. Když si třeba rozběhneš postgrest (je napsaný v haskellu, ale neboj nic) máš pěkný a robustní API nad postgresql databází a můžeš už řešit jen frontend.

prakticky k věci

Zjistil jsem, že nejjednodušší je to s instalací mariadb. K tomu stačí v nixu úplně jednoduchý skript.
{config,pkgs,}:
{

services.mysql ={
enable =true;
package =pkgs.mariadb;
};

}

Kdyby mysql bylo pořád mysql stačilo by je to enable = true, ale takhle je to trochu matoucí. Chci službu mysql, ale balíček mariadb. Aspoň vidíš, jak je důležitá znalost historie, včetně historie vývoje softwarových prodktů.

Řeším ještě nastavení výchozího uživatele a hesla, ale ty asi nebudu řešit přes nix. Je to součást té databáze a buď se tam přidají sql importem, nebo se pomocí sql vytvoří a pak průběžně zálohují s celou databází a v případě instalace na jiný server zase naimportují.

V případě postgresl databáze se to dělá v nixu skoro stejně.

{config,pkgs,}:

{
# …
config.services.postgresql ={
enable =true;
ensureDatabases =[„test];
authentication =pkgs.lib.mkOverride10</span></div><div><span> #type database DBuser auth-method</span></div><div><span> local all all trust</span></div><div><span>;
};
}

Tenhle konfigurák jsem opsal. Je tu navíc nastavení autnetizace a upřímně, tu syntaxi úplně nechápu. Zatím jsem se ještě nedostal k tomu to nějak víc studovat.

Http server se nastaví a nainstaluje také dost poodbným způsobem.

{config,pkgs,}:
{

services.nginx.package =pkgs.angie;

# services.nginx.package = pkgs.angieQuic; # HTTP/3.

environment.systemPackages =
withpkgs;
[
angie
];

services.nginx.enable =true;

security.acme ={
acceptTerms =true;
defaults.email =acme@example.com;
};
}

Teď se dívám, že v případě databází jsem vůbec neuváděl, že se má databáze nainstalovat. To je ta část environment.systemPackages =. Ta u těch databází úplně chybí a nixos to ninstaloval i bez toho. Je v tom hodně magie. Možná to není potřeba ani zde a stačilo by je to services.nginx.package = pkgs.angie; . Nezkoušel jsem to.

Poodbně jako u mysql / mariadb i zde říkám, že sice chci nginx, ale vlastně nechci nginx, ale jeho fork angie.

Nemám zatím jednotnou štábní kulturu a tak si schválně všimni, že třeba zapnutí služby services.enable mám různými způsoby. Jednou jako celá cesta, jednou v závorkách {}. U postgresql je delší cesta config.services.. u maridab je vidět, že stačí začít jen tím services a to config si tam doplní sám. Je to asi díky tomu, že config config se předává úplně na prvním řádku jako parametr funkce. Všechny tyhle konfigurace jsou funkce a podle toho se s tím i pracuje.

Ještě zbývá PHP. Jak jsem se už zmínil, všechno hledám ve wiki dokumentaci a nix je pro mě pořád cizí jazyk, kde sotva rozumím základním frázím. Ale domluvím se a server nakonec jede jak má. Budu psát i další zkušenosti. Takže PHP má takovouto konfiguraci.

{config,pkgs,}:
{

environment.systemPackages =
let
php =pkgs.php.buildEnv{ extraConfig =memory_limit = 2G;};
in[
php
];

services.phpfpm.pools.mypool ={
user =nobody;
settings ={
pm=dynamic;
listen.owner=config.ser­vices.nginx.user;
pm.max_children=5;
pm.start_servers=2;
pm.min_spare_servers=1;
pm.max_spare_servers=3;
pm.max_requests=500;
};
};
}

Tady je vidět, že těch nastavení je vícero. Co to znamená není těžké pochopit, proč se to píše zrovna takto, to už je na pochopení složitější. Mate mě, že tu chybí obligátní „enable=true“ a přesto mi na serveru php jako služba.

Tak to je pro dnešek vše. Máme funkční základní nixos-http-mariadb/postgresql-php server. Slušná nápověda, ze které jsem čerpal je na wiki projektu nixos. Jsem ve fázi objevování a hledání, takže nemám žádné best practicies ohledně nixu. Včera jsem se zmínil o tom, že vzhledem k tomu, jak to vše funguje, přijde mi jako docela dobrý nápad neoddělovat http server a databázový server a úplně se obejít bez proxy haproxy serveru. Ano, napadá mě spousta argumentů, proč to je blbost, ale myslím si, že to jsou argumenty pro většinu případů zbytečné.  

Sdílet