Nginx (si pronuncia Engine X), è un server web open source ad alte prestazioni disponibile per vari sistemi Unix e Unix-like e Windows. Sviluppato inizialmente da Igor Sysoev e rilasciato nel 2004 con licenza BSD, nginx è stato concepito con lo scopo esplicito di essere più performante del web server Apache. La sua architettura ad eventi, infatti, esibisce prestazioni consistenti in presenza di carichi elevati, con maggiore efficienza rispetto al modello multi-threaded adottato da Apache. Nginx fu sviluppato con l'obiettivo di risolvere il famoso problema C10k, ovvero creare un server in grado di gestire più di diecimila client contemporaneamente senza osservare una degradazione delle prestazioni.
È bene precisare, comunque, che nginx non è soltanto un server web. Esso infatti può agire da reverse proxy, da proxy TCP/UDP, da e-mail proxy e da load balancer. Queste caratteristiche ne hanno favorito una larga diffusione, impiegandolo soprattutto come reverse proxy o load balancer.
Storia
Sysoev iniziò lo sviluppo di nginx nel 2002, pensando a servizi con un alto numero di utenti come i motore di ricerca Yandex e Rambler, molto popolari in Russia, la rete sociale Vk ed il servizio Mail.ru.
Nel 2011 Sysoev ha fondato una compagnia privata, chiamata anch'essa nginx, che offre servizi di supporto a pagamento per nginx e segue lo sviluppo di una versione commerciale del prodotto, nginx Plus. Da allora nginx ha raccolto il favore del mercato, raccogliendo investimenti multimilionari in più occasioni.
Architettura
Il server è composto principalmente da due tipi di processi: Master e Worker. I processi Worker (tipicamente uno per ogni core o CPU presenti nel sistema) gestiscono le connessioni con i client e le relative richieste. Sono processi che non richiedono l'accesso a elementi privilegiati del sistema. Il processo master, come si intuisce dal nome, è responsabile del coordinamento dei worker. Esso esegue alcuni compiti privilegiati quali il binding delle porte, il caricamento dei file di configurazione, ecc.
I processi worker fanno uso di una sofisticata architettura event-driven (basata su kqueue in ambienti BSD e sull'omologa implementazione su Linux, epoll) per gestire in modo concorrente le richieste provenienti dai client in modo non bloccante. Questo approccio, in radicale contrapposizione con quello multi-threaded, favorisce un migliore sfruttamento delle risorse di calcolo a parità di numero di client connessi. Avere un unico processo non bloccante che gestisce più client permette infatti di evitare frequenti cambi di contesto (o context switch) inevitabili in un ambiente fortemente multiprogrammato.
Nginx dispone di un'architettura modulare, e ciò consente di estendere le funzionalità offerte dal server mediante lo sviluppo di moduli custom. Esistono moduli per il supporto alla compressione (gzip, Brotli ed altri), per l'elaborazione delle immagini servite, per lo streaming audio / video, ecc.
Diffusione
Secondo uno studio condotto nel 2016, nginx è il secondo web server più diffuso al mondo. Negli ultimi anni il tasso di adozione è rapidamente aumentato con l'avvento delle applicazioni progettate secondo il paradigma a microservizi. In questi scenari, nginx viene spesso adottato come entry point HTTP e load balancer. In tal senso, ricordiamo ad esempio l'utilizzo di nginx come Ingress Controller in un cluster Kubernetes.