Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| sterretje-cluster:cluster-hosting [2016/10/06 17:14] – matthias | sterretje-cluster:cluster-hosting [2026/05/27 14:01] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== |
| - | + | Het hosten van webapplicaties | |
| - | Bij NPO ICT bestaan twee hosting clusters. | + | we het |
| - | Het zgn Applicatie Cluster (appcluster) is een omgeving ingericht | + | noemen. Dit is een omgeving die is toegespitst op het |
| - | die is toegespitst op het hosten van willekeurige Java, PHP en Ruby on Rails | + | hosten van willekeurige |
| - | web-applicaties. | + | |
| - | Het Webservices Cluster (webcluster) is toegespitst op het hosten | + | |
| - | van high-volume sites. Hier worden alleen statische | + | |
| - | html") specifieke door NPO ICT geaccepteerde PHP applicaties gehost. | + | |
| - | + | ||
| - | Het app- en het webcluster zijn volgens dezelfde structuur opgebouwd. | + | |
| - | Dit document beschrijft het gemeenschappelijke stuk in de inrichting | + | |
| - | van het appcluster en het webcluster. | + | |
| - | Daarnaast zijn er de zusterdocumenten | + | |
| - | [[appcluster-hosting|Appcluster Hosting]] | + | |
| - | en | + | |
| - | [[webcluster-hosting|Webcluster Hosting]] | + | |
| - | die de specifieke eigenschappen van beide clusters beschrijven. | + | |
| - | + | ||
| - | ===== Inleiding ===== | + | |
| - | Bij NPO ICT zijn twee omgevingen ingericht, die samen een | + | |
| - | aantal webhostingmogelijkheden bieden. | + | |
| - | Het zgn Applicatie Cluster (appcluster) | + | |
| - | die is toegespitst op het hosten van willekeurige | + | |
| web-applicaties. | web-applicaties. | ||
| - | In deze omgeving hanteert NPO ICT geen acceptatiecriteria | ||
| - | en zullen wij dus proberen om elke site te hosten. | ||
| - | Het Webservices Cluster (webcluster) is toegespitst op het hosten | ||
| - | van high-volume sites. Hier worden alleen statische websites (" | ||
| - | html") specifieke door NPO ICT geaccepteerde applicaties gehost. | ||
| - | In het webcluster wordt gestreefd naar 24x7 beschikbaarheid, | ||
| - | sites die daar draaien zijn per definitie gebouwd met behulp van High | ||
| - | Availability technieken. In het appcluster is dit optioneel, maar veel voorkomend en vaak ook gewenst. | ||
| - | Naast het app- en het webcluster is er ook een testcluster beschikbaar. | + | Naast het zgn " |
| - | Dit testcluster is op dezelfde manier opgezet als de productieclusters | + | functionaliteiten aan die in hun eigen clusters zijn ondergebracht. |
| - | en kan gebruikt worden als testomgeving voor zowel het app- als het | + | ^ naam ^ wat doet het^ |
| - | webcluster, | + | | appcluster | webhosting voor het hosten van willkeurige web-applicaties | |
| + | | backendcluster | webhosting van ondersteunende diensten, uitsluitend bedoeld voor omroepmedewerkers, | ||
| + | | dnscluster | domeinregistratie | ||
| + | | mediacluster | streaming platform | | ||
| + | | testcluster | testomgeving voor m.n. het appcluster | | ||
| + | | webcluster | ||
| - | Beide omgevingen zijn server clusters bestaande uit twee loadbalancers, | + | Bovenstaande |
| een aantal web-, applicatie- en database servers. Alle data bevindt zich | een aantal web-, applicatie- en database servers. Alle data bevindt zich | ||
| op centrale, betrouwbare storage servers. | op centrale, betrouwbare storage servers. | ||
| Line 48: | Line 26: | ||
| De hardware, het OS, de web-, applicatie- en databaseservers worden | De hardware, het OS, de web-, applicatie- en databaseservers worden | ||
| - | beheerd door NPO ICT, wat garant staat voor een | + | beheerd door NPO Hosting en Streaming, wat garant staat voor een |
| stabiele, veilige omgeving. | stabiele, veilige omgeving. | ||
| In het appcluster kunt u uw eigen applicaties zelf beheren, uitbesteden | In het appcluster kunt u uw eigen applicaties zelf beheren, uitbesteden | ||
| - | aan NPO ICT of aan een derde partij. | + | aan NPO Hosting en Streaming |
| - | In het webcluster worden de applicaties uitsluitend beheerd door | + | |
| - | NPO ICT, waarbij NPO ICT delen van het beheer kan | + | |
| - | delegeren aan derden. (b.v. de makers van een applicatie) | + | |
| - | + | ||
| - | Vragen? Deze kunnen gericht worden aan de NPO ICT Servicedesk < | + | |
| - | + | ||
| - | ==== Standaard Software ==== | + | |
| - | Alle omgevingen zijn zoveel mogelijk gebaseerd op open source software | + | |
| - | componenten: | + | |
| - | Wij zijn namelijk overtuigd van de kracht van open source en bij NPO ICT is zeer kennis aanwezig van de gebruikte open source componenten. | + | |
| - | + | ||
| - | ^ Component ^ Versie ^ Opmerkingen ^ | + | |
| - | | OS | Scientific Linux 6, 64 bit | Scientific Linux is gebaseerd op Redhat Enterprise Linux. Vergelijkbaar met CentOS 6 [[https:// | + | |
| - | | HA-Loadbalancer | Keepalived-1.2.x | Loadbalancing wordt verzorgd door Keepalived dmv Direct Routing. | + | |
| - | | Statische webserver / front-Proxy | Apache-2.4.x + mod_worker of Nginx | Deze front-proxies kunnen statische data (html, plaatjes, .css, .js etc.) snel en efficient uitserveren; | + | |
| - | | Dynamische webserver voor PHP sites | Apache-2.4.x + mod_prefork of php-fpm | PHP sites draaien onder apache-2.4 Wij geven er de voorkeur aan om de PHP webservers achter een proxy te zetten, waarbij de proxy de statische content zelf kan uitserveren. | | + | |
| - | | PHP | php(-fpm)5.6 of nieuwer | Voor PHP kunnen wij [[sterretje-cluster: | + | |
| - | | Database | MySQL(tegenwoordig MariaDB) of Postgresql | | | + | |
| - | | Mail | postfix-2.5.x | Mail [[mail: | + | |
| - | + | ||
| - | ==== Extra software in het appcluster ==== | + | |
| - | In het appcluster is naast de gewone LAMP stack (en Nginx) ook andere hosting mogelijk van bijvoorbeeld Java, Ruby on Rails en NodeJS. Daartoe zijn de volgende software componenten | + | |
| - | beschikbaar: | + | |
| - | + | ||
| - | ^ Component ^ Versie ^ Opmerkingen ^ | + | |
| - | | Java | jre-1.6.x (default) of jre-1.7.x (indien gewenst) | Liefst gebruiken we alleen de runtime environment (jre). In sommige gevallen kunnen we ook een jdk aanbieden | | + | |
| - | | Servlet container | Tomcat-6.x | | | + | |
| - | | Ruby on Rails | Ruby-2.3.X, Passenger5, Rubygems-1.3.x | + | |
| - | | NodeJS | Node-6.4.x | | | + | |
| - | | Overig | - | Andere tools als ImageMagick, | + | |
| - | + | ||
| - | In overleg met NPO ICT kunnen eventueel extra ondersteunende pakketten geinstalleerd worden. De omgeving is op een andere manier ingericht dan een traditionele één-applicatie-per-(virtuele)serveromgeving. Bij ons neem je geen (virtuele) server af maar in feite een set resources, gekoppeld aan een setje software. | + | |
| - | + | ||
| - | De software heeft daarvoor een (kleine) aanpassing nodig om ervoor te zorgen dat je bijvoorbeeld meerdere Apache processen kan draaien op een server zonder dat deze elkaar in de weg zitten of de hele server kunnen claimen. Die processen noemen we dan instanties (meerder instanties van software X). Dit is vooral relevant voor de beheerders van NPO ICT, maar als websitebouwer betekend het: | + | |
| - | * Je hebt een centrale upload-omgeving voor je site, de juiste instanties lezen je code in en serveren het uit. Je dus logt niet direct in op de webserver. | + | |
| - | * Wij hebben geen standaard package manager zoals yum of apt-get. Wij compileren zelf de software, met de nodige aanpassingen. | + | |
| - | * We kunnen meerdere versies van dezelfde software draaien op dezelfde server. Het up- of downgraden kan met het omzetten van een snelkoppeling. | + | |
| - | * High availability; | + | |
| - | + | ||
| - | Kijk [[sterretje-cluster: | + | |
| - | + | ||
| - | + | ||
| - | ==== De Uploadserver ==== | + | |
| - | De upload-server is te bereiken vanaf upload-sites of upload-testsites voor de testomgeving. Dit is een server die verbonden is met de centrale storage en is bedoeld -zoals de naam laat zien- om sites en content daarvan te uploaden. Als ontwikkelaar heb je, als het goed is, een account voor upload-sites. Want het grote publiek heeft geen toegang tot dit systeem. | + | |
| - | + | ||
| - | De servers lezen alles vanaf de centrale storage in en schrijven daar ook hun logs in weg. Als ontwikkelaar kun je de upload-server hiervoor gebruiken: | + | |
| - | * Het plaatsen/ | + | |
| - | * Bekijken van logs | + | |
| - | * Via upoad-sites kun je een sql connectie leggen naar je database(server). | + | |
| - | * Shell toegang *1 (afhankelijk of je een ftp of sftp account hebt). Bijvoorbeeld om een cron-job aan te maken of via de commandline dingen te kopieren, te verplaatsen etc. | + | |
| - | + | ||
| - | Sftp of ftp. Als NPO ICT hebben we een duidelijke voorkeur dat men gebruik maakt van SFTP (d.m.v. ssh-keys). FTP is een oud en onveilig protocol wat alle data, ook wachtwoorden onversleuteld verstuurd. Als je verbinding niet beveiligd is liggen die gegevens voor het oprapen. Moet je dan als ontwikkelaar ingewikkelde dingen doen met Secure-Copy? | + | |
| - | + | ||
| - | + | ||
| - | //*1 Let wel, dit is geen shell toegang tot de webservers zelf// | + | |
| - | + | ||
| - | ==== De Frontproxy-, | + | |
| - | Al het webverkeer wordt afgehandeld door de frontproxies, | + | |
| - | alle requests die uit de cache geserveerd kunnen worden hoeven niet door | + | |
| - | een applicatieserver afgehandeld te worden, wat +/- een factor 100 (!) | + | |
| - | in performance kan schelen. (een frontproxy kan maximaal +/- 5000 hits/sec | + | |
| - | afhandelen, een tomcat applicatieserver +/- 50) | + | |
| - | + | ||
| - | Bij php hosting is er geen sprake van een aparte applicatieserver. Daar | + | |
| - | verzorgt de webserver zelf het afhandelen van php bestanden. | + | |
| - | Echter, het blijkt dat php serving ook verbetert als dat achter een | + | |
| - | proxy gestopt wordt. In die zin krijgt de php-enabled server dus een rol | + | |
| - | als een applicatieserver. | + | |
| - | + | ||
| - | Ondertussen is alle file access die hierbij nodig is via NFS naar de storage | + | |
| - | server (bijvoorbeeld voor een database server die z'n datafiles moet | + | |
| - | raadplegen). Om het NFS verkeer te minimaliseren zijn alle cluster nodes | + | |
| - | uitgerust met veel geheugen, zodat de meeste file access vanuit het geheugen | + | |
| - | gedaan kan worden en niet via NFS hoeft. | + | |
| - | + | ||
| - | + | ||
| - | ==== Filesysteem layout: /e en /d ==== | + | |
| - | Alles dat te maken heeft met de diensten vind je in het filesysteem onder "/ | + | |
| - | Daar is voor elk type dienst een subdirectory, | + | |
| - | van die dienst, en daar weer onder de zaken die nodig zijn voor die dienst. | + | |
| - | Oftwel: alle paden zien er uit als | + | |
| - | ''/ | + | |
| - | + | ||
| - | Dit zijn symlinks/ | + | |
| - | + | ||
| - | De bedoeling van de split tussen /e en /d is dat systeembeheerders makkelijk data naar andere filesystemen kunnen schuiven, zonder dat er configuratie in de draaiende applicatie aangepast moet worden. Het zorgt ook voor een centraal ' | + | |
| - | + | ||
| - | De valkuilen: | + | |
| - | Het " | + | |
| - | Ook php en diverse ftp clients willen graag symlinks ' | + | |
| - | waardoor in die hoek ook nog wel eens /d paden zichtbaar willen zijn. | + | |
| - | Wees hier bedacht op. | + | |
| - | + | ||
| - | De /e/paden zijn dus belangrijk voor websitebouwers en in het bijzonder /e/ap/(naam van je site)/ | + | |
| - | + | ||
| - | === Subdirectories onder /e/ === | + | |
| - | + | ||
| - | ^ /e/pad ^ Subdirectory ^ toelichting ^ | + | |
| - | | / | + | |
| - | | / | + | |
| - | | / | + | |
| - | | / | + | |
| - | | / | + | |
| - | + | ||
| - | + | ||
| - | Voor applicaties ligt het iets anders; php applicaties hebben een iets | + | |
| - | andere directory structuur dan java applicaties. | + | |
| - | + | ||
| - | PHP applicaties hebben de volgende structuur onder | + | |
| - | / | + | |
| - | + | ||
| - | * pages | + | |
| - | (php applicaties) | + | |
| - | De document root van een php website. Deze is standaard php-enabled; | + | |
| - | * data | + | |
| - | De plek waar een applicatie z'n | + | |
| - | persistente data kan wegschrijven. Deze directory wordt direct | + | |
| - | via de proxy-webserver uitgeserveerd worden onder www.applicatienaam.nl/ | + | |
| - | Het zelfde rechtenverhaal gaat hier ook op, behalve dan dat de bestanden en directories allemaal lid zijn van een ' | + | |
| - | * config | + | |
| - | Hier kunnen config | + | |
| - | bestanden geplaatst worden. Deze directory zit in het php include path. | + | |
| - | Bijvoorbeeld de database parameters zijn hier altijd terug te vinden, maar ook allerlei php-code valt hier te plaatsen die niet in de docomentroot hoeft te staan (denk aan generieke classes, libraries, etcetera). Ook deze directory is niet schrijfbaar voor de webserver. Wat betreft de rechten geldt hier hetzelfde als onder /pages. | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | Tot slot hebben we nog | + | |
| - | + | ||
| - | * / | + | |
| - | De unix home directory van | + | |
| - | het upload-account genaamd < | + | |
| - | je binnenkomt als je inlogt. Als dit upload account bedoeld is voor het | + | |
| - | uploaden van applicatie X, dan zal er in de home directory vaak een | + | |
| - | verwijzing (symlink) naar applicatiedirectory X, dwz /e/ap/X gemaakt worden. | + | |
| - | + | ||
| - | + | ||
| - | ==== Filesysteem layout: /local en /software ==== | + | |
| - | De systemen zijn ingericht als zgn " | + | |
| - | o.a. dat er een /local en een /software directory is. Dit is de manier | + | |
| - | waarop NPO ICT z'n zelfgecompilede software distribueert; | + | |
| - | relevante stukje uit de netboot documentatie geknipt: | + | |
| - | + | ||
| - | '' | + | |
| - | + | ||
| - | In onze setup gebruiken we de directories ''/ | + | |
| - | ''/ | + | |
| - | maken van symlinks kunnen we hier heel eenvoudig de versies van de | + | |
| - | gebruikte software veranderen. De software benader je uiteindelijk door | + | |
| - | ''/ | + | |
| - | hebben. | + | |
| - | + | ||
| - | Stel je hebt een software pakket " | + | |
| - | de software neergezet onder ''/ | + | |
| - | bestaat uit 2 executables '' | + | |
| - | manpages, dan krijg je zo'n structuur: | + | |
| - | + | ||
| - | < | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | </ | + | |
| - | + | ||
| - | Om dit te benaderen moeten er nu in ''/ | + | |
| - | ''/ | + | |
| - | direct naar ''/ | + | |
| - | een extra symlinkje in ''/ | + | |
| - | + | ||
| - | < | + | |
| - | /local/foo -> / | + | |
| - | </ | + | |
| - | + | ||
| - | En de rest van de linkjes onder ''/ | + | |
| - | + | ||
| - | < | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | </ | + | |
| - | + | ||
| - | Dit schept een werkend geheel. En nu het slimme stuk. Er komt een | + | |
| - | belangrijke nieuwe versie van " | + | |
| - | naar upgraden. Deze versie zet je weer onder ''/ | + | |
| - | wel zo: | + | |
| - | + | ||
| - | < | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | </ | + | |
| - | + | ||
| - | Het actief maken is nu een simpele kwestie van het vervangen van een | + | |
| - | enkele symlink: | + | |
| - | + | ||
| - | < | + | |
| - | /local/foo -> / | + | |
| - | </ | + | |
| - | + | ||
| - | door: | + | |
| - | + | ||
| - | < | + | |
| - | /local/foo -> / | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | + | ||
| - | Concreet betekent dit dat bv de mysql software staat onder / | + | |
| - | maar dat een mysql instantie leeft onder /e/db/... | + | |
| - | + | ||
| - | Zelfde voor apache met / | + | |
| - | + | ||
| - | Om te zien welke versies actief zijn, kan men '' | + | |
| - | geeft een lijst met symlinks naar de exacte versies onder / | + | |
| - | + | ||
| - | Om niet eindeloos je $PATH aan te hoeven passen is er ook nog de | + | |
| - | /local/bin directory, deze heeft voor elk geinstalleerd pakket | + | |
| - | (dat zelf onder / | + | |
| - | een setje symlinks onder /local/bin en /local/man staan naar | + | |
| - | / | + | |
| - | + | ||
| - | Bijvoorbeeld, | + | |
| - | Maar, wij hebben ook een symlink / | + | |
| - | / | + | |
| - | Het nut hiervan is dat alleen /local/bin in je $PATH hoeft te staan, om | + | |
| - | bij alle geinstalleerde pakketten te kunnen. | + | |
| - | + | ||
| - | ==== Read-only, Read-write of Read-executable filesystemen ==== | + | |
| - | In onze omgeving maken wij onderscheid tussen read-only en read-write | + | |
| - | filesystemen. Voor de read-only filesystemen geldt dat deze vanaf de | + | |
| - | web, applicatie en database servers **niet** gewijzigd kunnen worden. | + | |
| - | Deze filesystemen worden gebruikt om de uitvoerbare delen en de | + | |
| - | configuratie van applicaties op te slaan. | + | |
| - | + | ||
| - | In onze omgeving is het zo dat alle web-app en pages directories op read-only | + | |
| - | filesystemen liggen. Verder ligt alle configuratie (frontproxy, | + | |
| - | applicatieserver) op een read-only filesysteem. De read-write filesystemen | + | |
| - | worden alleen gebruikt voor logfiles, temp-directories en databases. | + | |
| - | + | ||
| - | De reden hiervoor is dat als een site gehacked wordt, het voor de | + | |
| - | hacker onmogelijk is om b.v. jsp of php files te wijzigen. | + | |
| - | Concreet houdt dit in dat | + | |
| - | bij een geslaagde hack poging de applicatie zichzelf niet kan wijzigen | + | |
| - | (op instigatie van de hacker), en dat het dus bijzonder moeilijk zal | + | |
| - | zijn om b.v. aan de database inhoud te komen. | + | |
| - | + | ||
| - | Dit houdt in dat het voor applicaties dus niet mogelijk is om | + | |
| - | self-modifying code te gebruiken (bv een jsp die een nieuwe versie van | + | |
| - | zichzelf neerzet). In het geval van MMBase houdt dit in dat er niet | + | |
| - | via het web-interface nieuwe delen van MMBase geinstalleerd kunnen worden | + | |
| - | (want de applicatieserver mag niet schrijven in z'n web-app directory) | + | |
| - | Zelfs als u bijvoorbeeld "chmod 777" (= unix speak voor world writable) | + | |
| - | op een jsp bestand zou doen, dan nog is het niet te wijzigen vanaf | + | |
| - | een applicatieserver. Dit willen we dan ook ten zeerste afraden. | + | |
| - | + | ||
| - | De enige plek vanaf waar naar de read-only filesystemen geschreven mag | + | |
| - | worden is de upload server. Da's ook nodig, anders zouden er b.v. nooit nieuwe | + | |
| - | jsp bestanden geplaatst kunnen worden. | + | |
| - | + | ||
| - | ==== Naamgeving ==== | + | |
| - | De policy voor naamgeving is als volgt: | + | |
| - | (ingewikkeld? | + | |
| - | met onderstaande details) | + | |
| - | + | ||
| - | * Websites | + | |
| - | Elke omroep is geheel vrij een naam voor de website te | + | |
| - | kiezen. Elke applicatie kan onder een andere naam draaien | + | |
| - | (bv " | + | |
| - | " | + | |
| - | de default naam " | + | |
| - | De naam die u kiest, is de naam die in de locatiebalk van de webserver | + | |
| - | zichbaar is en de naam die extern bekend gemaakt wordt. | + | |
| - | Alle naamgeving die hieronder nog staat is alleen maar intern, en niet | + | |
| - | extern zichtbaar. | + | |
| - | In de testomgeving hebben wij liefst dat applicaties draaien onder | + | |
| - | " | + | |
| - | er ook (lange!) namen als "< | + | |
| - | aangemaakt worden (bv degezondeomroep-groentetest.omroep.nl) | + | |
| - | * Frontproxies | + | |
| - | Deze worden genoemd naar de omroep waar ze bij horen, | + | |
| - | gevolgd door een volgnummer. B.v. ''/ | + | |
| - | van "De Gezonde Omroep" | + | |
| - | De dns naam van een frontproxy wordt "< | + | |
| - | (bv " | + | |
| - | genoemd, maar is alleen een " | + | |
| - | hangen, dmv DNS CNAMES. (b.v. www.groente.nl is een CNAME naar | + | |
| - | degezondeomroep-sites.omroep.nl; | + | |
| - | frontproxy zorgen wij er dan voor dat www.groente.nl uitkomt bij de groente | + | |
| - | applicatie) | + | |
| - | * Databases | + | |
| - | Deze worden ook genoemd naar de omroep waar ze bij horen, | + | |
| - | gevolgd door een volgnummer. In de naamgeving wordt geen onderscheid tussen | + | |
| - | de verschillende types database (mysql of postgresql) aangehouden. B.v. | + | |
| - | ''/ | + | |
| - | zijn. De shared | + | |
| - | database instances heten shrd01 (mysql) en shrd02 (postgresql) | + | |
| - | Binnen de database instances kunnen voor de diverse applicaties diverse | + | |
| - | databases aangemaakt worden. Als er een applicatie genaamd " | + | |
| - | de database die daarbij hoort " | + | |
| - | hoort zou " | + | |
| - | * Applicatie Servers | + | |
| - | Ook deze worden genoemd naar de omroep waar ze bij | + | |
| - | horen, met een volgnummer. De tiende DGO applicatieserver zou | + | |
| - | ''/ | + | |
| - | De naam van applicatieservers wordt generiek gehouden, omdat een | + | |
| - | applicatieserver geen 1 op 1 relatie met een applicatie heeft. | + | |
| - | * Applicaties | + | |
| - | Voor applicaties wordt bij voorkeur gepoogd om een 1 | + | |
| - | op 1 mapping tussen url en applicatienaam te hebben. Dwz als een | + | |
| - | website www.groentenenfruit.nl heet, dan is de applicatienaam ook | + | |
| - | / | + | |
| - | In geval van java hosting wil het nog wel eens voorkomen dat er onder 1 | + | |
| - | url meerdere applicaties hangen (verschillende mountpoints in tomcat) | + | |
| - | In dat geval wordt gepoogd een min of meer | + | |
| - | descriptieve naam te gebruiken. | + | |
| - | Stel dat onder de groentenenfruit site nog een speciale shop module nodig is, dan zou deze op disk / | + | |
| - | * Upload Accountnamen | + | |
| - | De upload accounts worden meestal genoemd naar de organisatie die de | + | |
| - | uploads wil kunnen doen. Stel dat DGO het maken van z'n Groenten en Fruit | + | |
| - | site geheeld uit zou besteden aan de " | + | |
| - | account iets als " | + | |
| - | schrijfrechten onder onder ''/ | + | |
| - | om daar de applicatie te plaatsen. | + | |
| - | Als een omroep zelf z'n eigen applicaties plaatst, dan wordt de accountnaam | + | |
| - | weer iets als " | + | |
| - | + | ||
| - | + | ||
| - | ==== Users en Groups namen ==== | + | |
| - | In het web- app- en testcluster is i.h.a. een vrij stricte relatie | + | |
| - | tussen een usernaam en waar deze voor gebruikt wordt. B.v. een | + | |
| - | instantie die leeft onder / | + | |
| - | het userid YYYYYYXX. | + | |
| - | draait onder als user dmd1afp, de postfix instantie /e/ml/dmd2b draait | + | |
| - | als dmd2bml. | + | |
| - | + | ||
| - | Alle user accounts worden gecreeerd volgens het "all accounts are | + | |
| - | created equal" principe, wat inhoudt dat er nooit intrinsieke rechten | + | |
| - | aan een account hangen. De rechten volgen pas door het account toe te | + | |
| - | voegen aan specifieke groepen. | + | |
| - | Om dit af te dwingen worden accounts altijd gecreeerd met uid=gid (dit | + | |
| - | is unix terminologie, | + | |
| - | groep geplaatst wordt). De naam van de groep is gelijk aan de naam van | + | |
| - | de user. Oftewel, als er een user X is met uid N, dan is z'n | + | |
| - | primary group-id ook N en de bijbehorende groepsnaam is weer | + | |
| - | X. Ook aan het uid hangen geen speciale rechten, da's gewoon het | + | |
| - | eerstvolgende vrije uid boven de 5000. | + | |
| - | Voorbeeld: de user " | + | |
| - | / | + | |
| - | < | + | |
| - | test1afp: | + | |
| - | </ | + | |
| - | Zie hoe het userid gelijk is aan het group-id (5000), dus in / | + | |
| - | komt de volgende regel voor: | + | |
| - | < | + | |
| - | test1afp: | + | |
| - | </ | + | |
| - | + | ||
| - | Als we nu rechten uit willen delen aan deze user, dan kan dat op basis | + | |
| - | van group-membership. Typisch voor een webserver is dat deze data moet | + | |
| - | kunnen wegschrijven en derhalve lid van een data writers (" | + | |
| - | moet zijn: | + | |
| - | < | + | |
| - | dwtest: | + | |
| - | </ | + | |
| - | + | ||
| - | De groeps-id' | + | |
| - | boven de 20000. In de groeps namen zit wel enige codering, nl in de | + | |
| - | eerste twee letters: | + | |
| - | + | ||
| - | * rd - Reader | + | |
| - | De groep voor users die ergens mogen lezen. | + | |
| - | Dit bestaat om ervoor te zorgen dat ongerelateerde entiteiten niet | + | |
| - | elkaars spullen mogen lezen. De readers omvat normaal gesproken alle | + | |
| - | user users die iets met een applicatie te maken hebben: webservers, | + | |
| - | applicatieservers, | + | |
| - | * dw - Data writer | + | |
| - | De groep voor users die data mogen plaatsen. | + | |
| - | Dit zijn de uploaders en de processen die zelf data wegschrijven (bv een | + | |
| - | webserver die ge-upload content ergens weg moet kunnen schrijven) | + | |
| - | * cw - Content Writer | + | |
| - | De groep voor users die content (denk aan php | + | |
| - | code) mogen plaatsen. Dit zijn normaal gesproken alleen de uploaders. | + | |
| - | + | ||
| - | + | ||
| - | Voorbeeld: stel dat er een applicatie <tt/foo/ is, bestaande uit een | + | |
| - | paar webservers en een paar uploaders, | + | |
| - | dan geeft dat aanleiding tot de volgende groepen: | + | |
| - | < | + | |
| - | rdfoo: | + | |
| - | dwfoo: | + | |
| - | cwfoo: | + | |
| - | </ | + | |
| - | + | ||
| - | ===== File Permissies ===== | + | |
| - | + | ||
| - | ==== Het probleem: afscherming en samen kunnen schrijven ==== | + | |
| - | Er zijn twee problemen die we op willen lossen: | + | |
| - | + | ||
| - | * Afscherming | + | |
| - | Je wilt niet dat alles voor iedereen leesbaar is. | + | |
| - | De uploaders van de ene omroep moeten niet de code van een andere omroep | + | |
| - | kunnen zien. | + | |
| - | * Samen schrijven | + | |
| - | Je wilt dat verschillende users dingen op het filesysteem met elkaar | + | |
| - | kunnen delen. Bijvoorbeeld meerdeer upload accounts die samen aan de | + | |
| - | code van 1 applicatie moeten kunnen werken, of meerdere geloadbalancede | + | |
| - | webservers die elk onder een gesharede /data spulletjes moeten kunnen | + | |
| - | wegschrijven. | + | |
| - | Ook wil je vaak dat zowel uploaders als webservers samen onder /data | + | |
| - | kunnens chrijven. | + | |
| - | + | ||
| - | + | ||
| - | ==== Oplossing voor Afscherming: | + | |
| - | Een hekje is een directory ergens bovenaan in een directory tree die | + | |
| - | niet world readable is, slechts group readable en dus alleen te passeren | + | |
| - | voor users die lid zijn van die groep. | + | |
| - | + | ||
| - | Voorbeeld: | + | |
| - | + | ||
| - | Beschouw de volgende groep: | + | |
| - | < | + | |
| - | readers: | + | |
| - | </ | + | |
| - | en deze directory: | + | |
| - | < | + | |
| - | / | + | |
| - | </ | + | |
| - | + | ||
| - | Als we die directory nou owner root: | + | |
| - | wat daaronder ligt niet meer te benaderen voor users die geen lid van de | + | |
| - | groep " | + | |
| - | + | ||
| - | ==== Oplossing voor samen Schrijven: datawriters en contentwriters ==== | + | |
| - | + | ||
| - | Voor het schrijven roepen we ook 2 groepen in het leven: de datawriters | + | |
| - | en de contentwriters. Contentwriters zijn iha de users met een upload | + | |
| - | account, die vanuit de upload server de /pages (e.d.) directory mogen | + | |
| - | vullen. In de datawriters groep zitten de webservers en de uploaders | + | |
| - | samen. En dat geeft ze rechten om onder /data te schrijven. | + | |
| - | + | ||
| - | Om dit goed te laten werken is het nodig dat zowel datawriters als | + | |
| - | contentwriters een umask 002 hanteren, zodat wat ze aanmaken default | + | |
| - | group writable is. | + | |
| - | + | ||
| - | En om dat weer veilig te kunnen doen is het nodig dat ALLE users | + | |
| - | een uniek primary group ID hebben. | + | |
| - | + | ||
| - | Dus, voorbeeld: | + | |
| - | + | ||
| - | We hebben de users: | + | |
| - | < | + | |
| - | webserver1: | + | |
| - | webserver1: | + | |
| - | uploader1: | + | |
| - | uploader2: | + | |
| - | </ | + | |
| - | + | ||
| - | Dan hebben we de groepen: | + | |
| - | < | + | |
| - | readers: | + | |
| - | contentwriters: | + | |
| - | datawriters: | + | |
| - | </ | + | |
| - | + | ||
| - | En de permissies onder / | + | |
| - | < | + | |
| - | $ cd / | + | |
| - | # ls -Lla . | + | |
| - | drwxr-x--- | + | |
| - | drwxrwxr-x | + | |
| - | drwxrwxr-x | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ==== Granulariteit van readers en content/ | + | |
| - | + | ||
| - | === Readers === | + | |
| - | Laten we per omroep 1 readers groep aanmaken. | + | |
| - | Dat betekent dat als webtoko1 en webtoko2 allebei voor $omroep werken | + | |
| - | ze elkaars code kunnen lezen en de code die een omroep zelf opgehoest | + | |
| - | heeft. Maar, dat zou imo geen probleem moeten zijn. | + | |
| - | + | ||
| - | === Content/ | + | |
| - | Je wilt niet dat webtoko1 en webtoko2 over elkaars code heen kunnen | + | |
| - | krassen. Ook wil je een asymmetrische relatie tussen $omroep en | + | |
| - | $webtoko, nl $omroep mag wel over de code van $webtoko heenkrassen, | + | |
| - | niet andersom. | + | |
| - | Dit is te regelen door per omroep-webtoko combinatie een groepje aan te | + | |
| - | maken: | + | |
| - | < | + | |
| - | readers: | + | |
| - | contentwriters: | + | |
| - | toko1writers: | + | |
| - | toko2writers: | + | |
| - | datawriters: | + | |
| - | </ | + | |
| - | + | ||
| - | Op die manier kan toko1 nog wel over de data van toko2 heenschrijven, | + | |
| - | maar dat konden ze toch al, als ze in dezelfde apache instantie draaien. | + | |
| - | (nl door het apache maar te laten doen) | + | |
| - | + | ||
| - | $omroep dreigt wel lid van veel groepen te worden op die manier | + | |
| - | (net zoveel als dat ze gescheiden webtoko' | + | |
| - | moeten wellicht van tijd tot tijd " | + | |
| - | de code van toko1 heen te kunnen krassen. | + | |
| - | + | ||
| - | Als tokoX nou maar 1 account heeft, en niet hoeft te delen met tokoY, | + | |
| - | dan kan het simpeler opgelost worden; nl tokoX geen lid te maken van | + | |
| - | enige contentwriter group en de pages directory owner tokoX. | + | |
| - | Dwz owner tokoX: | + | |
| - | + | ||
| - | ==== Rechten goed houden met php ==== | + | |
| - | Bovenstaande rechtenstructuur is essentieel voor de juiste werking van een website. Wanneer er, bijvoorbeeld door de code van de website, wijzigingen in de rechten worden aangebracht kan hierdoor functionaliteit verloren gaan. Het is daarom belangrijk dat de code van de website de rechten niet veranderd wat helaas in php niet altijd voor de hand liggend is. De basis gedachte achter ons platform is: eea is zo opgezet dat de rechten vanzelf goed komen te staan. Wij zien dus het liefst dat er zo min mogelijk gebruik wordt gemaakt van chown/chmod en consorten. Voorwaarde is wel dat het zgn " | + | |
| - | In onze web-, sshd- en ftpservers zorgen wij ervoor dat dat goed staat. In shell accounts adviseren wij om in | + | |
| - | een ' | + | |
| - | < | + | |
| - | */5 * * * * umask 002; doe_iets.php | + | |
| - | </ | + | |
| - | + | ||
| - | Sommige php functies (b.v. mkdir) willen in sommige gevallen dat er permissies opgegeven worden. | + | |
| - | De mkdir functie werkt als volgt: | + | |
| - | < | + | |
| - | bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] ) | + | |
| - | </ | + | |
| - | + | ||
| - | Dat houdt in dat als je recursive een directory aan wilt maken (" | + | |
| - | dat komt omdat de permissies die bij mkdir opgegeven worden, worden ge-bitmasked met je umask en op die manier toch de juiste rechten gebruikt worden. | + | |
| - | + | ||
| - | ===== Http Loadbalancing ===== | + | |
| - | Er zijn meerdere manieren om loadbalancing te implementeren, | + | |
| - | beschrijft hoe wij dit het liefste doen, nl met twee gestapelde | + | |
| - | loadbalancers. | + | |
| - | De gedachte is dat we aan de buitenkant een paartje loadbalancers | + | |
| - | hebben, welke in master/ | + | |
| - | gebruiken keepalived met direct routing. Dat betekent dat de | + | |
| - | loadbalancers puur op IP niveau kijken en losse IP pakketjes doorsturen | + | |
| - | naar de te loadbalancen instanties. | + | |
| - | + | ||
| - | Normaal zouden die te loadbalancen instanties een farm van webservers | + | |
| - | zijn die het eigenlijke werk doen, maar hier zit er een extra laag | + | |
| - | tussen, nl er wordt geloadbalanced over een farm(pje) van http proxies. | + | |
| - | En die proxies op hun beurt loadbalancen (mod-proxy-balancer igv apache) dan | + | |
| - | over de farm van (php enabled) webservers die het echte werk doen. | + | |
| - | In ascii art ziet dat er als volgt uit | + | |
| - | < | + | |
| - | Interweb | + | |
| - | | | + | |
| - | | + | |
| - | / | + | |
| - | / \ | + | |
| - | | + | |
| - | | + | |
| - | | \ / | | + | |
| - | | + | |
| - | | + | |
| - | | / \ | | + | |
| - | | + | |
| - | | + | |
| - | </ | + | |
| - | + | ||
| - | Er is voor deze getrapte setup gekozen om de volgende redenen: | + | |
| - | + | ||
| - | * Aan webserving zitten twee kanten: enerzijds het spoonfeeden | + | |
| - | (bitje voor bitje uitserveren, | + | |
| - | van data naar je kijkers, anderzijds het uitrekenen (denk php) van hoe | + | |
| - | een webpagina eruit moet zien. | + | |
| - | Voor het uitrekenen (php) heb je hele " | + | |
| - | bij apache is dat single threaded, ze hebben veel geheugen nodig etc. | + | |
| - | Het spoonfeeden echter is een simpele taak, die heel goed threaded kan. | + | |
| - | Normaal bij een php webserver zit je dus 90% van de tijd dure php slots | + | |
| - | te gebruiken om data naar je kijkers te spoonfeeden. Rescources die | + | |
| - | beter anders gebruikt zouden kunnen worden. | + | |
| - | Door er een http proxy tussen te zetten ontkoppel je het rekenen van het | + | |
| - | spoonfeeden. Het spoonfeeden gebeurt nu door de proxy, die daartoe | + | |
| - | geoptimaliseerd is (threaded webserver, veel slots e.d.) | + | |
| - | Het rekenen gebeurt door de geproxiede server. Omdat er tussen de proxy | + | |
| - | en de reken-server een snelle connectie ligt, is daar geen sprake van | + | |
| - | spoonfeeding en zijn de dure php slots alleen in gebruik op het moment | + | |
| - | dat ze ook echt nodig zijn. In apache termen betekent dit dat je op de | + | |
| - | php servers kan volstaan met>'' | + | |
| - | mensentermen betekent dat je heel veel apache instanties naast elkaar | + | |
| - | zou kunnen gaan draaien zonder dat het geheugen volloopt. | + | |
| - | * Een aardige bijkomstigheid van het gebruik van apache als proxy is | + | |
| - | dat deze ook alvast het domme werk kan doen, nl zelf de statische data | + | |
| - | uitserveren, | + | |
| - | * Deze setup kan gebruikt worden voor het high-volume uitserveren | + | |
| - | van statische websites. In dit geval zijn de proxies gewoon de | + | |
| - | eindpunten (ze proxyen zelf niks, omdat alles statische data is). | + | |
| - | Het schalen gaat hier door maar genoeg http proxies bij te schakelen. | + | |
| - | Stel dat er gekozen zou zijn voor een ongetrapt, simpeler alternatief, | + | |
| - | waarbij je de keepalived / DR loadbalancing gewoon niet zou doen | + | |
| - | (dwz direct aan de voorkant 1 proxy instantie, welke mbv keepalived in | + | |
| - | een master/ | + | |
| - | groots php hosten, maar uiteindelijk zou je ene proxy server dan een | + | |
| - | choke point kunnen worden. | + | |
| - | Andersom, als de buitenkant een keepalived/ | + | |
| - | direct balanced over een aantal php nodes, dan heb je dus last van alle | + | |
| - | spoonfeeding issues zoals boven beschreven | + | |
| - | * De keepalived/ | + | |
| - | poorten aan. Dit kan bv gebruikt worden om op 1 website http en https | + | |
| - | verkeer vasn elkaar te scheiden, waarbij het https verkeer naar ssl | + | |
| - | enabled instanties gaat, terwijl voor http verkeer alle ssl overhead | + | |
| - | niet nodig is en deze dus door leaner and meaner instanties gedaan kan | + | |
| - | worden. Andersom kan het ook gebruikt worden om 1 shared loadbalancer | + | |
| - | neer te zetten, die gebruikt kan worden voor een aantal verschillende | + | |
| - | klanten/ | + | |
| - | hebben staan. | + | |
| - | + | ||
| - | + | ||
| - | ==== Naamgeving ==== | + | |
| - | Webservers leven altijd onder ''/ | + | |
| - | De naam daaronder ziet eruit als '' | + | |
| - | de '' | + | |
| - | instantie is (bv een omroepnaam of een applicatienaam), | + | |
| - | cijfer, wat een volgnummer is. De N'e instance van klant xxxx. | + | |
| - | Tenslotte volgt weer een letter om aan te geven dat iets geloadbalanced | + | |
| - | is. Stel dat foo1 geloadbalanced zou worden over 3 instanties, dan zou | + | |
| - | je deze onder ''/ | + | |
| - | '' | + | |
| - | + | ||
| - | Vaak zullen de a,b en c instanties onderling veel configuratie delen. | + | |
| - | Om deze nu niet 3x te dupliceren is deze terug te vinden in een gedeelde | + | |
| - | directory ''/ | + | |
| - | + | ||
| - | Zowel de static proxies, als de php enabled servers zijn webservers en | + | |
| - | leven dus beide onder ''/ | + | |
| - | naamgeving tussen proxies en php servers. In praktijk betekent dit vaak | + | |
| - | dat een proxy en php server dezelfde prefix hebben (" | + | |
| - | ander volgnummertje (" | + | |
| - | Het kan natuurlijk ook zo zijn dat 1 setje proxies (foo1& | + | |
| - | loadbalanced over meerdere setjes php servers (foo2& | + | |
| - | applicatie X en foo3& | + | |
| - | Wij streven ernaar om in het GECOS veld van de password file aan te | + | |
| - | geven wat een webserver isntantie precies doet. | + | |
| - | + | ||
| - | De user waar een webserver onder draait is z'n naam gevolgd door de | + | |
| - | letters " | + | |
| - | heeft meestal als DNS naam '' | + | |
| - | + | ||
| - | ==== Shared vhost includes ==== | + | |
| - | de configuratie van apache virtual hosts leeft bij ons altijd in losse | + | |
| - | '' | + | |
| - | In een loadbalanced context moeten zowel de proxies als de php servers | + | |
| - | weet hebben van de vhosts. Om nu niet alle informatie N maal te | + | |
| - | dupliceren hebben we vsan elke vhost file slechts een kopie, die door | + | |
| - | alle (proxies < | + | |
| - | In de vhost file wordt met Define' | + | |
| - | elke instantie alleen maar het stukje configuratie krijgt dat voor die | + | |
| - | instantie van toepassing is. | + | |
| - | + | ||
| - | ==== Sessies ==== | + | |
| - | Niet alles is rozegeur en maneschijn, nl sessies zijn een probleem. | + | |
| - | Er is geen garantie dat een sessie altijd bij dezelfde php node terecht | + | |
| - | komt. | + | |
| - | Er zijn een aantal oplossingen: | + | |
| - | + | ||
| - | * route constructies gebruiken | + | |
| - | We gaan er van uit dat sessie informatie in http cookies gestopt zit. | + | |
| - | Als de cookies op een zodanige wijze gegenereerd kunnen worden dat het | + | |
| - | duidelijk is door welke worker node dit gedaan is, dan zit er in de http | + | |
| - | proxy functionaliteit om op basis van zo'n cookie het request naar de | + | |
| - | juiste worker door te sturen. | + | |
| - | Concreet betekent dat dat de cookiename statisch moet zijn (bv | + | |
| - | PHPSESSIONID) en dat de waarde van de cookie eruit moet zien als | + | |
| - | '' | + | |
| - | welke node een request doorgezet moet worden. | + | |
| - | In een java tomcat context is dit tamelijk eenvoudig te doen door in de | + | |
| - | tomcat server.xml een jvmRoute op te nemen: | + | |
| - | < | + | |
| - | <Engine name=" | + | |
| - | </ | + | |
| - | Dit zorgt ervoor dat er cookies JSESSIONID=sessiedata.NODE_x gezet | + | |
| - | worden. | + | |
| - | Vervolgens stellen we op de proxy in: | + | |
| - | < | + | |
| - | ProxyPass / balancer:// | + | |
| - | <Proxy balancer:// | + | |
| - | BalancerMember http:// | + | |
| - | BalancerMember http:// | + | |
| - | BalancerMember http:// | + | |
| - | ... | + | |
| - | </ | + | |
| - | </ | + | |
| - | En zo weet de proxy dat sessies met NODE_1 doorgestuurd moeten worden naar | + | |
| - | node1. | + | |
| - | Het probleem hierbij echter is dat dat bij php niet zo fijn werkt. | + | |
| - | Er is in php geen makkelijke manier (a la jvmRoute in tomcat) om php duidelijk | + | |
| - | te maken dat ie z'n sessie namen volgens een bepaalde syntax aan moet | + | |
| - | maken. Daarom hebben we een speciale truc verzonnen, waardoor door middel van een RewriteRule in de PHP-worker een cookie geset wordt (vaak iets als ' | + | |
| - | * sessies in database opslaan | + | |
| - | Aangezien de verschillende webserver nodes uiteindelijk weer aan | + | |
| - | dezelfde database refereren, kan de database goed gebruikt worden om | + | |
| - | sessie informatie in op te slaan. | + | |
| - | * sessies op het filesysteem opslaan | + | |
| - | Dit zou in theorie kunnen, maar is in praktijk een slecht idee. | + | |
| - | De gedachte is dat de verschillende php nodes een shared filesysteem | + | |
| - | hebben. Dus, als node 1 op het filesysteem wat sessie info neerzet, dan | + | |
| - | kan node 2 dat weer oppikken. | + | |
| - | Probleem hierbij is dat we NFS gebruiken voor het filesysteem en dat NFS | + | |
| - | geen cache consistency biedt. Dat betekent dat op het moment dat node 1 | + | |
| - | iets weggeschreven heeft, dit niet meteen op node 2 bekend is. | + | |
| - | * sessies in memcache opslaan | + | |
| - | We bieden inmiddels ook support voor [[http:// | + | |
| - | + | ||
| - | + | ||
| - | ==== Performancetips ==== | + | |
| - | + | ||
| - | * statische content | + | |
| - | Het komt natuurlijk best wel eens voor dat een site allemaal ' | + | |
| - | * xml | + | |
| - | Ook zien we vaak dat er XML gegenereerd wordt aan de hand van gegevens uit een database. Dat is natuurlijk helemaal geen probleem, maar wordt het vanzelf wel als 15.000 mensen tegelijkertijd diezelfde XML willen opvragen uit de database. Daarom adviseren wij om in dat geval de XML-file door middel van een cronjob, bijvoorbeeld elke minuut, te genereren en onder /data neer te laten zetten. Op deze manier wordt een vaak opgevraagde xml toch actueel gehouden, maar uitgeserveerd door de proxiende webserver. Dit scheelt heel erg in de performance. | + | |
| - | * caching | + | |
| - | Er zijn nogal wat caching-mechanismes in omloop in de php-wereld; varierend van zelf bedachte dingen tot het gebruik van componenten als smarty en memcache. Wij supporten in ieder geval deze 2 mechanismes, | + | |
| ===== Contactgegevens ===== | ===== Contactgegevens ===== | ||
| - | + | Vragen? Maak een ticket aan via https:// | |
| - | * NPO ICT, < | + | |
| - | * Algemeen aanspreekpunt voor het beheer van de omgeving. | + | |
| - | * Dick Snippe, < | + | |
| - | * Gerwin Mast, < | + | |
| - | * Voor vragen mbt de opzet van de hosting omgeving. | + | |