Headless Chrome en producció: desafiaments que has de conèixer

Descobreix els problemes reals d'executar Chrome sense cap en producció: fuites de memòria, processos zombis, arrencades en fred i més. Aprèn l'arquitectura

viernes, 24 de julio de 2026 • 6 min de lectura • Equip Q2BSTUDIO

Claves para gestionar Chrome headless en producción

Implementar Headless Chrome en producció pot semblar una tasca trivial al principi: només cal llançar un navegador sense interfície, carregar una URL i capturar una imatge o un PDF. No obstant això, l'experiència real de mantenir aquest sistema a escala revela una sèrie de desafiaments que van molt més enllà de les quinze línies de codi inicials. A Q2BSTUDIO, on desenvolupem aplicacions a mida per a entorns exigents, hem après que la gestió del cicle de vida de Chrome és un problema sistèmic, no un simple ajust d'API. A continuació, explorem els obstacles més comuns i com superar-los amb una arquitectura robusta.

Gestió de memòria: el primer murUn sol procés de Chrome headless consumeix entre 150 i 300 MB de RSS, i tendeix a augmentar amb el temps a causa de fuites de memòria inherents al navegador. Chrome va ser dissenyat per tancar-se al final del dia, no per romandre actiu durant setmanes. En un contenidor amb límit de memòria fix, el resultat és inevitable: el kernel mata el procés amb un SIGKILL a les 2 de la matinada, i els logs no mostren pila de crides. La solució no és una línia de codi màgica, sinó gestionar el cicle de vida: limitar el nombre de renderitzats per instància i reciclar-la completament. Per exemple, tancar el navegador i llançar-ne un de nou cada N pàgines perquè les fuites es recuperin amb la mort del procés, no amb esperances. A més, dimensionar la concurrència en funció de la RAM disponible, no de la CPU: si cada renderitzat ocupa 250 MB, vuit concurrents són 2 GB abans de comptar el sistema operatiu.

Processos zombis: els que no morenChrome no és un sol procés, sinó un arbre: procés principal, zigot, renderitzadors, GPU i ajudants. Quan el node pare mor de forma anormal, els fills queden orfes i es reassignen a init, consumint memòria i descriptors de fitxer. Acumular milers d'aquests processos esgota els PIDs o els FD, paralitzant el sistema. La solució pragmàtica és rastrejar el PID del navegador i, davant d'una sortida anòmala, matar tot el grup de processos en lloc de confiar en browser.close(). En contenidors, és recomanable utilitzar un init real (com tini o dumb-init) perquè la recollida d'orfes sigui automàtica.

Arrencada en fred: l'impost de 800 msLlançar Chrome des de zero costa uns 800 mil·lisegons abans de renderitzar un sol píxel. Si es llança un navegador nou per cada petició, aquest impost es paga cada vegada, i per a tasques simples pot duplicar el temps de resposta. La temptació és mantenir una única instància viva per sempre, però això ens torna al problema de memòria. La clau està a reutilitzar la instància però aïllar cada renderitzat mitjançant contextos del navegador (browser contexts). Un context és una sessió neta, sense cookies ni memòria cau, que es crea i destrueix ràpidament. Així es paga l'inici en fred una vegada per instància, cada petició té el seu propi context de llançament, i la instància es recicla després de N renderitzats. A núvols com AWS o Azure, aquesta estratègia permet escalar sense malgastar recursos.

Pàgines que es resisteixen: timeouts dursUna URL maliciosa o mal construïda pot provocar una redirecció infinita, una pàgina que mai llança l'esdeveniment load o un WebSocket que manté la xarxa ocupada per sempre. Sense un límit temporal estricte, un sol renderitzat pot bloquejar un navegador fins que algú el mati manualment. La regla d'or és establir timeouts tant en la navegació com en la captura, i si se superen, matar la instància completa i llançar-ne una de nova. Intentar reanimar un navegador que ja ha penjat és arriscat: porta un estat indeterminat. Aquesta política sembla malgastadora, però és la que més fiabilitat aporta al sistema.

Concurrència: cua, no bucleL'enfocament ingenu és renderitzar en línia: quan arriba una petició, es pren o es crea un navegador, es renderitza i es respon. Sota càrrega, això és una recepta per al desastre: un pic de trànsit es converteix en N navegadors simultanis, que porten a un OOM i a la caiguda de totes les peticions en curs. La solució és interposar una cua entre la petició i el renderitzat. L'API accepta el treball i retorna immediatament; un pool de treballadors consumeix els jobs a un ritme que la seva RAM pot suportar. Un pic de trànsit es tradueix en profunditat de cua, una mètrica que es pot monitoritzar i escalar, en lloc d'un gràfic de memòria que s'enfonsa. La profunditat de cua és el senyal d'alerta primerenca de capacitat.

Fonts: l'enllaç perdutEn un portàtil les fonts estan instal·lades; en un contenidor Linux mínim no. El resultat són rectangles buits o símbols tofu on hauria d'haver-hi text CJK o emojis. Perquè un renderitzat sigui fidel cal incorporar un pipeline de fonts: un conjunt base, cobertura CJK, una font d'emojis i saber que una actualització de Chrome pot canviar el renderitzat dels glifs silenciosament. A més, si s'emmagatzemen en memòria cau les imatges generades, convé versionar-les per poder invalidar-les quan el motor de renderitzat canviï.

Serverless no és una dreceraLa temptació de delegar-ho tot a Lambda o funcions serverless mou els problemes, no els elimina. Cal empaquetar una versió reduïda de Chromium per complir els límits de mida, es pateix un arrencada en fred de diversos segons a cada escalat, i es topa amb els límits de memòria i temps d'execució. A més, les fonts i la seguretat continuen sent responsabilitat pròpia. Serverless pot ser un destí legítim, però amb arestes diferents, no més suaus.

SSRF: el perill ocultQuan el renderitzador accepta URLs de tercers, el risc de Server-Side Request Forgery apareix de seguida. Un usuari malintencionat pot enviar https://169.254.169.254/latest/meta-data/ i el navegador, obedient, llegirà les credencials del núvol i les retornarà en una imatge. La solució no és un simple if, sinó un mòdul complet que resolgui DNS pel seu compte, verifiqui cada IP contra rangs privats i de loopback, fixi la IP validada i la revalidi a cada redirecció. A Q2BSTUDIO integrem aquestes mesures de ciberseguretat a totes les nostres solucions que manegen dades sensibles.

Quan fer-ho un mateixSi només es renderitzen unes quantes pàgines pròpies i sota demanda, l'autogestió és perfectament viable. El problema apareix quan el volum creix, els pics són impredictibles o les URLs provenen d'usuaris. En aquell punt, mantenir un sistema fiable requereix la mateixa infraestructura que oferim des dels nostres serveis d'IA i automatització: cues, pools de workers, reciclatge d'instàncies, timeouts i una capa de seguretat sòlida. Combinat amb eines de BI i Power BI per monitoritzar el rendiment, es pot construir un servei que no només funcioni, sinó que escali sense sorpreses.

La lliçó final és que Headless Chrome en producció no és un problema de quinze línies; és un problema de sistema. Amb l'arquitectura adequada, els agents IA poden fins i tot orquestrar el cicle de vida dels workers de forma autònoma. Però això ja és una altra història.

UNA PAUSA?

Juga una estona abans de marxar

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.