0Pricing
Lua Academy · 강의

Cosocket과 논블로킹 TCP

content_by_lua에서 ngx.socket.tcp를 사용해 비동기 백엔드 연결을 만듭니다.

Cosocket과 논블로킹 TCP은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

코소켓이란 무엇인가요

OpenResty 코소켓은 Nginx의 이벤트 루프와 통합되는 비차단 TCP/UDP 소켓입니다. 데이터 수신을 기다릴 때 코루틴을 양보하므로 워커는 다른 요청을 처리할 수 있습니다.

TCP 코소켓 생성

ngx.socket.tcp()를 사용하여 코소켓을 생성합니다. 입출력이 차단될 수 있는 경우 연결, 전송, 수신이 모두 자동으로 양보됩니다.

-- 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)
end

데이터 전송

sock:send(data)는 문자열을 전송합니다. 전송된 바이트 수 또는 nil과 오류를 반환합니다.

local bytes, err = sock:send("PING\r\n")
if not bytes then
  ngx.log(ngx.ERR, "Send error: ", err)
end

데이터 수신

sock:receive(pattern)은 데이터를 읽습니다. 패턴은 다음과 같습니다. "*l"은 한 줄을 읽고, "*a"는 연결이 닫힐 때까지 모두 읽으며, 숫자는 정확히 N바이트를 읽습니다.

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)

제한 시간 설정

연결, 전송 및 수신 제한 시간을 설정하여 무한 대기를 방지합니다.

sock:settimeout(1000)  -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000)  -- connect, send, receive (ms)

연결 풀

sock:setkeepalive(timeout, pool_size)는 소켓을 재사용할 수 있도록 풀에 되돌려 놓습니다. Redis/MySQL 성능에 매우 중요합니다.

sock:setkeepalive(60000, 100)  -- 60s timeout, pool size 100

HTTP 요청 만들기

코소켓을 사용하여 간단한 HTTP/1.0 GET 요청을 구현합니다.

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
end

UDP 코소켓

ngx.socket.udp()는 UDP 코소켓을 생성합니다. statsd 메트릭 보고에 유용합니다.

local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")

오류 처리 패턴

모든 코소켓 메서드는 Lua 규칙을 따릅니다. 실패하면 nil과 오류 문자열을 반환합니다. 항상 두 반환 값을 모두 확인해야 합니다.

코소켓의 제한 사항

코소켓은 init_by_lua, set_by_lua, header_filter_by_lua에서 사용할 수 없습니다. 콘텐츠, 액세스 및 재작성 단계에서만 사용합니다.

성능 비교

코소켓은 Nginx의 입출력 기능을 직접 사용하므로 원시 epoll 기반 C 코드와 동일한 처리량을 달성합니다. 추가 스레드나 프로세스 오버헤드가 없습니다.

코소켓 관련 질문

코소켓이 느린 서버의 데이터를 기다리면 어떻게 되나요?

요약: 코소켓과 비차단 TCP

OpenResty 코소켓은 입출력 시 양보하는 비차단 TCP/UDP를 제공하여 높은 동시성을 가능하게 합니다. 연결 풀링에는 setkeepalive를 사용합니다. 무한 대기를 방지하려면 제한 시간을 설정합니다. 콘텐츠/액세스/재작성 단계에서만 사용할 수 있습니다.

자주 묻는 질문

“Cosocket과 논블로킹 TCP” 강의는 무료인가요?

네 — “Cosocket과 논블로킹 TCP” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Cosocket과 논블로킹 TCP”에서 뭘 배우나요?

content_by_lua에서 ngx.socket.tcp를 사용해 비동기 백엔드 연결을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“Cosocket과 논블로킹 TCP” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. OpenResty 아키텍처
  2. Lua에서 HTTP 요청 처리하기
  3. Cosocket과 논블로킹 TCP
  4. 공유 메모리 사전
← Lua Academy(으)로 돌아가기