Cosockety i nieblokujący TCP
Proszę używać ngx.socket.tcp do asynchronicznych połączeń z backendem w content_by_lua.
Cosockety i nieblokujący TCP to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Czym są cosockety?
Cosockety OpenResty to nieblokujące gniazda TCP/UDP, które integrują się z pętlą zdarzeń Nginx. Podczas oczekiwania na dane zawieszają korutynę, zwalniając proces roboczy do obsługi innych żądań.
Tworzenie cosocketu TCP
Do utworzenia cosocketu należy użyć ngx.socket.tcp(). Operacje łączenia, wysyłania i odbierania automatycznie zawieszają korutynę, gdy operacja wejścia-wyjścia mogłaby zablokować wykonanie.
-- 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)
endWysyłanie danych
sock:send(data) wysyła ciąg znaków. Zwraca liczbę wysłanych bajtów albo nil + komunikat błędu.
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endOdbieranie danych
sock:receive(pattern) odczytuje dane. Wzorce: "*l" odczytuje wiersz, "*a" odczytuje wszystko aż do zamknięcia połączenia, a liczba oznacza odczyt dokładnie N bajtów.
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)Ustawianie limitów czasu
Należy ustawić limity czasu dla łączenia, wysyłania i odbierania, aby zapobiec zawieszaniu.
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)Pula połączeń
sock:setkeepalive(timeout, pool_size) odkłada gniazdo z powrotem do puli w celu ponownego użycia. Ma to kluczowe znaczenie dla wydajności Redis/MySQL.
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100Wysyłanie żądania HTTP
Należy zaimplementować proste żądanie GET HTTP/1.0 za pomocą cosocketu.
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() tworzy cosocket UDP. Jest przydatny do raportowania metryk do statsd.
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")Schemat obsługi błędów
Wszystkie metody cosocketów stosują konwencję Lua: w przypadku niepowodzenia zwracają nil + ciąg znaków z komunikatem błędu. Należy zawsze sprawdzać obie wartości zwracane.
Ograniczenia cosocketów
Cosocketów nie można używać w: init_by_lua, set_by_lua, header_filter_by_lua. Należy używać ich wyłącznie w fazach content, access i rewrite.
Porównanie wydajności
Cosockety osiągają taką samą przepustowość jak nieabstrakcyjny kod C oparty na epoll, ponieważ bezpośrednio korzystają z mechanizmów wejścia-wyjścia Nginx. Nie występuje dodatkowy narzut związany z wątkami ani procesami.
Pytanie dotyczące cosocketów
Co się dzieje, gdy cosocket oczekuje na dane od wolnego serwera?
Podsumowanie: cosockety i nieblokujący TCP
Cosockety OpenResty zapewniają nieblokującą obsługę TCP/UDP i zawieszają korutynę podczas operacji wejścia-wyjścia, umożliwiając wysoką współbieżność. Do tworzenia puli połączeń należy używać setkeepalive. Należy ustawić limity czasu, aby uniknąć zawieszania. Cosockety są dostępne wyłącznie w fazach content/access/rewrite.
Często zadawane pytania
Czy lekcja „Cosockety i nieblokujący TCP” jest bezpłatna?
Tak — pełny tekst „Cosockety i nieblokujący TCP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Cosockety i nieblokujący TCP”?
Proszę używać ngx.socket.tcp do asynchronicznych połączeń z backendem w content_by_lua. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Cosockety i nieblokujący TCP”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Architektura OpenResty
- Obsługa żądań HTTP w Lua
- Cosockety i nieblokujący TCP
- Słowniki pamięci współdzielonej