Alpine Linux : comment l'utiliser et y installer un serveur web

Alpine Linux : comment l’utiliser et y installer un serveur web

Planté de bâtons

Avatar de l'auteur
David Legrand

Publié dans

Logiciel

30/08/2021 10 minutes
18

Alpine Linux : comment l'utiliser et y installer un serveur web

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, OpenSUSEArch 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 Linux Docker apk-tools

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 InstallationAlpine Linux Installation
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). 

Alpine Linux InstallationAlpine Linux Installation

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.

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

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

next n'a pas de brief le week-end

Le Brief ne travaille pas le week-end.
C'est dur, mais c'est comme ça.
Allez donc dans une forêt lointaine,
Éloignez-vous de ce clavier pour une fois !

Fermer

Commentaires (18)


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 :)


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.


« 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.


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.


@david est-ce ttu comptes faire un papier sur les BSD quand tu auras fini le tour des distro linux ?



(quote:1892695:Stéphane Bortzmeyer)
« 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.




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.


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.


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.


Tazer

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.


Ah cool merci pour l’info :) je testerai.


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?



eglyn a dit:


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 :)




T’avais installé mariadb-client ?! :smack:


Bon, tu m’as mis le doute, je viens de vite vérif pour le fun, et :oops:



Il s’installe avec mariadb-server sur Debian, je plaide non coupable :transpi:


eglyn

Bon, tu m’as mis le doute, je viens de vite vérif pour le fun, et :oops:



Il s’installe avec mariadb-server sur Debian, je plaide non coupable :transpi:


Tout excusé :) distro light = install light ;)


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?



(quote:1892721:brice.wernet)
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?




C’est une VM installée, pas un conteneur




vaneck a dit:


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?




En VM ou via un conteneur oui. Je ne comprends pas la seconde question par contre.



David_L a dit:


C’est une VM installée, pas un conteneur




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 :)



sebp a dit:


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.




Tout pareil et pour la même raison, Python 3 sur base debian-slim.



Tazer a dit:




“ç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” :D