Quelques astuces diverses, seizième
J’adore mon boulot, on a constamment les mains dans de nouvelles choses, on (re)découvre certains outils dont on pensait avoir une bonne maîtrise, et ça fait de nouvelles astuces à partager, en plus ça fait longtemps 🙂
Le piège du $_ENV vide dans PHP
Lors d’une migration d’un site sous Magento d’une VM Debian très mal configurée à un cluster AKS (Azure Kubernetes Service, je déconseille, allez sur un autre cloud provider), j’ai rencontré une difficulté liée à la récupération des variables d’environnement, la superglobale $_ENV de PHP était vide alors que phpinfo() me donnait bien ces variables.
Il s’avère que c’est lié à une configuration de la directive « variables-order » :
1 2 3 |
;old config ;variables-order="GPCS" variables-order="EGPCS" |
Voilà, par défaut il ne remplit que $_GET, $_POST, $_COOKIE, et $_SERVER (vous les avez les lettres ?). Dans un contexte plus classique on mettrait ces variables dans Apache et on les récupérerait via $_SERVER, mais ça ne s’appliquait pas ici.
Un repo git en souffrance : cannot lock ref ‘refs/remotes/origin/master’
J’ai eu cette erreur bizarre en bossant sur mon api de collection de films, en cherchant un peu, j’ai le coupable :
1 2 |
$ cat .git/refs/remotes/origin/master {"chrome://browser/content/browser.xul":{ |
Normalement il devrait y avoir un hash md5 correspondant au dernier commit enregistré du dépôt distant, je ne sais absolument pas comment ça s’est produit mais c’est dégueulasse. Ceci dit ce n’est pas complètement bloquant, j’ai pu pousser mes modifications malgré tout, mais ça l’a perturbé quand même. Pour réparer il faut plusieurs commandes (et une sauvegarde en cas de besoin) :
1 2 3 4 |
git branch --unset-upstream rm .git/refs/remotes/origin/master git gc --prune=now git branch --set-upstream-to=origin/master master |
Si ça vous arrive sur une autre branche que master, vous devrez évidemment adapter le nom. Vous pouvez tenter un git pull pour vérifier qu’il n’y a plus d’erreur.
Sublime Text : afficher les espaces et les tabulations
Quand vous n’avez pas à disposition un linter potable, au hasard pour Python, vous tombez facilement sur des erreurs d’indentation mixte espaces/tabulation, ce qui est interdit en Python 3. Dans Sublime Text, pour mieux mettre ça en lumière, vous pouvez afficher les « espaces blancs », qui auront alors une forme différente en fonction du contexte :
1 |
"draw_white_space": "all", |
Et comme une image vaut mieux qu’un long discours…
Find : chercher les fichiers et/ou dossiers vides
Alors j’avoue j’ai plus le contexte de ce qui m’a poussé à faire cette découverte, mais voilà, si vous voulez faire le ménage des dossiers vides, ou déjà les identifier, c’est comme ça :
1 |
find . -type d -empty |
Par contre, je me souviens avoir lu en fonction des sources qu’il pouvait y avoir des différences entre la version BSD et la version GNU de find (ah, ces libristes…).
wp-cli et « this does not seem to be a wordpress installation » : attention au yaml !
J’ai déjà évoqué wp-cli sur l’article qui me permet d’agréger les astuces diverses sur une page de récap. Cet outil puissant devrait vraiment faire partie des indispensables de tout administrateur WordPress. Mais parfois, il réserve quelques surprises, comme ici sur un WordPress fraîchement livré par une agence de développement, en voulant remplacer le domaine par celui de l’environnement concerné :
1 2 |
Error: This does not seem to be a WordPress install. Pass --path=`path/to/wordpress` or run `wp core download`. |
Et ça, même en passant le bon chemin (par défaut on l’exécute à la racine du WordPress). Il s’avère que les petits malins de l’agence ont glissé un petit fichier wp-cli.yml, interprété par l’outil, qui contenait la directive suivante :
1 |
path: web/wp |
Évidemment, ça va fonctionner beaucoup moins bien. Une fois retiré ce fichier, wp-cli a fait son boulot comme un charme.
Sublime Text, crawl, cpu au secours !
J’ai eu un problème au boulot avec Sublime Text avec une arborescence conséquente, plusieurs Gigaoctets et des centaines (milliers ?) de fichiers, à chaque ouverture Sublime Text me tabasse le CPU pendant plusieurs minutes, parfois la dizaine facile. Et lors de la création du contexte de build pour Docker, la mémoire vive explose à son tour. Mais certains dossiers ne sont même pas inclus dans le dépôt, ni dans l’image Docker de destination, donc pas la peine de perdre son temps à les parcourir.
Et bien il y a une option dans Sublime Text pour ça, il suffit d’ajouter à son fichier de configuration :
1 |
"folder_exclude_patterns": [".svn", ".git", ".hg", "CVS", "sites/static_*"], |
Dans mon cas, c’est le sites/static_* qui m’a permis de gagner 2Go de contexte de build, et 8 minutes de consommation CPU au lancement, dû au crawl. Vous pouvez ajouter les vôtres, vous me remercierez ensuite 🙂
AWS EC2 et resolv.conf écrasé : retrouvez le bon DNS
Lorsque comme LBN vous gérez certaines configurations globales via un outil comme chef, il arrive parfois que l’on fasse des conneries, et qu’on paramètre certaines choses de travers sur des plateformes spécifiques. Dans mon cas les résolveurs DNS renseignés sur une instance EC2, qui à l’origine sont fournis par AWS via DHCP, ont sauté et été remplacés par des résolveurs qui ont plusieurs problèmes, le principal étant de ne pas être publics et donc de refuser la résolution récursive :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@server-p-01:~]# dig domain.tld ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> domain.tld ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 61389 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;domain.tld. IN A ;; Query time: 17 msec ;; SERVER: 1.2.3.4#53(1.2.3.4) ;; WHEN: Tue Mar 26 13:23:51 2019 ;; MSG SIZE rcvd: 36 |
Pour récupérer celui d’AWS, qui peut varier en fonction de la région, la zone de disponibilité, des subnets, on peut soit forcer un dhclient, soit regarder les anciennes réponses, car dhclient enregistre les baux dans un fichier, /var/lib/dhclient/dhclient-eth0.leases :
1 2 3 4 5 6 7 8 9 10 |
lease { interface "eth0"; fixed-address 4.5.6.7; option subnet-mask 255.255.255.224; option routers 4.5.6.254; option dhcp-lease-time 3600; option dhcp-message-type 5; option domain-name-servers 1.2.3.4; (...) } |
Mieux que de reboot le serveur hein ?
Désactiver/interdire HTTP 1.0 sur Apache/Nginx
De nos jours, et à moins d’un besoin très, très spécifique, il n’est plus nécessaire de conserver ce protocole qui remonte à trop longtemps pour être honnête. Et en effet, dernièrement, à part via des outils peu scrupuleux qui tabassaient des plateformes ou tentaient de l’exploitation de faille, je n’ai pas vu d’utilisation légitime d’HTTP 1.0. Pour le bloquer au niveau de nos serveurs web préférés, il faut ajouter les directives suivantes :
1 2 3 4 5 6 7 8 9 |
#Apache RewriteEngine On RewriteCond %{THE_REQUEST} HTTP/1.0$ RewriteRule .* - [R=429] #Nginx if ($server_protocol ~* "HTTP/1.0") { return 429; } |
Évidemment, si vous avez une utilisation légitime d’HTTP 1.0 (et encore, ça me surprend quand même j’ai découvert que file_get_contents()
en PHP fonctionnait comme ça…), il faudra procéder autrement (peut-être ajouter un filtrage IP supplémentaire).
Du lien symbolique « automatique » à partir d’un dossier
Quand on installe des certificats X509 pour des clients, on a l’habitude de créer des dossiers par année d’installation, et de créer des liens symboliques vers les fichiers dans le dossier en cours, liens qui servent ensuite dans la configuration du serveur web. Quand les fichiers du dossier de l’année ont déjà le bon nom, pour faire les liens symboliques, on peut le faire en une seule commande :
1 |
ln -s 2019/* . |
Pour chaque fichier du dossier 2019, ça va créer le lien dans le dossier courant, lien qui porte le même nom que le fichier source. Très pratique 🙂
Améliorer les performances des volumes Docker
J’ai du pas mal manipuler de Docker ces dernières semaines, et aussi bien dans ma machine virtuelle que sur les plateformes client, les performances du stockages sont un point d’attention à ne pas laisser de côté. Docker permet quelques manipulations sur ce point, sur la machine virtuelle, je ne peux que vous recommander, si vous ne faites que des tests, d’abuser du cache. Une des méthodes les plus simples, dans le fichier docker-compose, déclarer votre volume de cette manière :
1 2 |
volumes: - /home/seboss666/docker/grafana:/var/lib/grafana:cached |
Pour les détails et les impacts sur les performances (et l’intégrité des données), je vous laisse avec cet article en français, une fois n’est pas coutume, qui s’est penché sur le sujet.
Trois mois mine de rien, il était temps de remettre ça. J’ai plus rien en stock par contre dans l’immédiat, et je ne sais pas encore quand je vais pouvoir remettre ça.