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
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.
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
readou unwritene 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.