Retour : Page Principale > sommaire serveurs & domaines

Instance Moodle chez Gandi


Procédures et images à ajouter

Voir ça pour les potentielles optimisations : https://opensourceelearning.blogspot.fr/2012/10/why-your-moodle-site-is-slow-five.html
Parler de fail2ban MemoFail2ban
Parler du script de réduction des images https://gist.github.com/kstefanini/4aa6bdf6540152522996dc5611cc877c






Hop ce qui suit est un saut dans le passé, genre 2016-2017 :



Instance Moodle chez OVH


L'instance OVH a été supprimée le 5 mars 2019 après un délai suffisant d'un an d'inactivité. Les snapshots ont été conservés.
Les 22€ de l'instance ne seront plus facturés. Les moins de 3€ de snapshots seront encore facturé

On a choisi OVH et son offre de public cloud, voir lĂ  : ServeursOVH

Pour démarrer l'instance, on clique le bouton "Ajouter" et on essaie d'obtenir une instance ressemblant à ça :
(WIP, tests de charge en cours, ces caractéristiques ne sont peut-être pas les bonnes)

image Capture_du_20160711_105415.png (36.3kB)

Il faut également sélectionner le snapshot depuis la sélection de distrib. Histoire de pas se taper la réinstallation à chaque fois. Le snapshot est à entretenir au fur et à mesure des modifs intéressantes. Bien réfléchir avant de l'écraser :)

Le snapshot actuellement contient une copie de l'instance de test qui est sur Sequoia. (11/08/16)

État du serveur : http://mooc.tela-botanica.org/statut/
(login : moodle / mdp de l'utilisateur moodle)

Élasticité de l'instance

Un des intérêts d'utiliser une instance de serveur virtuel, c'est que c'est "élastique" : si on a besoin de plus ou moins de puissance, on change les caractéristiques de l'instance et on paye en fonction.
Élasticité est un grand mot dans le sens où on ne peut pas changer à chaud : le changement prend 15 bonnes minutes durant lesquelles le service est interrompu.

Une nouvelle option est apparue peut après la mise en prod du serveur, en bloquant la taille du disque à 50Go (quelque soit le type de serveur) cette option permet de profiter d'une possibilité de downgrade de l'instance. C'est une option à envisager, qui ne nécessite pas forcément une réinstallation complète.

Comment modifier une instance

Méthode magique
Il s'agit de modifier les caractéristiques d'une instance en cours de fonctionnement. Pour ce faire, cliquer sur la petite flèche en haut à droite de l'instance, choisir "modifier le type de serveur", changer de modèle et go.
Avantages :
  • ça conserve les donnĂ©es dans l'Ă©tat oĂą on les a laissĂ©es, au lieu de rĂ©injecter le dernier snapshot
  • l'adresse IP est conservĂ©e
  • ça demande moins de clics que la procĂ©dure "pas magique" ci-dessous
Inconvénients :
  • on ne peut pas injecter dans une instance N un snapshot rĂ©alisĂ© depuis une instance V si la taille totale du disque dur de V Ă©tait plus importante que celle du disque dur de N, en d'autres termes ON NE PEUT PAS RÉTROGRADER en termes de taille de disque ! Faire très attention Ă  ça, toujours travailler sur une instance ayant le plus petit disque possible !

Méthode pas magique
Il s'agit de supprimer l'instance, et en recréer une autre en injectant le snapshot précédemment réalisé sur l'instance d'avant.
Inconvénients :
  • l'IP change; mĂŞme avec l'IP Failover, cela pose des problèmes : le serveur est vu par l'extĂ©rieur avec son IP changeante et non l'IP Failover (question posĂ©e sur le forum OVH - pas de rĂ©ponse) - se reporter aux chapitres "Accès et IP changeante" et "Trucs Ă  changer lorsqu'on redĂ©marre l'instance (nouvelle IP)"
  • on ne peut pas injecter dans une instance N un snapshot rĂ©alisĂ© depuis une instance V si la taille totale du disque dur de V Ă©tait plus importante que celle du disque dur de N
Avantages :
  • aucun ? TODO vĂ©rifier

Ă€ savoir lorsqu'on change une instance

Toujours faire un snapshot avant, on ne sait jamais ce qui peut se passer (voir problèmes de taille de disque, ci-dessus).

Accès et IP changeante

nouvelle méthode
OVH propose des IP "failover" : en gros c'est une IP fixe qu'on peut router vers une instance (serveur virtuel) ou une autre en un clic depuis l'interface de gestion d'OVH.
Ça coûte 2€ / mois et ça permet de conserver la même IP quand on redémarre / ajuste une instance.

L'IP du serveur OVH-moodle est maintenant :
87.98.164.20
On peut maintenant tranquillement faire pointer un nom de domaine dessus.

Configuration : pour Debian
Une fois que cette config est "snapshottée", l'injection du snapshot dans une nouvelle instance fait que la nouvelle instance obtient la même IP (à moins qu'on ne l'ait pas libérée, si l'ancienne instance tourne encore - penser à ne pas faire ça).
Il faut juste cliquer sur l'IP dans l'interface de gestion d'OVH et l'associer Ă  la nouvelle instance.

TODO voir comment configurer le reverse-DNS si besoin (pour les emails ?) => apparemment il y a un bouton magique sur l'interface de gestion OVH.

Logiciels installés

Dernière mise à jour: 2016-08-12
Dernier snapshot: 2016-08-12

apache2

Configuration en accord avec

Note: ne pas désactiver mod_status sinon la sonde Munin ne fonctionnera plus.

Notamment, utilisation de mpm_event au lieu de mpm_prefork.
TODO vérifier que mod_deflate fonctionne.

mariadb-server-10.0

Configuration en accord avec :

Outils d'aide Ă  la configuration

Les outils mysqltuner.pl (ce bon vieux Major Hayden) et tuning-primer.sh sont installés dans /root.
TODO Penser à les lancer lorsque le serveur sera en charge et aura tourné depuis logntemps.

Note : le log des slow_queries et des requêtes n'utilisant pas d'index est activé; penser à le surveiller, et à ajuster les valeurs; vérifier que çane consomme pas trop de performances et d'espace disque.
slow_query_log_file = /var/log/mysql/mysql-slow.log
slow_query_log      = 1
long_query_time = 5
log_queries_not_using_indexes


phpMyAdmin

http://ovh.tela-botanica.org/phpmyadmin/
Le paquet Debian phpmyadmin nécessite PHP5, et l'installation de PHP5 empêche Apache d'utiliser mpm_event.
On a donc téléchargé phpMyAdmin 4.6 dans /home/moodle et créé un lien depuis /var/www/html.

php7.0-fpm

Installé en remplacement de libapache2-mod-php7.0
Infos : http://.../info.php
Pour le redémarrer :
service php7.0-fpm restart


php7.0-opcache

Mémoire augmentée à 256 Mio car les 64 Mio par défaut étaient remplis à 100%.
Dans /etc/php/7.0/fpm/php.ini :
opcache.memory_consumption=256


php7.0-apcu

TODO vérifier que c'est plus rapide avec APCu, je suis pas certain.
TODO les tutos sur Moodle parlent d'APC et pas d'APCu; vérifier les réglages et la pertinence d'APCu.

opcache-gui

Installé dans http://.../opcache-gui

munin

http://munin.agathis.tela-botanica.net/Moodle/index.html

Sonde  Apache2

Ne fonctionnait pas de base en raison d'une absence d'un module Perl : LWP:: UserAgent
Solution : installer les paquets libwww-perl libdbi-perl libdbd-mysql-perl libgd-gd2-perl libparse-http-useragent-perl

Sonde PHP-FPM

Installation de https://github.com/tjstein/php5-fpm-munin-plugins dans /usr/share/munin/plugins en suivant le tuto - ça a l'air de marcher avec PHP 7.
Ce n'est pas la même sonde PHP-FPM que celle qui est installée sur Agathis - TODO vérifier la quelle des deux est la mieux.

Sonde php_errors_

Écrite par... Raphaël Droz => WTF ?
Installée dans /usr/share/muin/plugins/php_errors_
Modifiée pour prendre en compte les Exceptions PHP non traitées ("Default exception handler").

fio

Ce machin sert à benchmarker les i/o. Voici ce que ça donne (pâté ci-dessous).
Ă€ la ligne write: on peut lire iops=3998 ce qui est potable mais pas bien folichon non plus.
Ă€ titre de comparaison :
  • sur Osyris on est Ă  86 737 (!! disques SAS 15 000 tours + RAID 1 matĂ©riel - Ă©tonnant d'avoir des perfs aussi immenses sans SSD, dĂ» au cache de la carte RAID ?)
  • sur mon PC dans /home on est Ă  964 (SATA3 10 000 trs/mn).
  • sur mon PC dans /tmp on est Ă  24 119 (SSD).
root@moodle:~# fio --name=rand-write --ioengine=libaio --iodepth=32 --rw=randwrite --invalidate=1 --bsrange=4k:4k,4k:4k --size=512m --runtime=120 --time_based --do_verify=1 --direct=1 --group_reporting --numjobs=1
rand-write: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=32
fio-2.1.11
Starting 1 process
rand-write: Laying out IO file(s) (1 file(s) / 512MB)
Jobs: 1 (f=1): [w(1)] [100.0% done] [0KB/15988KB/0KB /s] [0/3997/0 iops] [eta 00m:00s]
rand-write: (groupid=0, jobs=1): err= 0: pid=8727: Tue Aug  9 15:24:08 2016
  write: io=1874.3MB, bw=15993KB/s, iops=3998, runt=120008msec
    slat (usec): min=1, max=18380, avg=15.81, stdev=55.16
    clat (usec): min=89, max=93796, avg=7984.42, stdev=988.01
     lat (usec): min=118, max=93808, avg=8000.66, stdev=986.97
    clat percentiles (usec):
     |  1.00th=[ 5664],  5.00th=[ 7840], 10.00th=[ 7904], 20.00th=[ 7968],
     | 30.00th=[ 7968], 40.00th=[ 7968], 50.00th=[ 7968], 60.00th=[ 7968],
     | 70.00th=[ 8032], 80.00th=[ 8032], 90.00th=[ 8032], 95.00th=[ 8096],
     | 99.00th=[10304], 99.50th=[11456], 99.90th=[14912], 99.95th=[19072],
     | 99.99th=[26240]
    bw (KB  /s): min=13600, max=18920, per=100.00%, avg=15997.41, stdev=252.06
    lat (usec) : 100=0.01%, 250=0.04%, 500=0.01%, 750=0.01%, 1000=0.01%
    lat (msec) : 2=0.04%, 4=0.35%, 10=98.40%, 20=1.10%, 50=0.04%
    lat (msec) : 100=0.01%
  cpu          : usr=2.58%, sys=7.21%, ctx=465236, majf=0, minf=8
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=479814/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: io=1874.3MB, aggrb=15992KB/s, minb=15992KB/s, maxb=15992KB/s, mint=120008msec, maxt=120008msec

Disk stats (read/write):
  vda: ios=0/481938, merge=0/288, ticks=0/3819328, in_queue=3819212, util=99.97%


Trucs Ă  changer lorsqu'on migre Moodle


bibliothèques PHP
Lors d'une migration sur une nouvelle machine, on ne passe pas par la phase de vérification de l'environnement qui est normalement effectuée par Moodle au moment de l'installation.
Il faut donc aller dans Administration du site > Serveur > Environnement, et installer ce qui manque.
Si cette page ne se charge pas en raison d'une erreur XML, il faut d'abord installer php7.0-xml.

mettre à jour la base de données
Le vĂ©rificateur d'environnement (voir "bibliothèques PHP ci-dessus) peut aussi avertir que le format de tables  InnoDb est "Antelope" au lieu de "Barracuda".
Pour remédier à ce problème il faut lancer en ligne de commande, avec un utilisateur ayant les droits d'écriture (ici www-data) le script de conversion :
su - www-data -s /bin/bash
php admin/cli/mysql_compressed_rows.php -l

Le script indique les tables Ă  migrer. Il faut ensuite l'appeler avec l'option -f pour rĂ©parer automatiquement, mais ça ne marche pas car l'utilisateur  MySQL dĂ©fini dans config.php pour se connecter Ă  la base n'a pas de super privilèges. Il faut donc demander au script les requĂŞtes SQL Ă  exĂ©cuter...
php admin/cli/mysql_compressed_rows.php --showsql

...pour ensuite les exĂ©cuter en root dans  MySQL :
mysql -u root -p
[copier-coller les requĂŞtes]


autorisations oAuth Facebook et Google
Si le nom de domaine de Moodle change (ou qu'on y accède directement avec son IP), il faut ajouter des autorisations dans les tableaux de bord de Facebook et Google+ pour que le login oAuth sur Moodle à partir de ces services continue de fonctionner.

Google : https://console.developers.google.com/apis/credentials/oauthclient/904626564271-68ngejvgfuvpb79di9fs7iidmqdadjbj.apps.googleusercontent.com?project=api-project-904626564271 (telabotanica)
Facebook : https://developers.facebook.com/apps/1372971312729108 (webmestre@)

Trucs à changer lorsqu'on redémarre l'instance (nouvelle IP)

Note : si on arrive à configurer l'IP failover comme étant celle avec lequel le serveur s'identifie à l'extérieur, on n'aura plus à faire tout ce b*rdel.
Note 2 : en utilisant la méthode "magique" de changement de type d'instance, l'IP changeante est également conservée.

config.php
Une fois l'instance lancée à partir du snapshot, il faut aller modifier le fichier config.php de Moodle pour y changer la valeur wwwroot, qui doit contenir l'ip de l'instance actuelle. Exemple :
$CFG->wwwroot   = 'http://149.202.186.116/moodle-test';

Si on utilise  MariaDB, rĂ©gler le driver de BD sur "mariadb" et non "mysqli" pour Ă©viter un problème (mineur) de numĂ©ro de version dans le vĂ©rificateur d'environnement.

redirection du nom de domaine
Note : plus besoin maintenant qu'on a des noms ("mooc." et "ovh.") qui pointent directement dessus.
i le nom de domaine mooc.tela-botanica.org pointe vers un autre serveur (par ex. Sequoia), et que c'est ce dernier qui redirige les requĂŞtes vers l'IP d'OVH, alors il faut changer la redirection pour y associer la nouvelle IP.
Éditer le .htaccess à la racine du domaine pointé par mooc.tela-botanica.org et y placer ces lignes (exemple pour la plateforme de test) :
Redirect /moodle-test http://[IP OVH]/moodle-test


mettre à jour la base de données
Plusieurs valeurs stockées dans la base de données de Moodle mentionnent l'adresse "wwwroot" du site; lors d'une migration il faut donc mettre à jour ces valeurs (comme indiqué dans la procédure de migration mentionnée ici).
Utiliser l'outil "rechercher-remplacer" situé à l'adresse admin/tool/replace/index.php, et remplacer http://ancienne-ip-ou-ancien-nom## par http://nouvelle-ip-ou-nouveau-nom##.

Google reCAPTCHA
Pour que le service reCAPTCHA de Google fonctionne, il faut que l'IP ou le domaine de chaque site l'utilisant soit déclaré.
Il faut donc se rendre sur https://www.google.com/recaptcha/admin (login: telabotanica) et ajouter la nouvelle IP au compte :
  • cliquer sur le compte concernĂ© (Plateforme MOOC - Moodle)
  • en bas, dans "paramètres de la clĂ©", ajouter une ligne avec l'IP
  • cliquer sur "enregistrer les modifications" => il est possible de devoir attendre max. 30 minutes que ça se propage

Note: si on ne fait pas cette démarche, on ne peut plus créer de compte sur Moodle. Il faut alors désactiver le captcha lors de l'inscription, mais ce n'est pas une bonne idée du tout !
Note 2 : au moment de la création d'un compte sur Moodle, lorsque le captcha ne marche pas, Moodle dit que c'est le mot de passe qui pose problème alors qu'en fait non, c'est le captcha.

VPN SupAgro
S'assurer qu' OpenVPN est bien installĂ© et configurĂ©, sans quoi les autres serveurs TB ne pourront pas ĂŞtre contactĂ©s par l'instance Moodle (voir point annuaire, ci-dessous).

connexion Ă  l'annuaire de TB
Une des méthodes d'authentification sur Moodle est l'annuaire de TB : un plugin se connecte à Agathis pour essayer d'authentifier les utilisateurs.
Pour que ça marche, il faut :
  • sur le  MySQL d'Agathis, autoriser l'IP de Moodle Ă  se connecter : GRANT des droits sur tela_prod_v4.annuaire_tela Ă  l'utilisateur 'apitela'@'ipovh'
GRANT SELECT ON tela_prod_v4.annuaire_tela TO 'apitela'@'149.202.178.169' IDENTIFIED BY 'mettreicilemotdepasse';

  • dans le firewall d'Agathis - /etc/shorewall/rules , autoriser l'IP de Moodle en entrĂ©e sur le port 3306 tcp
ACCEPT  net:[IP OVH] $FW  tcp     3306


Munin
Faut aussi aller rebrancher Munin coté Agathis dans /etc/munin/munin.conf :
Note: grâce à l'IP failover, cela n'est normalement plus nécessaire.

[Moodle]
  • address 149.202.186.116
  • use_node_name yes
Avec la bonne IP donc.

Pareil avec le plugin ip_ de munin:
http://wiki.kogite.fr/index.php/Munin-node_activation_plugins#Plugins_ip_.2A

Détails de la conf du plugin php
http://www.mon-code.net/article/13/plugin-pour-monitorer-les-erreurs-php-avec-munin

Sauvegarde

Principe calqué sur celui-ci : http://www.tela-botanica.org/wikini/DevInformatiques/wakka.php?wiki=SecuriteSauvegarde#sdcds

0. préparer Adansonia

Créer un dossier /home/ovh-moodle

1. SSH et clefs RSA

  • sur moodle-ovh :
    • crĂ©er une paire de clefs RSA pour l'utilisateur backup (existe par dĂ©faut dans le système)
    • su - backup -s /bin/bash
      • mkdir .ssh (au cas oĂą le dossier n'existe pas dĂ©jĂ  - dĂ©pend des versions de Debian apparemment)
      • chown backup:backup .ssh
      • chmod 700 .ssh
      • ssh-keygen -t rsa -N ""
  • sur Adansonia :
    • Ă©diter /var/backups/.ssh/authorized_keys et rajouter une ligne contenant la valeur de la clef publique créée sur moodle-ovh (qui se trouve dans /var/backups/.ssh/id_rsa.pub)
  • re-sur moodle-ovh :
    • essayer de se connecter en SSH, qui ne doit maintenant plus demander de mot de passe !
      • ssh backup@tela-botanica.no-ip.org (la première fois, rĂ©pondre "yes")
    • ajouter ces lignes dans /etc/ssh/ssh_config :
      • Host tela-botanica.no-ip.org
            CheckHostIP no
        

2. script de sauvegarde rsync

Récupérer le script backup_dist depuis Agathis ou Sequoia et le coller dans /usr/local/sbin.

Contenu au 2016-08-10 :
#!/bin/bash
source=$1
# on utilise no-ip.org car l'adresse externe de Numerdicable change de temps a autres
destination=backup@tela-botanica.no-ip.org:/home/ovh-moodle/
rsync -auR --stats --exclude *tmp* -e 'ssh -i /var/backups/.ssh/id_rsa' --delete $source $destination | head -n 3 >> $2


3. script de sauvegarde  MySQL

Récupérer le script backup_mysql depuis Agathis ou Sequoia et le coller dans /usr/local/sbin
L'adapter au contexte en changeant le rĂ©pertoire des bases  MySQL, le chemin de mysqldump et le mot de passe administrateur.
Penser Ă  rĂ©gler le mot de passe par dĂ©faut de l'administrateur de  MySQL dans /root/.my.cnf.

Contenu au 2016-08-10 :
#/bin/bash
# Sauvegarde base de donnee dans /home/utilisateur/bases sur 5 jours ...
# Mai 2004 David Delon Inspiration Faq ovh
# Parametres :
# $1 utilisateur
# $2 base (ou liste de bases)
# Le mot de passe de l'administrateur des bases de données est present dans : /root/.my.cnf
user=$1
mkdir -p /home/$user/bases/tmp 2>/dev/null
cd /home/$user/bases;
shift
for base in $*
do  
    touch tmp/$base.sql
    # Vérification de l'existence de la base
    if [ -d /var/lib/mysql/$base ] ; then
        mysqldump --add-drop-table -u root $base -f > tmp/$base.sql;
    fi
done
# Suppression de tous les fichiers sql du dossier tmp
/tar zcf bases-$(date -I).tar.gz tmp/*.sql --remove-files
# Suppression des sauvegardes de plus de 5 jours
/find /home/$user/bases/bases*.gz -mtime +5 -exec /bin/rm -f {} \;
# Attribution du bon utilisateur Ă  tout le contenu du dossier bases
cd /home/$user
chown $user:$user -R bases


4. le CRON qui dit "non"

Récupérer le script mysqlbackup depuis Agathis ou Sequoia et le coller dans /etc/cron.daily
Modifier le script pour faire apparaître un compte utilisateur par ligne, et la liste des bases à sauvegarder pour chacun d'entre-eux.
Lui donner des droits d'exécution : chmod +x mysqlbackup

Contenu au 2016-08-10 :
#!/bin/bash
/usr/local/sbin/backup_mysql moodle moodle


Récupérer le script ndistbackup depuis Agathis ou Sequoia et le coller dans /etc/cron.daily
Modifier le script pour sauvegarder /etc et les comptes utilisateurs souhaités, modifier le nom du serveur, l'expéditeur de l'email, etc.
Lui donner des droits d'exécution : chmod +x ndistbackup

Contenu au 2016-08-10 :
#!/bin/bash
date=`date +"%F"`
log="/tmp/sauve_distant_"$date".log"
debut=`date +"%c"`
echo "------------------------------------------------------------------------" >> $log
echo "Place disponible sur les disques de OVH-moodle :" >> $log
df -h >> $log
echo "------------------------------------------------------------------------" >> $log
echo "Debut sauvegarde distante OVH-moodle : $debut" >> $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /etc :" >> $log
/usr/local/sbin/backup_dist /etc $log
echo "------------------------------------------------------------------------" >> $log
echo "Sauvegarde /home/moodle :" >> $log
/usr/local/sbin/backup_dist /home/moodle $log
echo "------------------------------------------------------------------------" >> $log
fin=`date +"%c"`
echo "Fin sauvegarde distante OVH-moodle  $fin" >> $log
echo "------------------------------------------------------------------------" >> $log

(
 echo "From: Root OVH-moodle <root@mooc.tela-botanica.org>";
 echo "To: dev-log@tela-botanica.org ";
 echo "Subject: Sauvegarde rapport OVH-moodle du $date";

 echo "MIME-Version: 1.0";
 echo "Content-Type: text/html; charset=UTF-8";
 echo "Content-Disposition: inline";
 echo "<html>";
 echo "<body>";
 echo "<pre style="font: monospace">";
 cat $log
 echo "</pre>";
 echo "</body>";
 echo "</html>";
 ) | /usr/sbin/sendmail -t

rm -f $log


5. test

Pour vérifier que tout marche bien :
  • lancer en root /etc/cron.daily/mysqlbackup et vĂ©rifier que les bases sont bien sauvegardĂ©es, par exemple dans /home/moodle/bases
  • lancer en root /etc/cron.daily/ndistbackup et vĂ©rifier sur Adansonia que le rĂ©pertoire /home/ovh-moodle contient bien des donnĂ©es

Et voili !

Problèmes et solutions

En cas de surcharge d'emails ("exim mailqueue" qui monte sur Munin, par exemple), voir ici