elouann.dev
EN — English version

ProjetsSystèmes, réseau & algorithmes

Webserv

Un serveur HTTP façon Nginx

Période
nov. 2025 – janv. 2026
Cadre
cursus 42
Équipe
en groupe
Note
125/100
  • C++
  • Bas-niveau
  • Réseau
  • Programmation orientée objet

Voir le code

Un serveur HTTP en C++, inspiré de Nginx jusque dans son fichier de configuration. Un seul processus, une seule boucle d’événements, et aucune opération qui bloque.

descripteursécoute :8080LISTENclientCLIENTclientCLIENTpipes CGICGI_IN / CGI_OUTepoll_waitune seule boucleaccept()nouveau clientlire, parserHttpRequestlocationconfig NginxfichiercacheCGIfork + pipesenvoyerEPOLLOUTles pipes du CGI rejoignent epoll : un script lent ne bloque rien
SchémaTous les descripteurs (écoute, clients, pipes des CGI) passent par epoll. Chaque événement est aiguillé selon le contexte attaché au descripteur.

La boucle d’événements

Pas de thread par connexion : le serveur enregistre tous ses descripteurs auprès d’epoll, en mode non bloquant, puis attend dans epoll_wait. À chaque descripteur est attaché un petit contexte (son rôle : écoute, client, entrée ou sortie de CGI) qui dit immédiatement quoi faire quand il est prêt.

Une requête peut arriver en plusieurs morceaux, et une réponse partir en plusieurs envois : tout est mis en tampon, et le serveur passe d’EPOLLIN à EPOLLOUT selon qu’il attend une requête ou qu’il a quelque chose à envoyer. Les connexions keep-alive sont réutilisées.

Configuration et CGI

Le fichier de configuration, au format Nginx, passe par son propre lexer et son propre parser, qui construisent un arbre de blocs server et location : ports, racines, index, méthodes autorisées, pages d’erreur.

Pour les scripts (PHP, Python), le serveur lance un CGI : un processus enfant relié par deux pipes, eux aussi surveillés par epoll, pour ne jamais attendre un script lent. Un cache de fichiers et des pages d’erreur personnalisables complètent le tout.

Ce que j’en retiens

  • Un read ou un write ne transfère jamais forcément tout d’un coup.
  • Le modèle événementiel : un seul thread peut servir beaucoup de clients.
  • HTTP est un protocole texte simple en apparence, mais plein de cas limites.