Applicazioni Node.js

Node.js, sviluppato e gestito accanto al tuo PHP.

Sviluppiamo in Node API, siti renderizzati lato server, servizi in tempo reale e worker, e li facciamo girare sugli stessi server dei tuoi siti PHP, dietro un unico Nginx.

Cosa sviluppiamo in Node

Cinque tipi di lavoro, ognuno qui perché Node gli si addice.

  1. 01

    Express

    API e back-end piccoli e diretti: poche route, middleware chiari, niente di nascosto.

    API e back-end
  2. 02

    NestJS

    Servizi più grandi con moduli, dependency injection e contratti tipizzati in TypeScript, per codice che un team farà crescere per anni.

    Servizi strutturati
  3. 03

    Next.js · Nuxt

    Rendering lato server per React e Vue: le pagine arrivano pronte per i motori di ricerca e per una prima visualizzazione rapida, poi si comportano come un'app.

    Siti renderizzati lato server
  4. 04

    Socket.IO · WebSockets

    Chat, notifiche, dashboard dal vivo e tracciamento che si aggiornano nell'istante in cui qualcosa cambia, su un'unica connessione aperta.

    Tempo reale
  5. 05

    Worker e code

    Job in background, attività pianificate e consumer di code su Redis che tengono il lavoro lento fuori dalla richiesta.

    Lavoro in background

Perché Node sa aspettare così bene

Un processo Node esegue il tuo JavaScript su un solo thread e affida l'attesa - disco, rete, database - al sistema. È così che un solo processo tiene aperte molte connessioni contemporaneamente.

L'event loop di Node.js, semplificato
  1. Il tuo codice gira sulla call stack, una funzione alla volta.
  2. Il lavoro lento lascia il thread: file, DNS e hashing vanno al pool di libuv, mentre i socket li sorveglia il sistema operativo.
  3. Quando il lavoro è finito, la sua callback attende nella coda dei task.
  4. Prima del task successivo vengono eseguite tutte le callback delle promise nella coda dei microtask.
  5. Il loop attraversa le sue fasi e prende il task successivo.

PHP e Node su un solo server

Nginx risponde a ogni richiesta e manda ogni percorso al processo che lo gestisce. Il tuo sito PHP e il tuo servizio Node condividono la macchina, il database e il certificato - non la memoria l'uno dell'altro.

Esempio di un server che li fa girare entrambi

Quale per quale lavoro

Sviluppiamo con entrambi, quindi la risposta viene dal lavoro, non da un'abitudine.

Scegli PHP quando

  • Il sito è fatto soprattutto di pagine, moduli e un pannello di amministrazione: negozi, siti di contenuti, gestionali.
  • Vuoi WordPress, WooCommerce o Laravel e tutto ciò che esiste già per loro.
  • Ogni richiesta è indipendente e finisce in fretta.
  • Le persone che lo manterranno conoscono già PHP.

Scegli Node quando

  • Le connessioni restano aperte: chat, dashboard dal vivo, notifiche, tracciamento.
  • Le pagine React o Vue vengono renderizzate sul server con Next.js o Nuxt.
  • Il servizio passa gran parte del tempo ad attendere altre API e a far scorrere flussi di dati.
  • Un solo linguaggio nel browser e sul server aiuta il tuo team.

Spesso la risposta è: entrambi

PHP tiene il sito, il negozio e il pannello; un piccolo servizio Node accanto si occupa della parte in tempo reale. Entrambi leggono lo stesso database e stanno dietro lo stesso Nginx.

Rilasci senza buchi

Una nuova versione parte accanto alla vecchia, dimostra di essere in salute e solo allora prende il traffico. I vecchi worker completano le richieste che hanno già prima di fermarsi.

  • Visitatori serviti
  • Versione attuale
  • Nuova versione
  1. 01

    Scarica e installa

    git pull && npm ci

    Le versioni esatte del lockfile, niente di più recente a sorpresa.

  2. 02

    Compila

    npm run build

    TypeScript e asset vengono compilati prima che qualcosa si riavvii.

  3. 03

    Avvia accanto alla vecchia

    pm2 reload app

    La nuova versione si avvia accanto a quella che sta ancora servendo.

  4. 04

    Attendi che sia pronta

    wait_ready: true

    Deve superare il suo health check prima di ricevere un visitatore.

  5. 05

    Prendi il traffico

    cluster → new workers

    Le nuove connessioni vanno alla nuova versione.

  6. 06

    Svuota la vecchia

    SIGINT → server.close()

    I vecchi worker completano le richieste in corso, poi si chiudono.

Se la nuova versione non supera il suo health check, non riceve mai traffico: la vecchia continua semplicemente a servire.

Il server attorno al codice

Ciò che tiene in piedi un servizio Node è scritto sul server, in file che manteniamo noi e che puoi leggere anche tu.

  • /etc/nginx/sites-enabled/app.conf

    Reverse proxy

    TLS, compressione, file statici in cache e upgrade a WebSocket, davanti a ogni processo.

  • /srv/app/ecosystem.config.js

    Gestore dei processi

    PM2 tiene vivo il processo, lo riavvia se va in crash e usa ogni core in modalità cluster. Dove basta un solo processo, una unit systemd fa lo stesso lavoro.

  • /srv/app/.env (0600)

    Ambiente e segreti

    Chiavi e password stanno fuori dal codice e fuori da git, leggibili solo dall'utente proprio dell'applicazione.

  • /srv/app/package-lock.json

    Audit delle dipendenze

    npm audit a ogni rilascio; gli aggiornamenti vengono letti e testati prima di arrivare in produzione.

  • /srv/app/.nvmrc

    Aggiornamenti tra versioni LTS di Node

    L'app gira su una versione a supporto a lungo termine, e la portiamo alla successiva prima che la vecchia esca dal supporto.

  • /var/log/app/

    Log e monitoraggio

    Log strutturati e ruotati, con un avviso quando il processo si riavvia, la memoria sale o gli errori aumentano.

Raccontaci cosa deve fare la tua app Node

Un nuovo servizio, un sito Next.js o un'app che gira già da qualche parte e ha bisogno di una casa come si deve. La esaminiamo e ti facciamo un preventivo dopo una breve conversazione.