Crash course Systèmes Administration LAMP
DISCLAIMER : Ceci contient de la vulgarisation!
DISCLAIMER (bis) : Faites ce que je dis, pas ce que je fais
Bases d un OS
L environnement de travail un noyau (kernel ) un shell un terminal des programmes
Le noyau Gestionnaire de communication entre les couches applicatives et les couches hardware http://en.wikipedia.org/wiki/kernel_(computing)
Le shell C est une interface avec le noyau Un shell est un programme comme un autre. Exemples : sh (historique) bash ( Bourne shell ) tcsh (Dérivé du C-shell) Windows (graphique) GNOME, KDE (graphique) Finder (graphique),...
Les deux modes d un shell Interactive mode : en ligne de commande $ echo test test Batch mode : depuis un fichier ( script ) $./testscript.sh test
Le terminal Un programme qui permet d entrer/sortir des informations En local : le shell lui-même À distance : une application terminal Un shell ou un programme est généralement attaché à un terminal
Les programmes Une collection passive d instructions un programme un process Exemples : Chrome cat Apache Server etc...
Les processus ou process (1/2) process = l éxecution d un programme Une machine multi-tâches permet l exécution de plusieurs processus (et donc de plusieurs applications, a priori) Un processus appartient à un utilisateur, qui l a généralement lancé
Les processes (2/2) daemon = processus en tâche de fond Généralement ce sont des enfants de processus plus globaux, comme init Un daemon est détaché d un terminal La majorité des daemons sont des enfants de init : cron, sshd, syslogd, etc...
Les sockets Chaque processus est complètement indépendant nécessité de points d échange communs : Les sockets sockets locales = fichiers, piles FIFO, LIFO sockets réseau = port + IP
builtins vs. paquets Les builtin sont intégrés au système / au shell Exemples : ls, cat, screen, dir (Windows), AppleScript (Mac OS X) etc Les paquets sont des programmes externes au systèmes, précompilés ou pas Exemple : avrdude (logiciel d upload sur Arduino), Sublime, htop, etc...
Acquérir un nouveau paquet Debian $ sudo apt-get install [XXX] Free BSD $ pkg_add -r [XXX] Mac OS X Packet manager : brew ou Macports (à installer) puis : $ brew install [XXX] Autres? Il faut installer un packet-manager spécifique Ex : chocolatey pour Windows
Quelques subtilités du shell
Entrée et sortie d un programme Clavier #0 stdin Programme #1 stdout Affichage #2 stderr
Exemples ls : pas d entrée, écrit dans #1 (stdout) cat : entrée #0, écrit dans #1 mv : entrée #0, pas de sortie stderr (#2) est la sortie standard pour tous les messages d erreur
La redirection (>) > et < permettent de rediriger les flux d entrée et de sortie de/vers d autres points > redirige #1 en écrasant >> redirige #1 en ajoutant à la suite < écrase #0 On peut expliciter et chaîner #1 et #2 Exemples : $ ls -la > /dev/null $ ls -la 2>/dev/null 1>&2
Le pipe ( - Alt+Maj+L sur Mac) Permet d envoyer/récupérer les entrées et sorties de/vers d autres programmes Tout est chaînable Exemples : $ ls -la 2>&1 tail $ cat monfichier.txt wc -l $ cat <(echo allo ) grep alli wc $ tail -f err.log sed -e s/toto/ta > log.sock
Les builtins utiles
mkdir / cd / ls / mv / cp / rm Exemples : $ cd - #revient au dossier précédent $ cd #va au /home de l utilisateur courant $ ls -la #affichage en liste avec les cachés $ mkdir test #créé le dossier test $ cp source destination #copie $ mv source destination #déplacement $ rm test #supprime le fichier test $ rmdir test #supprime le dossier test $ rm -fr test #equivalent
history Exemples : $ history #affiche l historique $ history -c #efface l historique $!4 #réexecute la commande n 4 de l hist. A savoir :!!:$ #contient les arguments de la commande précédemment exécutée [Ctrl-R] #rentre en mode recherche inversée
chmod / chgrp / chown Change les permissions et la propriété $ ls -la file.md -rw-r--r-- 1 tchap admin file.md
chmod / chgrp / chown $ ls -la file.md -rw-r--r-- 1 tchap admin file.md Ordre des permissions : [d] [user:rwx] [group:rwx] [all:rwx] Exemples : $ chmod a+x README.md $ chmod g+w,a+rw,u+rwx README.md $ chmod 755 README.md #x=1, w=2 et r=4
chmod / chgrp / chown $ ls -la file.md -rw-r--r-- 1 tchap admin file.md Owner (propriétaire) du fichier Exemples : $ chown newix README.md
chmod / chgrp / chown $ ls -la file.md -rw-r--r-- 1 tchap admin file.md Groupe du fichier Exemples : $ chgrp www_ README.md $ chown tchap:www_ README.md
sudo / su su = substitute user sudo = do as substituted-user Attention : pour utiliser sudo, il faut être dans les sudoers (pas le cas des offres mutualisées) Exemples : $ sudo chmod 777 file.sh $ sudo su - eric $ su #équivalent sudo su - root
more / cat / head / vim more affiche un fichier texte cat permet de concaténer N fichiers head affiche les N premières lignes d un fichier vi (ou vim) est un éditeur complet Exemples : $ cat file1 file2 > file3 $ head -n 20 test.sh > file4 http://en.wikipedia.org/wiki/vim_(text_editor)#features_and_improvements_over_vi
tail Affiche la fin d un fichier Pratique pour afficher des logs en continu pendant du debug Exemple : $ tail -n 50 apache.log $ tail -f e.log grep -e 500 404
grep / sed / awk Recherche d expression régulières, et action Exemples : grep -c mot file.vi #compte les mots cat test grep -e [0-9] #cherche les entiers cat test sed 's/[0-9]/xx/g' #remplace les entiers par XX awk 'length($0) > 10' README.md #affiche les lignes de plus de 10 caractères
En savoir plus sur sa machine (virtuelle )
uname Affiche les informations système Exemple : uname -a # Affiche toutes les informations
top / htop top = builtin, htop = paquet Permet de connaître l état du processeur et de la mémoire :
crontab (1/2) Gère les tâches programmées exécutées par cron (crond) Tâche = commande + timing cron crontab
crontab (2/2) Utilisation : $ crontab -l # liste les taches dans #1 $ crontab -e # édite avec $EDITOR Syntaxe : 00 11 * * *./do.sh #tous les jours à 11h00 23 */2 */3 * *./do.sh #tous les 3 jours, toutes les 2 heures à H:23
ps Affiche les processus en cours Exemples : ps #mes processus ps axf #tous les processus, en arbre Sur Mac OS X, $ brew install pstree pour visionner un arbre $ pstree
netstat Affiche les sockets ouvertes : locales et réseau Exemple : netstat -an #ne résoud pas les DNS (-n)
LAMP : Configuration minimale
Une requête web au serveur... Socket réseau Bufferisation Apache Redirection et appels PHP Processing dynamique MySQL Rechercher en BDD
PHP (1/2) Fichier de configuration : /etc/php.ini Copier php.ini.default sur une fresh install Penser à : Corriger la timezone : date.timezone = "Europe/Paris" Enlever l unicode automatique : detect_unicode = Off Vérifier : $ php -i grep timezone
PHP (2/2) PHP n est pas un démon! Pas besoin de le redémarrer... Exécution en ligne de commande : $ php monscript.php Dans un script sh : #!\usr\bin\php #ou autre chemin
Apache (1/3) contrôle : apachectl démon : httpd chaque connexion client/serveur = un process Configuration : /etc/apache2/httpd.conf Ajouter une libraire : LoadModule Inclure les autres confs perso, exemple : Include /etc/apache2/other/*.conf
Apache (2/3) Création d un vhost : Vérifier : apachectl -S
Apache (3/3).htaccess : à éviter, sauf éventuellement pour les accès restreints (et encore) Mots de passe : utiliser $ htpasswd Exemple : $ htpasswd -c /www/.htpasswd tchap
SQL (1/3) Postgre : contraintes clé étrangères Mysql/Maria : rapidité / simplicité Mongo : document-driven MySQL - démon : mysqld Installation via paquet, puis: http://dev.mysql.com/doc/refman/5.5/en/unix-postinstallation.html
SQL (2/3) Todo : Créer un mot de passe root Automatiser le lancement du serveur au démarrage Vérifier l accès, la création de base, de tables, etc..
SQL (3/3) Clients SQL : Mac OS X : Sequel Pro (http://www.sequelpro. com/) Web-browser : phpmyadmin Clients Mongo : Web-browser : rockmongo
Bonnes pratiques MySQL Une base = un nouvel utilisateur spécifique qui porte le même nom On utilise JAMAIS root pour se connecter au démon On créé les tables en minuscule
Déployer une application web Quelques protips
Problématiques Un déploiement peut être long Nécessite des changements à tous les étages de la requête (Apache, code, BDD) Si une requête arrive pendant le déploiement (état indéfini du code) faille de sécurité
Approche ancestrale 1. Déploiement FTP 2. Modifications de base en local sur serveur 3. Modification de la configuration Apache 4. Redémarrage Apache BEURK!
Approche pragmatique Déploiement dit atomique 1. Déploiement SSH dans un nouveau dossier 2. Modification de la configuration Apache 3. Script de modifications de base 4. Redémarrage Apache 5. Linking au dernier moment MIEUX
Approche des winners Déploiement atomique et maintenance 1. Déploiement SSH dans un nouveau dossier 2. Modification de la configuration Apache 3. Passage en mode maintenance 4. Script de modification de base 5. Linking 6. Redémarrage Apache 7. Sortie de mode maintenance TOP!
$ ln -sfvn live-[id] live #pointe le raccourci live vers le bon dossier Déploiement atomique du code git + rsync, le combo gagnant $ git pull origin live #récupère la version live du code $ rsync -rlpt deploy/. live-[id]/. #copie le dossier de déploiement dans un dossier atteignable par Apache
Exemple
Deploiement à distance S='myserver.com' # SERVER P=22 # PORT PATH='~/deploy.sh' # SCRIPT PATH function deploy(){ ssh -t -t -t ${S} -p ${P} "${PATH} $*" }
Déploiement - Ne pas oublier Les sessions sont-elles toujours valables? Les caches ont-ils besoin d être vidés? Les droits des fichiers sont-ils bons? Quid des fichiers uploadés coté utilisateur lors d un déploiement atomique? il faut garder un lien vers ces fichiers... les configurations spécifiques à l environnement ont-elles été mises à jour?
Débugger
Analyser un bug (1/5) Ca marche pas
Analyser un bug (2/5) 1. Quelle partie de la pile applicative? a. J ai une réponse 200 du serveur, c est pas Apache b. Que me disent mes logs d erreur Apache? c. Si rien, que me disent tous mes autres logs? 2. Est-ce reproductible? 3. Quelles sont les conditions du bug? 4. Quelle est l erreur ressentie? Page blanche? Mauvais calcul? Comportement erroné? il faut identifier ce qui ne va pas
Analyser un bug (3/5) Retracer les différentes étapes de la fonction qui ne marche pas Exemple : Lance l évenement clic sur le bouton Appel d une fonction JS Fait un appel AJAX Attend la réponse Insère le texte de la réponse dans le DOM
Analyser un bug (4/5) Des sessions ouvertes avec des tail -f... Exemple : tail -f access* grep 500 404 #indique les erreurs 500 ou 404 au fil de l eau tail -f error* grep Fatal #les erreurs non rattrapées de PHP Attention aux erreurs silencieuses : appels Ajax, mauvais retours...
Analyser un bug (5/5) Savoir lire un log [Wed Aug 14 15:56:18 2013] [error] [client 127.0.0.1] PHP Notice: Undefined variable: template in /Users/tchap/Documents/home/www/thirdplace/src/thirdplace/Controller.php on line 24, referer: http://thirdplace.local/ [Wed Aug 14 15:59:44 2013] [error] [client 127.0.0.1] PHP Fatal error: Uncaught exception 'Twig_Error_Runtime' with message 'Variable "code" does not exist in "error.html.twig" at line 3' in /twig/lib/twig/template.php:317\n Stack trace:\n#0 /Users/tchap/Documents/home/www/thirdplace/vendor/twig/twig/lib/Twig/Environment.php(320) : eval()'d code(32): Twig_Template->getContext(Array, 'code')\n#1 [internal function]: TwigTemplate_1740a2ceaf04e59bf53149d2c4ebe570->block_title(Array, Array)\n#2 /Users/tchap/Documents/home/www/thirdplace/vendor/twig/twig/lib/Twig/Template.php(133): call_user_func(array, Array, Array)\n#3 /Users/tchap/Documents/home/www/thirdplace/vendor/twig/twig/lib/Twig/Environment.php(320) : eval()'d code(139): Twig_Template->displayBlock('title', Array, Array)\n#4 [internal function]: TwigTemplate_c5dd3a611f17eaaf7e674ec1efa4614b->block_head(Array, Array)\n#5 /Users/tchap/Documents/home/www/thirdplace/vendor/twig/twig/lib/Twig/Template.php(135): call_user_func(array, Array, Array)\n#6 /Users/tchap/Documents/home/ww in /Users/tchap/Documents/home/www/thirdplace/vendor/twig/twig/lib/Twig/Template.php on line 317
Débugger du rendu / script Javascript : Firefox : Firebug + Firecookies / Console Chrome : Chrome Dev Tools / Console CSS : Idem, avec l inspecteur au lieu de la console HTML : Pas de débug Sublime Linter
Utiliser ses propres logs Permet de tracer facilement un mauvais comportement (ce qu un log ou un debuggeur ne peut pas faire) PHP : echo / var_dump ou fwrite dans un fichier Javascript : console.log()
Bases du DNS
DNS (1/2) Distribué, comme son nom ne l indique pas Fait le lien entre une IP et un nom de domaine Types d entrées : A Mappe un nom avec une IP CNAME Alias de nom MX Lien entre un domaine mail et un MTA
DNS (2/2) Exemple :