Qu’est-ce qu’un serveur?
Lors d’une discussion récente, un ami m’a suggéré qu’un de ses problèmes de fonctionnalités disparaissant d’une application web venait du fait qu’il testait cette application sur sa machine locale plutôt que sur son serveur, en pensant que cette application désactivait ces fonctionnalités si elle repérait être sur une machine locale.
Bien que toutes sortes idées viennent immédiatement à un développeur pour réaliser cela lorsqu’on lui suggère, deux objections se présentent instantanément :
- Ça n’a aucun intérêt.
- Rien ne différencie un serveur d’une machine locale.
C’est ce second point que je voudrais clarifier aujourd’hui.
Un serveur est une application
La confusion courante est de croire que le serveur est une machine d’un genre spécial, qui ne fonctionne pas comme les autres. En un sens, c’est vrai, comme nous le verrons ensuite, mais pas d’un point de vue strict.
D’un point de vue strict, un serveur est une application : serveur web comme Apache, serveur ftp comme ProFTPd, serveur smtp/pop/imap (mail) comme Postfix, serveur svn comme Subversion, etc.
Installez l’une de ces applications sur votre machine locale, et vous avez un serveur.
Qu’est-ce qui fait qu’une application est un serveur?
La particularité d’une application de type serveur est de permettre à d’autres applications de se connecter à elle. D’un point de vue technique, cela passe par l’utilisation de sockets.
Un socket est une main tendue par votre application, une main qui attend d’être saisie pour pouvoir commencer une conversation. Le cas le plus courant est l’utilisation d’un socket utilisant le protocol TCP/IP. Cela signifie que la main sera tendue au travers d’une porte, les ports, que vous voyez partout lorsque vous configurez votre routeur ou votre pare-feu. Avec un tel type de socket, une application sur une machine distante pourra passer par internet pour serrer la main de votre application type serveur et commencer à dialoguer.
Néanmoins, un serveur ne passe pas nécessaire par un socket utilisant le protocol TCP/IP. Ainsi, il existe d’autres types de socket auquels on ne peut se connecter que depuis la machine qui execute le serveur, comme les socket de type UNIX.
Dans le monde des systèmes libres, nous possédons de nombreux exemples de ce type : le serveur graphique Xorg (qui permet de dessiner et manipuler les fenêtres), le serveur de son Jackd (qui permet d’accéder au système audio), le serveur DCOP pour KDE (qui permet aux applications KDE de discuter entre elles), etc.
Pour résumer, un serveur est simplement cela : une application qui permet à d’autres application de se connecter à elle.
Et pourtant, je loue un serveur dédié!
L’utilisation du terme serveur pour désigner la machine est donc un abus de langage. Sur une machine “serveur” tournent les même systèmes d’exploitation que sur une machine “locale”.
Cet abus de langage révèle pourtant une réalité concrète. Une machine “serveur” n’est pas une machine comme vous en avez chez vous. Ses composants ont été réduit au strict nécessaire, et les composants relatifs au réseau ont une qualité disproportionnée relativement à votre machine personnelle. Cette machine est sous tension en permanence et est en permanence connectée (si tout va bien) à un réseau permettant une bande passante en envoi sans comparaisons.
Pourtant, ce sont exactement les même composants : un processeur, un disque dur, de la ram, une carte réseau, etc. Ce qui fait la différence est que cette machine est optimisée pour un usage intensif de serveurs (au sens strict).
On retrouve la même chose au niveau du système d’exploitation. Ce qui fait la différence entre un Windows et un Windows Server, et entre une Ubuntu Desktop Edition et une Ubuntu Server Edition, c’est l’optimisation. Dans la version server de ces systèmes d’exploitation, tout a été pensé pour permettre un usage intensif de serveurs et un grand nombre de connexions.
Lorsqu’on compile un noyau Linux, on a ainsi le choix entre différentes politiques de planification de la priorité des processus, selon qu’on utilisera intensivement quelques processus qui devront avoir une grande priorité sur les autres (comme sur une machine optimisée bureau) ou qu’on aura un très grand nombre de processus qui devront être traités de manière égale (comme sur une machine optimisée serveur).
Rien ne vous empêche pourtant d’opter pour un tel type de configuration sur votre machine personnelle, et, d’un point de vue purement technique, une application est parfaitement incapable de savoir si elle se trouve sur un système optimisé serveur ou un système optimisé bureau.
Un petit bémol : bien entendu en informatique, rien n’est impossible. On pourra toujours trouver quelques bidouilles qui permettront de se faire une idée de quel type d’environnement nous utilisons. Cela n’a juste rien d’évident.





