lid's stuff

Varnish et systemd

Aaaah, systemd… Je ne vais pas faire un speech dessus - dans mon cas sysvinit me suffisait amplement, mais on a quand même vu et lu pas mal de FUD dessus.

Alors oui, les temps de démarrage sont plus rapides, oui, les logs sont en binaires (bien qu'on puisse facilement revenir à notre bon vieux syslog sans trop de difficultés), oui, la suite systemd inclut plus de 50 binaires différents - ce qui d'ailleurs reste tout à fait conforme à la philosophie UNIX, oui, ce n'est pas portable chez les autres (*BSD mais pas que, n'est ce pas Minix?), oui on peut ne pas apprécier Lennart Poettering, mais:

  • non, ce n'est pas un seul gros binaire pour tout faire
  • non, ce n'est pas non-conforme à la philosophie UNIX
  • non, il ne va pas manger votre maman
  • et oui, il devenait nécessaire du moins pour les distribs desktop de changer de système d'init. Pour les distribs serveur, l'intérêt est nettement moins évident.
  • et oui, il y a plein d'alternatives, d'openrc à runit, c'est ce qui est beau dans le monde du libre.
  • et oui, que Gnome en fasse une dépendance (quoique, Gnome tourne aussi sur OpenBSD, et sans systemd) est à mon avis très, très con.
  • et oui, apprendre un nouvel init, ça peut être embêtant. Mais vous ne seriez pas sysadmin (amateur ou professionnel) si vous n'aimiez pas passer votre temps à apprendre de nouvelles technologies!

Par contre, en tant qu'adminsys consciencieux, j'ai tendance à mettre à jour souvent et notamment lors de la sortie d'une nouvelle release de la distro que j'utilise le plus souvent: Debian. Et Debian est passée à systemd avec la sortie de Jessie (ce qui a entraîné un shitstorm sans nom dans le milieu du libre, avec des promesses de forks comme Devuan dont on attend toujours des nouvelles, d'ailleurs).

Maintenant, je me suis retrouvé avec un problème assez rigolo sur une des plateformes que j'administre, lors de la migration, avec un logiciel assez vital puisqu'il s'agit de notre… cache: j'ai nommé Varnish.

Mais alors, c'est quoi le problème?

Alors en fait il y en a plusieurs:

  • On passe de Varnish 3 à Varnish 4, ce qui m'a obligé à revoir une bonne partie de mon script vcl, mais rien de bien méchant: certaines commandes changent de nom, certaines options aussi, j'y reviendrai plus en détail dans un post ultérieur
  • Varnish et systemd… comment dire, eh bien ce n'est pas tout à fait au point. Mais ça se règle assez facilement comme vous allez le voir.

Mais alors, qu'est ce qu'il se passe?

Eh bien pour faire simple, après avoir configuré le vcl et /etc/default/varnish, rien. Il démarre bien, en effet. Mais pas avec les options définies dans /etc/default/varnish: pas les bons ports, pas les bonnes options de la ligne de commande, notamment le malloc, tout se passe comme s'il se lançait avec le /etc/default/varnish fourni par défaut.

Mais, c'est quoi la solution alors?

Tout d'abord, un petit café:

coffee

En fait, le responsable est en partie Varnish, et en partie systemd:

Tout d'abord, Varnish se lance avec les options définies dans l'unité systemd varnish.service… Qui sont les mêmes que dans le fichier /etc/default/varnish fourni par défaut :) - On peut le voir très simplement avec un:

systemctl status varnish

Qui va nous montrer la ligne de commande réellement lancée par systemd lors du démarrage de l'unité varnish.service

Par contre si on recharge la config Varnish, il récupère bien les bonnes valeurs. Car Varnish, dans ce cas, relit bien le fichier /etc/default/varnish, contrairement à ce qui se passe lorsqu'il se lance la première fois. La bonne blague.

Et comme, même si ça m'arrive rarement, je déteste avoir à lancer manuellement des services après un redémarrage (mise à jour du noyau par exemple), il m'a fallut trouver une solution simple pour que le problème soit réglé dès le boot.

La solution qu'elle est simple©

Bon alors, elle arrive cette soluce?

seriously?

Eh bien grande nouvelle, il va falloir éditer le fichier varnish.service! Youpi, voilà une bonne façon de commencer à se mettre à la syntaxe des unités systemd!

Tout d'abord, il faut copier l'unité de base:

# cp /lib/systemd/system/varnish.service /etc/systemd/system/

Puis l'éditer avec notre éditeur de texte favori:

# vim /etc/systemd/system/varnish.service

On va se retrouver avec ça, en gros:

[Unit]
Description=Varnish HTTP accelerator

[Service]
Type=forking
LimitNOFILE=131072
LimitMEMLOCK=82000
ExecStartPre=/usr/sbin/varnishd -C -f /etc/varnish/default.vcl
ExecStart=/usr/sbin/varnishd -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
ExecReload=/usr/share/varnish/reload-vcl

[Install]
WantedBy=multi-user.target

La ligne qui nous intéresse est la suivante:

ExecStart=/usr/sbin/varnishd -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Nope, je ne veux pas que Varnish se lance sur le port 6081 (en fait je veux qu'il se lance sur 4 ports en écoute, non, je ne veux pas un malloc de 256 pauvres petits mégas, mais bien de 10Go, etc, etc.)

Il suffit donc de modifier cette ligne avec les paramètres de votre fichier /etc/default/varnish, sauvegarder proprement tout ça, et enfin:

systemctl daemon-reload
systemctl start varnish

Et voilà, pour le coup, un petit cigare et un petit whisky!

oh yeah


Tagged under: web, sysadmin