Hosting bij NPO ICT

Wij bieden twee types hosting aan en een testomgeving:

* bij afname van een hostingspakket zit standaard ook een testomgeving

Prijzen kunnen opgevraagd worden via onze servicedesk.

Wij richten ons op hosting van:

  • Apache en Nginx
  • PHP(-fpm), Ruby (Rails), Java (Tomcat), Python, NodeJS
  • Mysql, Redis, Postgresql en couchDB databases

Andere setups kunnen we vaak ook hosten, afgelopen jaren hebben wij waar nodig passend maatwerk geleverd.

Quick Start

Alle omgevingen zijn zoveel mogelijk gebaseerd op open source software componenten: Linux, Apache, MySQL, PHP, Tomcat, Ruby, Rails, etcetera. Wij zijn namelijk overtuigd van de kracht van open source en bij NPO ICT is er de nodige 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 kijk op hun website
HA-Loadbalancer Keepalived-1.2.x Loadbalancing wordt verzorgd door Keepalived dmv Direct Routing. We draaien de loadbalancers in een master-slave configuratie, waarin de slave het overneemt als de master er mee ophoudt. Het loadbalancen gebeurt op basis van direct routing, wat betekent dat retour verkeer niet door de loadbalancers heen hoeft, waardoor deze grote aantallen verkeer kunnen verwerken.
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; vele malen sneller en efficienter dan een 'backend' applicatieserver. Daarnaast zorgen ze voor loadbalancing en failover tussen 2 of meer applicatieservers In geval van java sites kan de proxy ook caching verzorgen. Php, jsp en railsapplicaties worden geproxied naar een applicatieserver.
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 deze modules leveren
Database MySQL(tegenwoordig MariaDB) of Postgresql
Mail postfix-2.5.x Mail versturen en ontvangen kan via verschillende methoden.

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 Wij bieden verschillende versies van Ruby aan, per site is dit in te regelen.
NodeJS Node-6.4.x
Overig - Andere tools als ImageMagick, ffmpeg e.d. zijn op aanvraag beschikbaar

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-server 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; de instanties kunnen we goed verdelen en snel verplaatsen over alle fysieke of virtuele servers.

Een wat meer in-depth uitleg van de opbouw van de omgeving clustering d.m.v. instanties

De Upload-sites-server

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/bijwerken van de files voor je site.
  • Bekijken van logs
  • Via upoad-sites kun je een sql connectie leggen naar je database.
  • 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
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. Je kunt SFTP gebruiken met Filezilla of Transmit voor de Mac en tal van andere FTP clients.

Om zelf (f)cron jobs te kunnen aanmaken hebben wij speciale shellservers ingericht.

*1 Let wel, dit is geen shell toegang tot de webservers zelf

De Frontproxy-, Applicatie- en Database servers

Al het webverkeer wordt afgehandeld door de frontproxies, deze zitten tussen de 'buitenwereld' en de applicatieservers. De belangrijkst reden hiervoor is performance en schaalbaarheid. Dit wordt vooral bereikt door de caching: 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.

Logrotatie van applicatie logs

Dit kan gebruikt worden om logfiles die door webapplicaties weggeschreven worden dagelijks te laten roteren. Dit gebeurt op eenzelfde wijze als ook voor bijvoorbeeld Apache logfiles het geval is.

Wanneer de logfiles op de juiste manier worden weggeschreven, zal de logrotatie automatisch uitgevoerd worden in de nacht.

Wat is er voor nodig:

  • Laat de logfiles wegschrijven onder /e/ap/site/log/ Het is belangrijk dat de logfiles zich niet in directories bevinden binnen de “log” directory.
  • Het logfile moet door de webserver zijn aangemaakt. Dwz, de owner van het file moet een webserver instantie zijn. Files aangemaakt bijv. vanuit een cronjob hebben als owner een ssh account.

Indien aan deze voorwaarden wordt voldaan, wordt er logrotatie uitgevoerd. In alle andere gevallen worden de logfiles met rust gelaten.

Wanneer logfiles geroteerd worden, worden deze in zip-formaat geplaatst onder /e/ap/site/OLDlog/<jaar>/<maand>/naam-YYYYMMDD.gz. Gedurende 2 weken na rotatie zijn de logfiles beschikbaar via de upload server. Na die tijd zullen de logs bij ons gearchiveerd worden.

Omdat een webapplicatie door meerdere webserver instanties wordt uitgeserveerd, wordt het aangeraden om per instantie een logfile weg te schrijven. Zo wordt voorkomen dat meerdere instanties in hetzelfde file op dezelfde tijd gaan schrijven. Binnen php kan daar bijvoorbeeld $_SERVER['INSTANCENAME'] voor gebruikt worden, om de naam van de instantie te achterhalen.