Alessandro Pilotti MVP ASP.Net / IIS Microsoft Certified Professional & Trainer MCSD, MCAD, MCSE, MCDBA, MCTS, MCT RHCE - Red Hat Certified Engineer http://blogs.ugidotnet.org/soaringcode Ottimizzare Drupal su IIS 7.5
Agenda IIS e PHP Windows Cache Extension for PHP Scalabilità e performance Application Request Routing 2.5 Web Farm Framework 2.1 Setup Drupal web site su web farm host Setup Drupal ARR / WFF Database e shared storage Distributed session management AppFabric distributed cache
IIS loves PHP In IIS 7.x è una piattaforma ottimizzata per PHP FastCGI (disponibile anche per IIS 6) Non più ISAPI! PHP Manager integrato in IIS Manager Semplice gestione di versioni PHP e impostazioni PHP.ini Windows Cache Extension for PHP Opcode cache File cache User cache Relative file path cache Session handler Deployment di applicazioni semplificato via Web PI Wordpress, Joomla, Drupal, etc
Versioning IIS 5.0 Windows 2000 IIS 5.1 Windows XP IIS 6.0 Windows Server 2003 IIS 7.0 Windows Vista / Server 2008 IIS 7.5 Window 7 / Server 2008 R2 IIS 8.0 Windows 8 / Windows Server vnext
FastCGI Protocollo molto popolare in ambito Apache, su cui si basano PHP, Perl, Ruby, etc CGI è lento: ogni request instanzia un processo! FastCGI riutilizza lo stesso processo E supportato su IIS 7.x e su IIS 6.0 (quest ultimo via fcgiext.dll ISAPI) Scritto in collaborazione con Zend (I creatori di PHP) ma è generico Basta abilitare CGI tra I role services in IIS 7.x Nota: Installare Hotfix KB980363 su IIS 7.0 per avere 1.5!
FastCGI Deployment
PHP - Performance PHP è un linguaggio compilato a runtime Esecuzione legge file e genera bytecode Successive richieste ripetono il processo Non è un problema per piccoli siti Collo di bottiglia prestazionale Esistono diverse soluzioni Al momento (PHP 5.x) nessuna nativa
PHP Accelerators Con questo termine si intendono strumenti in grado di velocizzare l esecuzione Tra i più noti APC (inserito di default in PHP 6.0) eaccelerator Zend Server Windows Cache Extension for PHP
WinCache for PHP Soluzione Open Source sviluppata da MS Specifica per IIS Richiede PHP 5.2 o PHP 5.3 x86 Versione Non Thread Safe Offre feature non incluse in APC e altri acceleratori
WinCache for PHP Installabile Via Web Platform Installer Via download diretto Compilandolo dai sorgenti Configurare php.ini per attivare extension = php_wincache.dll Verificare con phpinfo() Modificare eventuali parametri in php.ini
WinCache for PHP PHP Bytecode Cache Chiamate successive ad uno script reimpiegano il bytecode già compilato Caricamento script PHP in memoria I/O Ridotto, soprattutto UNC! Cache gestita tramite Shared Memory Cache dei path assoluti Riduce I tempi per le frequenti risoluzioni dei path relativi Session handler con utilizzo di cache Di default utilizza file system
WinCache for PHP User cache wincache_ucache_set(key, value) wincache_ucache_get(key) Etc Sessioni in User Cache session.save_handler = wincache
Scalabilità e performance Un applicazione è definita scalabile se può raggiungere un livello di carico arbitrario Aumentando banalmente l hardware utilizzato Esempi di mancata scalabilità Eccessiva dipendenza dalle sessioni Consumo esagerato di memoria per request Nel mondo web, si risolve con una web farm Più di un server risponde alle request di un sito web Necessità di condividere informazioni tra i server Database Storage Sessioni Cache Load balancing per distribuire le request (ARR)
IIS 7.x - Scalabilità IIS 7.x offre un ottima scelta di strumenti per la gestione di una Web Farm Application Request Routing Web Farm Framework Windows AppFabric Gestione dei worker process (web garden) Per FastCGI, allocazione dinamica del numero dei processi in base al carico ed alle risorse disponibili
IIS Web Farm
IIS Web Farm Uno o più server da utilizzare come load balancer e cache Windows Server 2008 R2 IIS Application Request Routing Web Farm Framework Uno o più server da usare come nodi della farm Windows Server 2008 R2 IIS Opzionalmente Windows AppFabric Database Server MySQL 5.x (Drupal 6,7) MS SQL Server (Drupal 7) File Server Windows Server
Installazione di MySQL Installazione di MySQL 5.x su un nodo dedicato Nel nostro esempio il DBMS server fungerà anche da file server Installazione eseguita via Web PI Può essere effettuata anche manualmente Se si desidera configurare manualmente un db per Drupal: CREATE DATABASE MyNewDrupalSite; CREATE USER 'MyNewDrupalSite'@'%' IDENTIFIED BY 'Passw0rd'; -- Cambiare passowrd ovviamente GRANT ALL On MyNewDrupalSite.* TO 'MyNewDrupalSite'@'%';
Deployment di Drupal Installazione solo sul primo nodo della farm! Prerequisiti Ruolo IIS con CGI abilitato (FastCGI incluso) URL Rewrite Sostituisce mod_rewrite di Apache Output Cache PHP 5.2 PHP Manager for IIS Windows Cache Extension for PHP 5.2 Installazione eseguita via Web PI Può essere eseguita manualmente in alternativa Deployment di un web site Drupal manualmente Creare web site in IIS Modificare settings.php se necessario
IIS prerequisiti per Web Farm Framework I seguenti step sono da eseguire sui nodi della farm Installare Web Deploy 2 Eccezioni Windows Firewall Core networking File And Printer Sharing Remote Administration Creare un utente amministratore su tutti i nodi Può essere un utente di dominio In alternativa deve avere la stessa password su tutti i nodi della farm Autenticazione passthrough Disabilitare UAC Attenzione a mischiare ambienti x86 e x64! http://learn.iis.net/page.aspx/913/system-and-platform-requirements-for-the-web-farm-fram
Demo Deployment Drupal e configurazione per WFF
Installazione ARR e WFF Con Web PI
Configurazione di una Farm
Deployment di una Farm Impostare Provision web farm Server farm is available from load balancing Credenziali utente amministratore creato in precedenza sui nodi Aggiungere il server primario Server su cui abbiamo installato Drupal Impostare come primary server Aggiungere i server secondari WFF si occuperà tramite Web Deploy di sincronizzare i server secondari a partire dal primario
Deployment di una Farm
Health test Una web farm offre funzionalità di fault tolerance grazie all intrinseca ridondanza ARR deve sapere come identificare I nodi attivi Un health test consiste tipicamente in una request HTTP Valutando il codice di risposta, ad es.: 200-300 => Ok Valutando il contenuto della risposta per test più approfonditi Una soluzione frequentemente adottata consiste in una pagina di test al cui interno vengo eseguiti test di connessione DBMS File system Web Service etc
Load balancing in ARR All arrivo di una request, ARR deve decidere a quale nodo della farm inoltrarla Ci sono diversi algoritmi L idea di base è uniformare il carico sui nodi Non tutte le request sono uguali
Client Affinity Le applicazioni web tipicamente usano sessioni per mantenere lo stato tra due request distinte eseguite dallo stesso client In una farm, server diversi rispondono alla stesso client Soluzioni Dati di sessione mantenuti serializzati su un server comune MySQL SQL Server Etc ARR inoltra le richieste di un client sempre allo stesso server (client affinity) Gestito tramite un cookie Attenzione a: Sbilanciamento nel carico Limitazioni nella fault tolerance
Server Affinity Client affinity settings Host affinity Bilanciamento del carico tra server della farm Basato sull host header della request Utile in caso di shared storage
Provisioning
Demo Configurazione ARR e creazione farm
File server Applicazioni web spesso necessitano di accedere ad uno storage condiviso Ad es. documenti caricati dagli utenti In una server farm si hanno 2 soluzioni Area comune condivisa attenzione ai bottleneck e alla fault tolerance Soluzione di replicazione DFS, Web Deploy, rsync, etc Attenzione alla latenza! Nel nostro esempio optiamo per una share SMB
Configurazione Application pool Su tutti i nodi della farm e sul file server Creare un utente con privilegi minimi drupalwp In alternativa può essere un utente di dominio In alternativa mantenere password omogenea sui nodi! Associare tale utente all application pool assegnato al sito Drupal Sufficiente sul primary server, web deploy si occuperà del sync Verificare impostazioni fastcgi.impersonate in PHP.ini
Configurazione share SMB Sul File Server Creazione directory C:\Data\MyNewDrupalSite Assegnare ACL in modalità RW all utente drupalwp Condividere la directory Assegnare permessi RW all utente drupalwp Per Drupal, all interno della directory creare: Files Temp
Configurazione share su Drupal 6 Drupal richiede una piccola modifica ai sorgenti (1 riga!) per accedere correttamente ad una share SMB File: includes/file.inc Function: file_check_directory Orginal: if (!is_writable($directory)) { Modified: if (!touch($directory)) {
Demo Configurazione shared storage
Windows AppFabric Cache Nel mondo PHP l uso di cache distribuite come memcache/memcached è molto diffuso Windows AppFabric offre soluzioni di cache nel mondo MS API solo.net Integrazione con PHP e Drupal: http://drupal.org/sandbox/alexpilotti/1209704 Sviluppato in collaborazione con BlueParabola (publisher di php architect) L ntegrazione avviene tramite un apposito modulo Drupal in PHP e un wrapper COM sulle API.Net di AppFabric
Q & A