Cosocket e TCP non bloccante
Utilizzi ngx.socket.tcp per connessioni asincrone al backend in content_by_lua.
Cosocket e TCP non bloccante è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Cosa sono i cosocket?
I cosocket di OpenResty sono socket TCP/UDP non bloccanti che si integrano con l'event loop di Nginx. Quando attendono dati, cedono il controllo della coroutine, lasciando libero il worker di gestire altre richieste.
Creazione di un cosocket TCP
Utilizzi ngx.socket.tcp() per creare un cosocket. Le operazioni di connessione, invio e ricezione cedono automaticamente il controllo quando l'I/O potrebbe bloccarsi.
-- content_by_lua_block
local sock = ngx.socket.tcp()
local ok, err = sock:connect("redis.local", 6379)
if not ok then
ngx.log(ngx.ERR, "Connect failed: ", err)
return ngx.exit(500)
endInvio dei dati
sock:send(data) invia una stringa. Restituisce i byte inviati oppure nil + una stringa di errore.
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endRicezione dei dati
sock:receive(pattern) legge i dati. Pattern: "*l" legge una riga, "*a" legge tutto fino alla chiusura, un numero legge esattamente N byte.
local data, err = sock:receive("*l")
if not data then
ngx.log(ngx.ERR, "Receive error: ", err)
return ngx.exit(500)
end
ngx.say("Response: " .. data)Impostazione dei timeout
Imposti i timeout di connessione, invio e ricezione per evitare blocchi indefiniti.
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)Pool di connessioni
sock:setkeepalive(timeout, pool_size) reinserisce il socket in un pool per riutilizzarlo. È fondamentale per le prestazioni di Redis/MySQL.
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100Esecuzione di una richiesta HTTP
Implementi una semplice richiesta GET HTTP/1.0 utilizzando un cosocket.
local function httpGet(host, path)
local sock = ngx.socket.tcp()
sock:connect(host, 80)
sock:send("GET " .. path .. " HTTP/1.0\r\nHost: " .. host .. "\r\n\r\n")
local resp = sock:receive("*a")
sock:close()
return resp
endCosocket UDP
ngx.socket.udp() crea un cosocket UDP. È utile per l'invio di metriche a statsd.
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")Schema di gestione degli errori
Tutti i metodi dei cosocket seguono la convenzione di Lua: nil + stringa di errore in caso di fallimento. Controlli sempre entrambi i valori restituiti.
Limitazioni dei cosocket
I cosocket non possono essere utilizzati in: init_by_lua, set_by_lua, header_filter_by_lua. Li utilizzi solo nelle fasi content, access e rewrite.
Confronto delle prestazioni
I cosocket raggiungono lo stesso throughput del codice C che utilizza direttamente epoll, perché usano direttamente il sistema I/O di Nginx. Non comportano alcun overhead aggiuntivo di thread o processi.
Domanda sui cosocket
Che cosa accade quando un cosocket attende dati da un server lento?
Riepilogo: cosocket e TCP non bloccante
I cosocket di OpenResty forniscono TCP/UDP non bloccante e cedono il controllo durante l'I/O, consentendo un'elevata concorrenza. Utilizzi setkeepalive per il pooling delle connessioni. Imposti i timeout per evitare blocchi indefiniti. Sono disponibili solo nelle fasi content/access/rewrite.
Domande Frequenti
La lezione «Cosocket e TCP non bloccante» è gratuita?
Sì — il testo completo di «Cosocket e TCP non bloccante» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Cosocket e TCP non bloccante»?
Utilizzi ngx.socket.tcp per connessioni asincrone al backend in content_by_lua. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Cosocket e TCP non bloccante»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Architettura di OpenResty
- Gestione delle richieste HTTP in Lua
- Cosocket e TCP non bloccante
- Dizionari in memoria condivisa