Alpine Linux : comment l’utiliser et y installer un serveur web
Planté de bâtons
Le 30 août 2021 à 09h22
10 min
Logiciel
Logiciel
Les systèmes Linux sont connus pour être peu gourmands en stockage et en mémoire. C'est pour cela qu'on les trouve aussi bien dans de gros serveurs que dans le domaine de l'embarqué. Alpine est une distribution qui pousse cette logique à l'extrême tout en restant simple d'usage. Tour d'horizon.
Dans le monde des distributions Linux, il y a les incontournables, d'Ubuntu à Fedora, en passant par Debian, OpenSUSE, Arch et autres dérivés. Il y a celles visant un public pointu comme Gentoo ou Slackware, puis d'autres, dont on parle moins mais qui sont tout de même populaires, comme elementary ou Solus.
Bref, en 30 ans la communauté n'a pas chômé. Le site Distrowatch dénombre 274 distributions Linux dont il suit la popularité. Vous trouverez ici un graphique chronologique qui en montre l'ampleur et les grandes familles.
Alpine Linux : petit, mais costaud
Dans le lot, il y a aussi des distributions discrètes, du fait de leur usage particulier. C'est le cas d'Alpine Linux, très connue des adeptes de Docker et autres solutions d'isolation par les conteneurs. La raison est simple : elle vise une empreinte minimale tout en assurant un bon niveau de sécurité et en préservant la simplicité d'utilisation.
Elle n'occupe que quelques Mo d'espace disque comme nous l'avons vu dans notre guide sur les Linux Containers (LXC) sous Proxmox 7.0. Ainsi, lorsque vous voulez disposer d'un environnement Linux sans fioritures ou monter un petit serveur web, elle peut être largement suffisante, réduisant au passage la surface d'attaque.
Tout l'intérêt d'une distribution minimale, c'est qu'elle permet de mieux saisir ce qu'est un environnement Linux dans son expression la plus simple, son organisation où « tout est fichier » issue du monde Unix. Il peut donc être intéressant de maitriser un système comme Alpine pour débuter.
Cela vous familiarisera également avec celle qui est à la base de nombreux conteneurs, plutôt que de vous dire que tant que ça fonctionne, il est inutile d'y mettre le nez. Voici un guide pour y faire vos premiers pas.
Réconcilier compacité et simplicité d'usage
Créée en 2005 par Natanael Copa, Alpine était alors présentée comme une alternative se positionnant entre Gentoo-based Network Appliance (GNAP) et Bering uClibc du projet LEAF (Linux Embedded Appliance Framework). Deux distributions du monde de l'embarqué et du réseau, où l'espace de stockage/mémoire est très réduit.
Comme GNAP elle utilisait un noyau Linux 2.6, les ebuilds Gentoo et une base Hardened. Pour le reste elle était plutôt similaire à Bering, se reposant sur la librairie C compacte uClibc et BusyBox, un exécutable unique et occupant lui aussi peu d'espace, regroupant de nombreux outils de base issus du monde Unix.
Elle pouvait ainsi être utilisée depuis un périphérique de stockage classique ou la seule mémoire (RAM). Elle disposait déjà de son format de paquets et de son gestionnaire apk-tools, ne nécessitant pas de reboot après la mise à jour d'un paquet (ce qui était parfois le cas avec GNAP). APK se distinguait à l'époque par sa compression des métadonnées, sa gestion des dépendances et la récupération de paquets via HTTP.
Plus de 250 paquets était alors compilés pour Alpine, qui n'en était qu'au stade d'un projet Alpha.
Alpine et Docker : une relation particulière
Copa la présentait alors comme une version améliorée de l'existant, se voulant néanmoins capable de s'adapter à différents besoins. 16 ans plus tard, elle est l'une des plus réputées dans le domaine des conteneurs, de par son empreinte réduite et sa solidité, étant à la base de nombreuses solutions, notamment déployées via Docker.
En 2016, la société annonçait l'utilisation d'Alpine en complément d'Ubuntu pour ses images officielles, son fondateur et CTO de l'époque Solomon Hykes, ayant confirmé que Copa avait rejoint son équipe (jusqu'en 2019).
L'affaire avait alors fait grand bruit, tant la communauté était habituée à l'écosystème Debian/Ubuntu. À cette époque le travail sur Ubuntu (Snappy) Core en était à ses débuts. Aujourd'hui encore, Alpine, Debian et Ubuntu cohabitent dans les images officielles, comme on peut le voir dans le cas du serveur web nginx par exemple.
Certains ont fait le choix inverse récemment, comme dotCMS, repassé d'Alpine à Ubuntu.
Téléchargement et installation
Avec le temps et les usages, le positionnement d'Alpine Linux a donc changé, mais pas sa philosophie. Elle utilise toujours BusyBox, en complément de la bibliothèque C musl libc désormais, ainsi qu'OpenRC. L'Alpine Package Keeper (apk) a largement évolué, mais est toujours en charge de la gestion de paquets.
La distribution est disponible pour de nombreuses architectures : x86, ARM, ppc64le et s390X. Elle est également déclinée pour les différents Raspberry Pi (armhf, armv7 et aarch64), sous une forme minimale (netboot) ou avec un noyau spécialement adapté aux machines virtuelles. Et pour ceux qui veulent toute une série d'outils de base, il en existe même une version « extended », intégrant jusqu'aux mises à jour de microcodes AMD et Intel.
Alpine Linux ne nécessite que 32 Mo de mémoire
Son image ISO pèse ainsi 46 Mo (Virt), 145 Mo (Standard) ou 627 Mo (Extended). Une fois installée, elle occupe 106 Mo d'espace (Virt) ou 1,1 Go (Standard/Extended). Sous la forme d'un conteneur LXC, elle n'occupe que 8,8 Mo.
La procédure d'installation est disponible uniquement en ligne de commandes (CLI). Une fois l'image ISO lancée, on arrive à un invite de connexion. Indiquez root
comme nom d'utilisateur, aucun mot de passe ne vous sera demandé à cette étape. Le système est utilisable, mais on veut l'installer, ce qui passe par la commande suivante :
setup-alpine
Là il vous sera demandé la langue du clavier, le nom que vous voulez donner à la machine sur le réseau (hostname
), votre fuseau horaire et vos paramètres de connexion. Normalement, vous n'avez rien à faire, les paramètres par défaut doivent convenir. Mais si vous le désirez, vous pouvez les modifier pour utiliser une interface particulière, une IP fixe, un serveur proxy, etc. Ensuite, indiquez le mot de passe du compte administrateur (root
).
Une soixantaine de serveurs mirroir vous seront proposés pour télécharger les paquets. Choisissez un numéro dans la liste ou demandez au système de les tester et de sélectionner le plus rapide. Vous pouvez aussi modifier le fichier des sources. Il vous faudra ensuite choisir votre serveur SSH : OpenSSH, Dropbear ou aucun.
On termine par la méthode d'installation. Il en existe quatre :
- none : le système et ses données sont placés en RAM et seront perdus après le redémarrage
- sys : le système et ses données sont placés sur un HDD/SSD
- data : le système est placé en RAM, les données sur un HDD/SSD
- lvm : utilisation de Logical Volume Manager, les deux choix précédents seront proposés (lvmsys, lvmdata)
Si vous stockez le système en mémoire, il faudra trouver un moyen de sauvegarder la configuration. Vous pourrez le faire uniquement depuis un lecteur de disquettes (!) ou une clé USB. Une fois le système installé, vous pourrez l'utiliser directement s'il est placé en mémoire ou redémarrer si vous avez opté pour un stockage classique.
Ajout d'un utilisateur, accès SSH (avec ou sans sudo)
Il n'est pas conseillé d'utiliser directement le compte root
pour les actions du quotidien. On commence donc par créer un utilisateur classique qui disposera de son propre espace dans /home/
:
adduser nom_utilisateur
Vous pouvez dès lors l'utiliser pour vous connecter via SSH. Par défaut, ce n'est pas le cas du compte root
, pour les raisons évoquées précédemment. Vous pouvez y accéder de manière classique avec la commande :
su -
Autre possibilité, qui comporte des risques sur un système sensible en production : utiliser sudo pour exécuter une tâche avec le compte root. Il n'est pas présent par défaut, on met donc à jour le système avec apk et on l'installe :
apk update
apk upgrade // Vous pouvez fusionner les deux lignes avec apk -U upgrade
apk add sudo
La documentation recommande d'intégrer le groupe wheel
aux sudoers
et d'y ajouter le compte :
echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
adduser nom_utilisateur wheel
Déconnectez-vous et reconnectez-vous, vous pourrez alors exécuter une commande avec sudo :
sudo apk add htop
htop
Cela vous affichera le statut du CPU, de la mémoire et des process lancés (F10 pour quitter).
Installation de nginx et configuration
Passons maintenant à l'étape suivante, la mise en place d'un serveur web à travers nginx. On l'installe avec l'éditeur nano. Vous pouvez aussi opter pour vi qui est nativement présent sur le système :
sudo apk add nginx nano
Il faut maintenant éditer le fichier de configuration de nginx. Alpine Linux intègre nativement l'éditeur vi, vous pouvez aussi utiliser une alternative, nano dans notre cas :
sudo nano /etc/nginx/nginx.conf
Remplacez le nom d'utilisateur nginx en tête de fichier par celui que vous avez créé, enregistrez et quittez (CTRL + X). On édite ensuite le fichier de configuration du serveur web
sudo nano /etc/nginx/http.d/default.conf
Modifiez le contenu du fichier par la configuration suivante, enregistrez et quittez :
server {
listen 80 default_server;
listen [::]:80 default_server;
root /srv/www/; server_name votre_hostname; location /files { autoindex on; } }
On crée ensuite les dossiers et fichiers nécessaires. Vous noterez que nous plaçons le contenu de nos sites web dans le dossier /srv/www/
ce qui n'est pas toujours l'emplacement utilisé par défaut. Il n'y a en effet pas consensus sur le « bon endroit » pour cela, mais la version 3.0 de la FHS (Filesystem Hierarchy Standard), qui fait référence en la matière, précise que /srv/
doit être utilisé pour les services diffusant des données, dont « www » :
sudo mkdir -p /srv/www/files/
echo "Hello, World !" > /srv/www/index.html
wget https://cdn2.nextinpact.com/medias/wallpaper-nxi-v6-1080p.jpg -O /srv/www/files/nextinpact.jpg
On modifie les dossiers créés et les librairies de nginx pour en donner la propriété à l'utilisateur ainsi qu'au groupe www-data
, qui est celui en général en charge de l'accès aux serveurs web et à leurs données :
adduser nom_utilisateur www-data
sudo chown -R nom_utilisateur:www-data /srv/www
sudo chown -R nom_utilisateur:www-data /var/lib/nginx
Tout est prêt, on peut donc tester le fichier de configuration et lancer nginx s'il est valide :
sudo nginx -t
sudo rc-service nginx start
Les URL suivantes devraient fonctionner depuis votre machine (adaptez avec le hostname ou l'IP du serveur) :
http://votre_hostname/
http://votre_hostname/files/
http://votre_hostname/files/nextinpact.jpg
La première adresse devrait vous envoyer vers la page index.html
qui affichera le message Hello, World !
. La seconde vous listera des fichiers contenus dans le dossier files
. La troisième ouvrira le fond d'écran de Next INpact. Vous pouvez ajouter nginx à la liste des services à lancer au démarrage de la machine :
sudo rc-update add nginx default
reboot
Désormais, le serveur web sera actif dès que le serveur le sera. Avec notre configuration, l'ensemble des fichiers (système et serveur web) occupait 115 Mo d'espace disque, 35 Mo de mémoire étaient utilisés.
Pour aller plus loin, rendez-vous dans la documentation de nginx.
Alpine Linux : comment l’utiliser et y installer un serveur web
-
Alpine Linux : petit, mais costaud
-
Réconcilier compacité et simplicité d'usage
-
Alpine et Docker : une relation particulière
-
Téléchargement et installation
-
Ajout d'un utilisateur, accès SSH (avec ou sans sudo)
-
Installation de nginx et configuration
Commentaires (18)
Vous devez être abonné pour pouvoir commenter.
Déjà abonné ? Se connecter
Abonnez-vousLe 30/08/2021 à 09h34
Tiens, j’avais testé vite fait avec un container LXC (présent dans les templates), je la trouvais super light et rapide.
J’ai juste pas réussi à installer mariadb, enfin si, mais j’ai pas réussi à me connecter, c’est bien installé mais les commande mysql n’existent pas ^^,
J’ai pas cherché plus loin.
Mais c’est une ditrib intéressante pour un serveur web oui :)
Le 30/08/2021 à 10h00
Alpine j’ai tenté comme base pour des containers python. j’ai abandonné parce que elle n’utilise pas la lib C standard, et du coup aucun paquet wheel n’est disponible. ça prend un temps fou de compiler toutes les dépendances du projet…
Retour à une base Debian pour cette raison.
Le 30/08/2021 à 10h07
« la lib C standard » Il n’y a pas de « libc standard » Le principe d’Unix, la modularité, est justement qu’on peut en avoir plusieurs. La GNU libc n’est pas « standard », elle est juste répandue sur les environnements non-embarqués.
Le 30/08/2021 à 12h51
C’est effectivement une raison pour laquelle on utilise chez nous des images de base Debian pour certains de nos outils en Python. Compiler tout le bordel des modules Python requis résultait d’une image plus lourde que celle basée Debian, même en faisait un multistage.
Le 30/08/2021 à 10h03
@david est-ce ttu comptes faire un papier sur les BSD quand tu auras fini le tour des distro linux ?
Le 30/08/2021 à 10h26
Oui je fais un peu de raccourcis mais le fait est que les paquets binaires wheel de pypi ne sont pas compatibles avec la lib-c utilisée par Alpine ;)
Désolé pour mon abus de langage.
Le 30/08/2021 à 10h43
C’est un peu plus compliqué. De mémoire des discussions du début d’année il y a eu une PEP avec un tag spécifique aux distributions utilisant musl libc pour les binaires compilés avec leur support. Cela ne règle pas encore le problème, mais c’est un pas en avant.
Le 31/08/2021 à 06h19
Yup, Alpine utilise musl par défaut. Sauf erreur de ma part, le package libc6-compat doit fournir la couche de compatibilité requise pour les paquets python précompilés et tout les soft compilés pour la glibc en général.
Je ne l’ai pas testé pour les paquets, mais je m’en étais servi pour un autre soft assez galère à compiler pour musl, ça marchais plutôt bien.
Le 31/08/2021 à 08h00
Ah cool merci pour l’info :) je testerai.
Le 30/08/2021 à 11h45
C’est le pendant pour les conteneurs de tinycore du coup.
Question: quand on dit que le conteneur prend 35Mo de RAM, c’est vu depuis le conteneur ou depuis l’hôte?
Le 30/08/2021 à 11h53
T’avais installé mariadb-client ?!
Le 30/08/2021 à 11h57
Bon, tu m’as mis le doute, je viens de vite vérif pour le fun, et
Il s’installe avec mariadb-server sur Debian, je plaide non coupable
Le 30/08/2021 à 14h23
Tout excusé :) distro light = install light ;)
Le 30/08/2021 à 11h57
Est ce possible de l’installer sur un Synology? Et si c’est le cas quelle différence ce fait avec l os par défaut?
Le 30/08/2021 à 12h12
C’est une VM installée, pas un conteneur
En VM ou via un conteneur oui. Je ne comprends pas la seconde question par contre.
Le 30/08/2021 à 12h27
OK.
J’avais en tête que Alpine était utilisé dans les conteneurs et j’étais resté dans la continuité des articles sur proxmox.
Du coup c’est même plus pratique que tinycore à installer et configurer. LE système APK est moins complexe que les TCZ qui sont parfois capricieux.
Jusqu’à présent, j’utilisais tinycore car c’était toujours distribué en 32 bits et j’avais une plate-forme 32bits only et capable de démarrer uniquement sur FAT/NTFS (HP T5740).
Merci, plus qu’à tester en physique pour le lecteur audio dont j’aimerais descendre le temps de démarrage :)
Le 30/08/2021 à 17h18
Tout pareil et pour la même raison, Python 3 sur base debian-slim.
Le 01/09/2021 à 09h20
“ça marchais plutôt bien”, phrase politiquement correcte de développeur pour dire “j’ai gélré durant deux jours et deux nuits, lu des dizaines de pages stackoverflow, de forums, de blog et au final, “ça marche plutôt bien”