SlideShare uma empresa Scribd logo
1 de 24
Les bonnes
pratiques
de l’hébergement d’une application
                      DRUPAL
Welcome




Sébastien Lucas                Nicolas Silberman
@PoMM3                         @nsilberman
Responsable avant-vente        Directeur Technique
Designer d’infra               Mediapart
Oxalide & Drupal
Le Projet Médiapart
Présentation métier
   • Le projet Mediapart
   • Volumétrie
   • Taille de la Team


Médiapart & Drupal
   • Historique
   • Version : Drupal 6 non Pressflow
Les spécificités du projet
              Web
              •Trafic très variable,
              •Cycle de développement très court,

              Presse
              •Outil de travail de la rédaction,
              •Pics d’actualité non anticipables,

              Médiapart
              •Forte activité connectée,
              •Un e-commerçant d’un produit
              dématérialisé,

              Drupal
              •Riche fonctionnellement,
              •Travail permanent sur la performance.
Critères
pour bien dimensionner son infrastructure

• Volumétrie & répartition du trafic
• Performance & indicateurs

• Pré-requis de disponibilité (SLA)
• Différentes catégories de service

• Provenance des visiteurs/utilisateurs : FR
3 silos
Public                    Rédaction             Pré-production




FORTE Charge              FAIBLE Charge         FAIBLE Charge
FORTE Variation           FAIBLE Variation      ZERO Variation
FORTE Disponibilité       FORTE Disponibilité   FAIBLE Disponibilité



Silo:                     Silo :
-Multicouches             -Mono Frontal
-N-Frontal                                      Silo autonome
                          -Isolé
-Actif-Actif multisites   -Mono site
-Haute disponibilité
Infrastructure
   Site A
   PA-2                                    backoffice       preprod




   ACTIF

                  LVS                                   backend

            FW & Répartition   Cache   Front             Back
              de charge


   Site B
   PA-3




   ACTIF          LVS                                   backend
Architecture
logicielle
Répartition de charge &
HA
Répartition de charge de layer 3
   • vers les serveurs Varnish,
   • vers les services internes Actif/Actif (MySQL Slaves)

Répartition de charge layer 7
   • Varnish vers les frontaux Drupal

Réplication Master/Master MySQL
   • Vip + HeartBeat

Haute disponibilité des services Back (SolR&memcache)
   • Heartbeat + réplication native master/slave (SolR) + Switch de
     redémarrage sur la conf
   • Memcache vide
Segmenter vos règles de
caching
Varnish                                Mise en cache systématique avec une
Règles générales                       rétention importante pour vos médias ou
Fréquence de modification faible       pages statiques (images, js, css, 404, etc.)
                                       Supprimer les cookies « inutiles »
                                       (Analytics) & Lazy session (<7)

Apache                                 Surcharger les headers « cache-control »
Règles un peu plus fines               depuis votre conf ou .htaccess pour
Fréquence de modification épisodique   certaines rubriques publiques « one-to-all »
                                       de votre site (max-age=X, public|private)



Applicatif – cache-control             Piloter directement depuis l’applicatif (code
Règles fines                           ou backend)
Modification en « temps réel »
Varnish
Implémenter des stratégies « métiers » de
caching
• Cache anonyme : la
  version du site publique
  sans auth
• Cache par groupe & rôle
• Cache par user

ESI pour déterminer les
  blocs cachables et
  accessibles
Varnish
Implémenter des stratégies « métiers » de
caching
                  sub vcl_recv
                  {
                                         [...]
                                         # Test d'exclusion du cache (pass = "pas de cache", lookup="accès au cache")
                                         if (req.http.Cookie)
                                         {
                                         # Test sur l'url pour déterminer si il s'agit d'une page avec des tags ESI ou un appel ESI directement
                                         if (req.url ~ "^/esi/get" || req.url ~ "^/$" || req.url ~ "^/whatever/(a|b|c)/")
                                         {
                                         # Extraction de la stratégie de cache depuis les variables GET de l'url
                                         if (req.url ~ "^.*&cache=[^&]+$")
                                         {
                                         # assignation de la strategie de cache a un en-tete HTTP (trick varnish pour créer des variables)
                                         set req.http.X_CACHE_MODE = regsub(req.url, "^.*&cache=([^&]+).*$", "1");
                                         }
                                         }
                                         else
                                         {
                                         return (pass)
                                         }
                                         # assignation de l'ID de session (extrait du cookie) à un en-tete HTTP.
                                         set req.http.X_SESS_COOKIE = "session-" + regsub(req.http.Cookie, "^.*?SESS[0-9a-zA-Z]{32}=([^;]*);*.*$", "12");
                                         # C embarqué pour gérer le retour d'erreur de la fonction Vmod_Func_memcached.get
                                         # On verifie ici si une session actuellement valide correspond ‡ l'ID extrait du cookie.
                                         # Pour cela on utilise le vmod memcached de varnish.
                                         C{
                                         if (Vmod_Func_memcached.get(sp, &vmod_priv_memcached, VRT_GetHdr(sp, HDR_REQ, "016X_SESS_COOKIE:")) ==
                  NULL)
                                           {
                                           /*Création d'un en-tete HTTP pour positioner un flag en cas de session invalide*/
                                           VRT_SetHdr(sp, HDR_REQ, "015X_SESS_VALID:", "Not Found", vrt_magic_string_end);
                                           }
                                           }C
                                           # exclusion du cache en cas de session invalide
                       if (req.http.X_SESS_VALID ~ "^Not Found$")
                       {
                           return (pass);
                       }
                                           }
                                           return (lookup)
                  }
Varnish
Implémenter des stratégies « métiers » de
caching
              sub vcl_hash
              {
                                          # Si la requête est acheminée ici, alors la présence du cookie autorisé l'accès au cache authentifié.
                                          if (req.http.Cookie)
                  {
                      hash_data("authenticated");
                  }
                                               # Extraction de la strategie de cache depuis le en-tête http créé précédemment
                  if (req.http.X_CACHE_MODE)
                  {
                                               # Stratégie de cache au niveau "user".
                                               # on hash donc la ressource sur le nom du user extrait du cookie.
                      if (req.http.X_CACHE_MODE == "user")
                      {
                          if (req.http.Cookie ~ "user=")
                          {
                              set req.http.X-CACHE-USER = regsub( req.http.Cookie, "^.*?user=([^;]*);*.*$", "12" );
                              hash_data(req.http.X-CACHE-USER);
                          }
                      }
                                               # Stratégie de cache au niveau "rôles"
                                               # on hash donc la ressource sur le nom
                                               # du group (un groupe étant commun à plusieurs utilisateur)
                      if (req.http.X_CACHE_MODE == "roles")
                      {
                          if (req.http.Cookie ~ "roles=")
                          {
                              set req.http.X-CACHE-ROLES = regsub( req.http.Cookie, "^.*?roles=([^;]*);*.*$", "12" );
                              hash_data(req.http.X-CACHE-ROLES);
                          }
                      }
                  }
                                               [...]
              }
Memcache
Affiner la stratégie de caching applicatif
                                       • Une instance par type de
     Front
      Front              Front
                          Front
                                         données,
                                       • Flush partiel vs flush global
    DRUPAL
    DRUPAL             DRUPAL
                       DRUPAL          • 3 containers pour Médiapart :
 MC HTML actif      MC HTML actif
                                          – HTML,
 MC HTML actif      MC HTML actif
                                          – Data diverse,
  MC Data actif
  MC Data actif      MC Data actif
                     MC Data actif        – Session.
                                          … possible d’aller plus loin
                                            (pages, vues, blocs, menus,
    BackEnd
     BackEnd           BackEnd
                        BackEnd             filtres, etc.)
  MC Data actif
  MC Data actif     MC Session actif
                    MC Session actif
MC Session passif
MC Session passif   MC Data passif
                    MC Data passif     • Bien choisir la place dans
  MC Lock actif
  MC Lock actif     MC Lock passif
                    MC Lock passif       l’infrastructure (local vs
                                         remote)
                                       • Warning sur la charge réseau
Optimiser Drupal
• Utiliser l’API !
• Attention à l’abus de modules
• Dans les modules custom : penser cache.

• Compilation des assets css et js minifiés
  (agrégation et compression)
• Développer en E_STRICT
• DBlog en pré-production, syslog en production
• Pas de requêtes dans les thèmes
PHP & memcache
Optimiser l’environnement d’exécution
•   Apache : KeepAlive, MaxClients, MaxRequestsPerChild
•   Nginx + FPM : pour la faible empreinte applicative (et + FPM)

•   PHP Web <> PHP CLI

•   Memcache : memory limit
      Nb de req par sec -> nombre de connexions simultanées -> lié au
       nombre de FD par user et espace mémoire
      Nb d'évictions -> ajuster le max memory
      Optimisation de l’utilisation des pages des slabs
MySQL
Optimiser l’environnement d’exécution
•   Utiliser innoDB pour :
     – rester en transactionnel
     – minimiser les locks,
     – plus de tolérance à la concurrence.
•   innoDB tout en RAM (innodb buffer pool size au max)
•   Avec les empreintes MySQL Report & Tuner, on ajuste le nombre
    de connexions maxi en fonction de la mémoire,

•   Les tables ne sont jamais très grosses
•   Pb sur les tables de commentaires
•   Sharder et/ou partitionner si nécessaire (par année ou par mois)

•   Répartition lecture et faire une partie des lectures dans SolR.
•   Pensez au NoSQL ou indexation pour vos nouveaux modules
L’indexation
Transformer un coût variable en coût
fixe

•SolR pour la recherche :
  – Crawl Solr
  – Piloté par Drupal (check module)
Monitorer pour optimiser
•   Check HTTP
•   XHProf :
     –   Toutes les « n » requêtes,
     –   Sur un max_execution_time
•   Xdebug/Webgrind en mode
    trigger pour troubleshooter avec
    un watchdog qui simule une visite
    via lib curl

•   Pinba (mod PHP et mod nginx =>
    pour faire remonter le monitoring
    applicatif au niveau du serveur
    web),

•   Newrelic,
•   Plugin munin
•   Log Watchdog dans mongoDB
    pour les logs
Monitorer
l’environnement
          • Varnish : Hit ratio,
            Remplissage des
            différentes instances, etc.

          • Memcache : Sessions, %
            hits/sec, %req/sec,
            %evictions/sec; etc.

          • MySQL : Template
            Percona
Chargez !
JMeter pour voir si ça tient
                     1/ Home (anonyme)
                     2/ Authentification
                     ⇒Génération dynamique du form_build_id pour les variables
                     du POST http
                          Utilisation d’un pré-processeur beanshell (un composant
                          Jmeter) pour l’exécution d’un script php avecla logique Drupal
                          pour générer des id de formulaire unique.
                     ⇒Extraction des login/password depuis un .csv contenant
                     l’ensembles des comptes.
                     3/ Articles
                     ⇒Boucle sur un ensemble d’url d’article extraites depuis
                     un .csv
                          Affichage de la page1, page2 et des commentaires.
                     ⇒Post d’un commentaire
                     4/ Blog
                     ⇒Boucle sur un ensemble d’url de blog extraite depuis un
                     .csv
                     ⇒Post d’un billet de blog
                          Parsing du formulaire html pour l’extraction d’un id de
                          formulaire unique. (via l’utilisation d’un regexp sur la page
                          html).
                     5/ Déconnexion
Piloter vos déploiements
• Versionner :
  CVS/SVN/Git
• Déployer : Capistrano
• Drush : Mise à jour du
  schéma des bases en
  fonction du modèle, etc.

• Piloter : Drush & Varnish
   – Warning bcp de choses en
     base => Coupler
     Capistrano pour activer
     Drush : Déploiement de
     fichiers + commande Drush
     (versioné dans Scripts
     shell)
Merci… des questions ?

Mais conteúdo relacionado

Mais procurados

Mais procurados (16)

Usages autour d’Ansible chez ikoula
Usages autour d’Ansible chez ikoulaUsages autour d’Ansible chez ikoula
Usages autour d’Ansible chez ikoula
 
Présentation Ansible Ikoula
Présentation Ansible IkoulaPrésentation Ansible Ikoula
Présentation Ansible Ikoula
 
Drupal et-caching-esi
Drupal et-caching-esiDrupal et-caching-esi
Drupal et-caching-esi
 
Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8
 
TP1 Big Data - MapReduce
TP1 Big Data - MapReduceTP1 Big Data - MapReduce
TP1 Big Data - MapReduce
 
Installation hadoopv2.7.4-amal abid
Installation hadoopv2.7.4-amal abidInstallation hadoopv2.7.4-amal abid
Installation hadoopv2.7.4-amal abid
 
Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
 
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataJournées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
 
Cours Big Data Chap3
Cours Big Data Chap3Cours Big Data Chap3
Cours Big Data Chap3
 
Squid
SquidSquid
Squid
 
Une introduction à HBase
Une introduction à HBaseUne introduction à HBase
Une introduction à HBase
 
Chapitre 2 hadoop
Chapitre 2 hadoopChapitre 2 hadoop
Chapitre 2 hadoop
 
Installer et configurer MariaDB
Installer et configurer MariaDBInstaller et configurer MariaDB
Installer et configurer MariaDB
 
HDFS HA : Stockage à haute disponibilité par Damien Hardy
HDFS HA : Stockage à haute disponibilité par Damien HardyHDFS HA : Stockage à haute disponibilité par Damien Hardy
HDFS HA : Stockage à haute disponibilité par Damien Hardy
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linux
 
Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010
 

Destaque

Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009
Oxalide
 
Comprendre pour choisir son hébergement
Comprendre pour choisir son hébergementComprendre pour choisir son hébergement
Comprendre pour choisir son hébergement
Oxalide
 
Cloud & physique, mauvaises et bonnes solutions
Cloud & physique, mauvaises et bonnes solutionsCloud & physique, mauvaises et bonnes solutions
Cloud & physique, mauvaises et bonnes solutions
Oxalide
 
Monitoring Des Applications Php, Salon Des Solutions Linux Open Source
Monitoring Des Applications Php, Salon Des Solutions Linux Open SourceMonitoring Des Applications Php, Salon Des Solutions Linux Open Source
Monitoring Des Applications Php, Salon Des Solutions Linux Open Source
Oxalide
 
200907 Petit Dejeuner Cloud Computing
200907 Petit Dejeuner Cloud Computing200907 Petit Dejeuner Cloud Computing
200907 Petit Dejeuner Cloud Computing
Oxalide
 
200907 Petit Dejeuner Reduction Couts
200907 Petit Dejeuner Reduction Couts200907 Petit Dejeuner Reduction Couts
200907 Petit Dejeuner Reduction Couts
Oxalide
 
Performance barcampfinal
Performance barcampfinalPerformance barcampfinal
Performance barcampfinal
Oxalide
 
Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009
Oxalide
 
Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...
Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...
Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...
Oxalide
 

Destaque (20)

Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009
 
Comprendre pour choisir son hébergement
Comprendre pour choisir son hébergementComprendre pour choisir son hébergement
Comprendre pour choisir son hébergement
 
Cloud & physique, mauvaises et bonnes solutions
Cloud & physique, mauvaises et bonnes solutionsCloud & physique, mauvaises et bonnes solutions
Cloud & physique, mauvaises et bonnes solutions
 
Barcamp Prestashop - Améliorer la disponibilité
Barcamp Prestashop - Améliorer la disponibilitéBarcamp Prestashop - Améliorer la disponibilité
Barcamp Prestashop - Améliorer la disponibilité
 
Retour d'expérience sur Capistrano
Retour d'expérience sur CapistranoRetour d'expérience sur Capistrano
Retour d'expérience sur Capistrano
 
Monitoring Des Applications Php, Salon Des Solutions Linux Open Source
Monitoring Des Applications Php, Salon Des Solutions Linux Open SourceMonitoring Des Applications Php, Salon Des Solutions Linux Open Source
Monitoring Des Applications Php, Salon Des Solutions Linux Open Source
 
200907 Petit Dejeuner Cloud Computing
200907 Petit Dejeuner Cloud Computing200907 Petit Dejeuner Cloud Computing
200907 Petit Dejeuner Cloud Computing
 
200907 Petit Dejeuner Reduction Couts
200907 Petit Dejeuner Reduction Couts200907 Petit Dejeuner Reduction Couts
200907 Petit Dejeuner Reduction Couts
 
Docker open stack
Docker open stackDocker open stack
Docker open stack
 
Performance barcampfinal
Performance barcampfinalPerformance barcampfinal
Performance barcampfinal
 
Andrei Petcu: Rocket vs Docker: Battle for the Linux Container at I T.A.K.E. ...
Andrei Petcu: Rocket vs Docker: Battle for the Linux Container at I T.A.K.E. ...Andrei Petcu: Rocket vs Docker: Battle for the Linux Container at I T.A.K.E. ...
Andrei Petcu: Rocket vs Docker: Battle for the Linux Container at I T.A.K.E. ...
 
Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009Clusif panoramadelacybercrimalite2009
Clusif panoramadelacybercrimalite2009
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Varnish & blue/green deployments
Varnish & blue/green deploymentsVarnish & blue/green deployments
Varnish & blue/green deployments
 
AgoraCMS 2014 : Les bonnes pratiques de l'hébergement d'un CMS pour une meill...
AgoraCMS 2014 : Les bonnes pratiques de l'hébergement d'un CMS pour une meill...AgoraCMS 2014 : Les bonnes pratiques de l'hébergement d'un CMS pour une meill...
AgoraCMS 2014 : Les bonnes pratiques de l'hébergement d'un CMS pour une meill...
 
Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...
Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...
Gérer 100 000 visites par jour avec Magento - Les enjeux e-commerce de Prisma...
 
Les bonnes pratiques d'une architecture logicielle et infrastructure de l'héb...
Les bonnes pratiques d'une architecture logicielle et infrastructure de l'héb...Les bonnes pratiques d'une architecture logicielle et infrastructure de l'héb...
Les bonnes pratiques d'une architecture logicielle et infrastructure de l'héb...
 
Simple, Scalable and Secure Networking for Data Centers with Project Calico
Simple, Scalable and Secure Networking for Data Centers with Project CalicoSimple, Scalable and Secure Networking for Data Centers with Project Calico
Simple, Scalable and Secure Networking for Data Centers with Project Calico
 
Mesos Networking
Mesos NetworkingMesos Networking
Mesos Networking
 
Kuryr + open shift
Kuryr + open shiftKuryr + open shift
Kuryr + open shift
 

Semelhante a 201211 drupagora hostingdrupal

OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyssOWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
Paris Open Source Summit
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Fabien Potencier
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Jean-Laurent de Morlhon
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
svuillet
 

Semelhante a 201211 drupagora hostingdrupal (20)

Meet-Up SQLI Lyon 09-2015 - Varnish
Meet-Up SQLI Lyon 09-2015 - VarnishMeet-Up SQLI Lyon 09-2015 - Varnish
Meet-Up SQLI Lyon 09-2015 - Varnish
 
Java EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdfJava EE _ Servlet et vue (1).pdf
Java EE _ Servlet et vue (1).pdf
 
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyssOWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09
 
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur webConférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
Conférence #nwx2014 - Thibaud Juin - Varnish, accélérateur web
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Cache
CacheCache
Cache
 
Javascript et JQuery
Javascript et JQueryJavascript et JQuery
Javascript et JQuery
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
 
AngularJS et autres techno frontend
AngularJS et autres techno frontendAngularJS et autres techno frontend
AngularJS et autres techno frontend
 
Sécurité MySQL
Sécurité MySQLSécurité MySQL
Sécurité MySQL
 
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
PHP #4 : sessions & cookies
PHP #4 : sessions & cookiesPHP #4 : sessions & cookies
PHP #4 : sessions & cookies
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScript
 
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
 

Mais de Oxalide

Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide
 
Clusif cloud-2010-datacenter
Clusif cloud-2010-datacenterClusif cloud-2010-datacenter
Clusif cloud-2010-datacenter
Oxalide
 
Clusif cloud-2010-securite
Clusif cloud-2010-securiteClusif cloud-2010-securite
Clusif cloud-2010-securite
Oxalide
 
Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...
Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...
Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...
Oxalide
 
200907 Petit Dejeuner Optimisation coûts 20m
200907 Petit Dejeuner Optimisation coûts 20m200907 Petit Dejeuner Optimisation coûts 20m
200907 Petit Dejeuner Optimisation coûts 20m
Oxalide
 

Mais de Oxalide (15)

Terraform & Vault - Un duo d'enfer!
Terraform & Vault - Un duo d'enfer!Terraform & Vault - Un duo d'enfer!
Terraform & Vault - Un duo d'enfer!
 
Workshop Docker & Kubernetes - Oxalide Academy
Workshop Docker & Kubernetes - Oxalide AcademyWorkshop Docker & Kubernetes - Oxalide Academy
Workshop Docker & Kubernetes - Oxalide Academy
 
Morning Tech#1 BigData - Oxalide Academy
Morning Tech#1 BigData - Oxalide AcademyMorning Tech#1 BigData - Oxalide Academy
Morning Tech#1 BigData - Oxalide Academy
 
Meetup Paris Monitoring #9 : Un système de gestion et de visualisation des al...
Meetup Paris Monitoring #9 : Un système de gestion et de visualisation des al...Meetup Paris Monitoring #9 : Un système de gestion et de visualisation des al...
Meetup Paris Monitoring #9 : Un système de gestion et de visualisation des al...
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
 
Docker compose
Docker composeDocker compose
Docker compose
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
ISO 27001 est-il soluble dans l'agilité ?
ISO 27001 est-il soluble dans l'agilité ?ISO 27001 est-il soluble dans l'agilité ?
ISO 27001 est-il soluble dans l'agilité ?
 
Paris hackers Meetup #12 - How to handle large audience
Paris hackers Meetup #12 - How to handle large audienceParis hackers Meetup #12 - How to handle large audience
Paris hackers Meetup #12 - How to handle large audience
 
La performance de vos applications Drupal
La performance de vos applications DrupalLa performance de vos applications Drupal
La performance de vos applications Drupal
 
Clusif cloud-2010-datacenter
Clusif cloud-2010-datacenterClusif cloud-2010-datacenter
Clusif cloud-2010-datacenter
 
Clusif cloud-2010-securite
Clusif cloud-2010-securiteClusif cloud-2010-securite
Clusif cloud-2010-securite
 
Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...
Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...
Les bonnes pratiques de l'hébergement e-commerce open-source (Conférence E Co...
 
200907 Petit Dejeuner Optimisation coûts 20m
200907 Petit Dejeuner Optimisation coûts 20m200907 Petit Dejeuner Optimisation coûts 20m
200907 Petit Dejeuner Optimisation coûts 20m
 
Conférence AFUP 20minutes.Fr
Conférence AFUP 20minutes.FrConférence AFUP 20minutes.Fr
Conférence AFUP 20minutes.Fr
 

201211 drupagora hostingdrupal

  • 1. Les bonnes pratiques de l’hébergement d’une application DRUPAL
  • 2. Welcome Sébastien Lucas Nicolas Silberman @PoMM3 @nsilberman Responsable avant-vente Directeur Technique Designer d’infra Mediapart
  • 4. Le Projet Médiapart Présentation métier • Le projet Mediapart • Volumétrie • Taille de la Team Médiapart & Drupal • Historique • Version : Drupal 6 non Pressflow
  • 5. Les spécificités du projet Web •Trafic très variable, •Cycle de développement très court, Presse •Outil de travail de la rédaction, •Pics d’actualité non anticipables, Médiapart •Forte activité connectée, •Un e-commerçant d’un produit dématérialisé, Drupal •Riche fonctionnellement, •Travail permanent sur la performance.
  • 6. Critères pour bien dimensionner son infrastructure • Volumétrie & répartition du trafic • Performance & indicateurs • Pré-requis de disponibilité (SLA) • Différentes catégories de service • Provenance des visiteurs/utilisateurs : FR
  • 7. 3 silos Public Rédaction Pré-production FORTE Charge FAIBLE Charge FAIBLE Charge FORTE Variation FAIBLE Variation ZERO Variation FORTE Disponibilité FORTE Disponibilité FAIBLE Disponibilité Silo: Silo : -Multicouches -Mono Frontal -N-Frontal Silo autonome -Isolé -Actif-Actif multisites -Mono site -Haute disponibilité
  • 8. Infrastructure Site A PA-2 backoffice preprod ACTIF LVS backend FW & Répartition Cache Front Back de charge Site B PA-3 ACTIF LVS backend
  • 10. Répartition de charge & HA Répartition de charge de layer 3 • vers les serveurs Varnish, • vers les services internes Actif/Actif (MySQL Slaves) Répartition de charge layer 7 • Varnish vers les frontaux Drupal Réplication Master/Master MySQL • Vip + HeartBeat Haute disponibilité des services Back (SolR&memcache) • Heartbeat + réplication native master/slave (SolR) + Switch de redémarrage sur la conf • Memcache vide
  • 11. Segmenter vos règles de caching Varnish Mise en cache systématique avec une Règles générales rétention importante pour vos médias ou Fréquence de modification faible pages statiques (images, js, css, 404, etc.) Supprimer les cookies « inutiles » (Analytics) & Lazy session (<7) Apache Surcharger les headers « cache-control » Règles un peu plus fines depuis votre conf ou .htaccess pour Fréquence de modification épisodique certaines rubriques publiques « one-to-all » de votre site (max-age=X, public|private) Applicatif – cache-control Piloter directement depuis l’applicatif (code Règles fines ou backend) Modification en « temps réel »
  • 12. Varnish Implémenter des stratégies « métiers » de caching • Cache anonyme : la version du site publique sans auth • Cache par groupe & rôle • Cache par user ESI pour déterminer les blocs cachables et accessibles
  • 13. Varnish Implémenter des stratégies « métiers » de caching sub vcl_recv { [...] # Test d'exclusion du cache (pass = "pas de cache", lookup="accès au cache") if (req.http.Cookie) { # Test sur l'url pour déterminer si il s'agit d'une page avec des tags ESI ou un appel ESI directement if (req.url ~ "^/esi/get" || req.url ~ "^/$" || req.url ~ "^/whatever/(a|b|c)/") { # Extraction de la stratégie de cache depuis les variables GET de l'url if (req.url ~ "^.*&cache=[^&]+$") { # assignation de la strategie de cache a un en-tete HTTP (trick varnish pour créer des variables) set req.http.X_CACHE_MODE = regsub(req.url, "^.*&cache=([^&]+).*$", "1"); } } else { return (pass) } # assignation de l'ID de session (extrait du cookie) à un en-tete HTTP. set req.http.X_SESS_COOKIE = "session-" + regsub(req.http.Cookie, "^.*?SESS[0-9a-zA-Z]{32}=([^;]*);*.*$", "12"); # C embarqué pour gérer le retour d'erreur de la fonction Vmod_Func_memcached.get # On verifie ici si une session actuellement valide correspond ‡ l'ID extrait du cookie. # Pour cela on utilise le vmod memcached de varnish. C{ if (Vmod_Func_memcached.get(sp, &vmod_priv_memcached, VRT_GetHdr(sp, HDR_REQ, "016X_SESS_COOKIE:")) == NULL) { /*Création d'un en-tete HTTP pour positioner un flag en cas de session invalide*/ VRT_SetHdr(sp, HDR_REQ, "015X_SESS_VALID:", "Not Found", vrt_magic_string_end); } }C # exclusion du cache en cas de session invalide if (req.http.X_SESS_VALID ~ "^Not Found$") { return (pass); } } return (lookup) }
  • 14. Varnish Implémenter des stratégies « métiers » de caching sub vcl_hash { # Si la requête est acheminée ici, alors la présence du cookie autorisé l'accès au cache authentifié. if (req.http.Cookie) { hash_data("authenticated"); } # Extraction de la strategie de cache depuis le en-tête http créé précédemment if (req.http.X_CACHE_MODE) { # Stratégie de cache au niveau "user". # on hash donc la ressource sur le nom du user extrait du cookie. if (req.http.X_CACHE_MODE == "user") { if (req.http.Cookie ~ "user=") { set req.http.X-CACHE-USER = regsub( req.http.Cookie, "^.*?user=([^;]*);*.*$", "12" ); hash_data(req.http.X-CACHE-USER); } } # Stratégie de cache au niveau "rôles" # on hash donc la ressource sur le nom # du group (un groupe étant commun à plusieurs utilisateur) if (req.http.X_CACHE_MODE == "roles") { if (req.http.Cookie ~ "roles=") { set req.http.X-CACHE-ROLES = regsub( req.http.Cookie, "^.*?roles=([^;]*);*.*$", "12" ); hash_data(req.http.X-CACHE-ROLES); } } } [...] }
  • 15. Memcache Affiner la stratégie de caching applicatif • Une instance par type de Front Front Front Front données, • Flush partiel vs flush global DRUPAL DRUPAL DRUPAL DRUPAL • 3 containers pour Médiapart : MC HTML actif MC HTML actif – HTML, MC HTML actif MC HTML actif – Data diverse, MC Data actif MC Data actif MC Data actif MC Data actif – Session. … possible d’aller plus loin (pages, vues, blocs, menus, BackEnd BackEnd BackEnd BackEnd filtres, etc.) MC Data actif MC Data actif MC Session actif MC Session actif MC Session passif MC Session passif MC Data passif MC Data passif • Bien choisir la place dans MC Lock actif MC Lock actif MC Lock passif MC Lock passif l’infrastructure (local vs remote) • Warning sur la charge réseau
  • 16. Optimiser Drupal • Utiliser l’API ! • Attention à l’abus de modules • Dans les modules custom : penser cache. • Compilation des assets css et js minifiés (agrégation et compression) • Développer en E_STRICT • DBlog en pré-production, syslog en production • Pas de requêtes dans les thèmes
  • 17. PHP & memcache Optimiser l’environnement d’exécution • Apache : KeepAlive, MaxClients, MaxRequestsPerChild • Nginx + FPM : pour la faible empreinte applicative (et + FPM) • PHP Web <> PHP CLI • Memcache : memory limit  Nb de req par sec -> nombre de connexions simultanées -> lié au nombre de FD par user et espace mémoire  Nb d'évictions -> ajuster le max memory  Optimisation de l’utilisation des pages des slabs
  • 18. MySQL Optimiser l’environnement d’exécution • Utiliser innoDB pour : – rester en transactionnel – minimiser les locks, – plus de tolérance à la concurrence. • innoDB tout en RAM (innodb buffer pool size au max) • Avec les empreintes MySQL Report & Tuner, on ajuste le nombre de connexions maxi en fonction de la mémoire, • Les tables ne sont jamais très grosses • Pb sur les tables de commentaires • Sharder et/ou partitionner si nécessaire (par année ou par mois) • Répartition lecture et faire une partie des lectures dans SolR. • Pensez au NoSQL ou indexation pour vos nouveaux modules
  • 19. L’indexation Transformer un coût variable en coût fixe •SolR pour la recherche : – Crawl Solr – Piloté par Drupal (check module)
  • 20. Monitorer pour optimiser • Check HTTP • XHProf : – Toutes les « n » requêtes, – Sur un max_execution_time • Xdebug/Webgrind en mode trigger pour troubleshooter avec un watchdog qui simule une visite via lib curl • Pinba (mod PHP et mod nginx => pour faire remonter le monitoring applicatif au niveau du serveur web), • Newrelic, • Plugin munin • Log Watchdog dans mongoDB pour les logs
  • 21. Monitorer l’environnement • Varnish : Hit ratio, Remplissage des différentes instances, etc. • Memcache : Sessions, % hits/sec, %req/sec, %evictions/sec; etc. • MySQL : Template Percona
  • 22. Chargez ! JMeter pour voir si ça tient 1/ Home (anonyme) 2/ Authentification ⇒Génération dynamique du form_build_id pour les variables du POST http Utilisation d’un pré-processeur beanshell (un composant Jmeter) pour l’exécution d’un script php avecla logique Drupal pour générer des id de formulaire unique. ⇒Extraction des login/password depuis un .csv contenant l’ensembles des comptes. 3/ Articles ⇒Boucle sur un ensemble d’url d’article extraites depuis un .csv Affichage de la page1, page2 et des commentaires. ⇒Post d’un commentaire 4/ Blog ⇒Boucle sur un ensemble d’url de blog extraite depuis un .csv ⇒Post d’un billet de blog Parsing du formulaire html pour l’extraction d’un id de formulaire unique. (via l’utilisation d’un regexp sur la page html). 5/ Déconnexion
  • 23. Piloter vos déploiements • Versionner : CVS/SVN/Git • Déployer : Capistrano • Drush : Mise à jour du schéma des bases en fonction du modèle, etc. • Piloter : Drush & Varnish – Warning bcp de choses en base => Coupler Capistrano pour activer Drush : Déploiement de fichiers + commande Drush (versioné dans Scripts shell)