How to Manage Third-Party Packages of OpenResty Through LuaRocks and OPM?
API7.ai
September 17, 2022
이전 글에서 OpenResty의 몇 가지 공식 프로젝트에 대해 간략히 살펴보았습니다. 그러나 OpenResty를 프로덕션 환경에서 사용할 때, OpenResty 패키지에 포함된 라이브러리만으로는 부족합니다. 예를 들어, HTTP 요청을 보내는 lua-resty
라이브러리가 없고, Kafka와 상호작용할 방법도 없습니다.
그렇다면 어떻게 해야 할까요?
OpenResty는 NGINX의 포크도 아니고, NGINX에 몇 가지 표준 라이브러리를 추가한 재패키징도 아닙니다. 대신 NGINX를 기본 네트워크 라이브러리로 사용합니다.
NGINX를 사용할 때, 사용자 정의 HTTP 요청을 어떻게 시작할지, Kafka와 어떻게 상호작용할지 고민하지 않습니다. OpenResty 세계에서는 cosocket
덕분에 개발자들이 lua-resty-http
와 lua-resty-kafka
를 빠르게 작성하여 이러한 요구를 처리할 수 있습니다. 이는 Python, PHP 등의 개발 언어에서 할 수 있는 것과 유사합니다.
또 한 가지 조언: 위와 같은 문제를 해결하기 위해 Lua 세계의 라이브러리를 사용해서는 안 되며, 대신 cosocket의 lua-resty-*
라이브러리를 사용해야 합니다. Lua 세계의 라이브러리는 블로킹을 유발할 가능성이 높아, 고성능 서비스를 몇 단계 떨어뜨릴 수 있습니다. 이는 OpenResty 초보자들이 자주 저지르는 실수이며, 쉽게 눈에 띄지 않습니다.
그렇다면 이러한 비차단(non-blocking) lua-resty-*
라이브러리를 어떻게 찾을 수 있을까요? 다음으로 이러한 방법들을 소개하겠습니다.
OPM
OPM (OpenResty Package Manager)은 OpenResty와 함께 제공되는 패키지 관리자로, OpenResty를 설치한 후 사용할 수 있습니다. opm search http
명령을 사용하여 HTTP 요청을 보내는 라이브러리를 찾아볼 수 있습니다.
첫 번째 쿼리는 몇 초 정도 걸릴 수 있습니다. opm.openresty.org는 PostgreSQL 데이터베이스에서 쿼리를 수행하고 결과를 잠시 캐시합니다.
openresty/lua-resty-upload Streaming reader and parser for HTTP file uploading based on ngx_lua cosocket
이 결과를 보면 의아할 수 있습니다: 이 lua-resty-upload
패키지가 HTTP 요청을 보내는 것과 무슨 상관이 있을까요?
OPM은 검색할 때 패키지 이름과 패키지 프로필을 모두 검색하며, 후자의 키워드를 사용합니다. 이 때문에 위의 검색이 몇 초 걸립니다. PostgreSQL 내부의 문자열을 전체 텍스트 검색하기 때문입니다.
하지만 어쨌든 이 반환 결과는 친절하지 않습니다. 키워드를 수정하여 다시 검색해 보겠습니다.
$ opm search lua-resty-http
ledgetech/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua
pintsized/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua
agentzh/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua
OpenResty 세계에서 cosocket
을 사용하여 패키지를 구현한다면 반드시 lua-resty
접두사를 사용해야 합니다. 이는 불문율입니다.
검색 결과를 다시 보면, OPM은 기여자의 GitHub 저장소 주소를 패키지 이름으로 사용합니다. 즉, GitHub ID / 저장소 이름입니다. 세 개의 lua-resty-http
서드파티 라이브러리가 반환되었습니다. 어떤 것을 선택해야 할까요?
패키지를 선택하기 전에, 별점 수와 마지막 업데이트 시간을 확인해 보겠습니다: 별점은 10개 정도이고, 마지막 업데이트는 2016년입니다. 이는 버려진 프로젝트입니다. 더 깊이 살펴보면, pintsized/lua-resty-http
와 ledgetech/lua-resty-http
는 동일한 저장소를 가리킵니다. 따라서 어떤 것을 선택하든 상관없습니다.
또한, OPM 웹사이트는 비교적 단순하며, 패키지 다운로드 수나 이 패키지의 의존성을 제공하지 않습니다. 이는 유지보수자의 역할이어야 하지만, 사용자가 더 많은 시간을 들여 어떤 lua-resty
라이브러리를 사용해야 하는지 파악해야 합니다.
LuaRocks
LuaRocks는 OpenResty 세계의 또 다른 패키지 관리자로, OPM보다 먼저 탄생했습니다. OPM과 달리 LuaRocks는 OpenResty 관련 패키지뿐만 아니라 Lua 세계의 라이브러리도 포함합니다. 예를 들어, LuaRocks의 LuaSQL-MySQL은 Lua 세계에서 MySQL에 연결하는 패키지로, OpenResty에서는 사용할 수 없습니다.
여전히 HTTP
라이브러리를 예로 들어, LuaRocks를 사용하여 찾아보겠습니다.
$ luarocks search http
보시다시피, 많은 패키지가 반환됩니다.
키워드를 다시 변경해 보겠습니다.
$ luarocks search lua-resty-http
이번에는 하나의 패키지만 반환되었습니다. LuaRocks 웹사이트로 이동하여 이 패키지의 세부 정보를 확인할 수 있습니다. 다음은 웹사이트 페이지의 스크린샷입니다.
위 스크린샷에는 작성자, 라이선스, GitHub URL, 다운로드 수, 기능 요약, 버전 기록, 의존성 등이 포함되어 있습니다. OPM과 달리 LuaRocks는 GitHub 사용자 정보를 직접 사용하지 않으며, 개발자가 LuaRocks에 별도로 등록해야 합니다.
오픈소스 API 게이트웨이 프로젝트인 Apache APISIX는 LuaRocks를 사용하여 패키지를 관리합니다. APISIX의 패키지 관리 구성이 어떻게 작성되었는지 간단히 살펴보겠습니다.
APISIX의 최신 버전은 2.15이며, Apache APISIX 프로젝트 아래에서 apisix-2.15.0-0.rockspec
파일을 찾을 수 있습니다.
package = "apisix"
version = "2.15.0-0"
supported_platforms = {"linux", "macosx"}
source = {
url = "git://github.com/apache/apisix",
branch = "2.15.0",
}
description = {
summary = "Apache APISIX는 클라우드 네이티브 마이크로서비스 API 게이트웨이로, 모든 API와 마이크로서비스를 위한 궁극의 성능, 보안, 오픈 소스 및 확장 가능한 플랫폼을 제공합니다.",
homepage = "https://github.com/apache/apisix",
license = "Apache License 2.0",
}
dependencies = {
"lua-resty-ctxdump = 0.1-0",
"lua-resty-dns-client = 6.0.2",
"lua-resty-template = 2.0",
"lua-resty-etcd = 1.8.2",
"api7-lua-resty-http = 0.2.0",
"lua-resty-balancer = 0.04",
"lua-resty-ngxvar = 0.5.2",
"lua-resty-jit-uuid = 0.0.7",
"lua-resty-healthcheck-api7 = 2.2.0",
"api7-lua-resty-jwt = 0.2.4",
"lua-resty-hmac-ffi = 0.05",
"lua-resty-cookie = 0.1.0",
"lua-resty-session = 3.10",
"opentracing-openresty = 0.1",
"lua-resty-radixtree = 2.8.2",
"lua-protobuf = 0.3.4",
"lua-resty-openidc = 1.7.5",
"luafilesystem = 1.7.0-2",
"api7-lua-tinyyaml = 0.4.2",
"nginx-lua-prometheus = 0.20220527",
"jsonschema = 0.9.8",
"lua-resty-ipmatcher = 0.6.1",
"lua-resty-kafka = 0.20-0",
"lua-resty-logger-socket = 2.0.1-0",
"skywalking-nginx-lua = 0.6.0",
"base64 = 1.5-2",
"binaryheap = 0.4",
"api7-dkjson = 0.1.1",
"resty-redis-cluster = 1.02-4",
"lua-resty-expr = 1.3.1",
"graphql = 0.0.2",
"argparse = 0.7.1-1",
"luasocket = 3.0rc1-2",
"luasec = 0.9-1",
"lua-resty-consul = 0.3-2",
"penlight = 1.9.2-1",
"ext-plugin-proto = 0.5.0",
"casbin = 1.41.1",
"api7-snowflake = 2.0-1",
"inspect == 3.1.1",
"lualdap = 1.2.6-1",
"lua-resty-rocketmq = 0.3.0-0",
"opentelemetry-lua = 0.1-3",
"net-url = 0.9-1",
"xml2lua = 1.5-2",
"nanoid = 0.1-1",
"lua-resty-mediador = 0.1.2-1"
}
build = {
type = "make",
build_variables = {
CFLAGS="$(CFLAGS)",
LIBFLAG="$(LIBFLAG)",
LUA_LIBDIR="$(LUA_LIBDIR)",
LUA_BINDIR="$(LUA_BINDIR)",
LUA_INCDIR="$(LUA_INCDIR)",
LUA="$(LUA)",
OPENSSL_INCDIR="$(OPENSSL_INCDIR)",
OPENSSL_LIBDIR="$(OPENSSL_LIBDIR)",
},
install_variables = {
ENV_INST_PREFIX="$(PREFIX)",
ENV_INST_BINDIR="$(BINDIR)",
ENV_INST_LIBDIR="$(LIBDIR)",
ENV_INST_LUADIR="$(LUADIR)",
ENV_INST_CONFDIR="$(CONFDIR)",
},
}
파일에서 볼 수 있듯이, 의존성은 lua-resty-*
라이브러리와 순수 Lua 세계의 라이브러리가 혼합되어 있으며, OPM을 사용하여 부분적으로만 설치할 수 있습니다. 구성을 작성한 후, LuaRocks
의 업로드 명령을 사용하여 이 구성을 업로드하면 사용자가 LuaRocks
를 사용하여 APISIX를 다운로드하고 설치할 수 있습니다.
LuaRocks
는 이를 지원합니다. .rockspec
파일에서 C 소스 코드의 경로와 이름을 지정할 수 있으며, LuaRocks는 이를 로컬에서 컴파일합니다. OPM은 아직 이 기능을 지원하지 않습니다.
awesome-resty
awesome-resty 프로젝트는 OpenResty에서 사용할 수 있는 거의 모든 패키지를 유지 관리하며, 카테고리별로 정리되어 있습니다. 적합한 서드파티 패키지가 있는지 확신이 서지 않을 때 가장 좋은 곳입니다.
HTTP 라이브러리를 예로 들어보겠습니다. awesome-resty
에서 이는 자연스럽게 네트워킹 카테고리에 속합니다.
lua-resty-http by @pintsized — Lua HTTP client cosocket driver for OpenResty / ngx_lua
lua-resty-http by @liseen — Lua http client driver for the ngx_lua based on the cosocket API
lua-resty-http by @DorianGray — Lua HTTP client driver for ngx_lua based on the cosocket API
lua-resty-http-simple — Simple Lua HTTP client driver for ngx_lua
lua-resty-httpipe — Lua HTTP client cosocket driver for OpenResty / ngx_lua
lua-resty-httpclient — Nonblocking Lua HTTP Client library for aLiLua & ngx_lua
lua-httpcli-resty — Lua HTTP client module for OpenResty
lua-resty-requests — Yet Another HTTP Library for OpenResty
lua-resty-http
에 대한 8개의 서드파티 라이브러리가 있습니다. 이전 결과와 비교해 보면, OPM을 사용하여 2개를 찾았고, LuaRocks에서는 1개만 찾았습니다. 그러나 선택하기 어렵다면 첫 번째 것을 사용하면 됩니다. 이는 LuaRocks의 것과 동일합니다.
실험을 좋아하는 엔지니어라면 마지막 라이브러리인 lua-resty-requests를 추천합니다. 이는 Python의 유명한 Requests와 동일한 인터페이스 스타일을 가진 더 사용자 친화적인 HTTP 접근 라이브러리입니다. 저처럼 Python을 좋아한다면 lua-resty-requests
를 좋아할 것입니다. 이는 OpenResty 커뮤니티에서 활발히 활동하는 tokers
가 작성한 것이므로 안심하고 사용할 수 있습니다.
요약
오픈소스 프로젝트가 번성하려면 하드코어 기술, 좋은 문서화, 완벽한 테스트뿐만 아니라 더 많은 개발자와 회사를 하나로 모으는 생태계가 필요합니다. Apache Way가 말했듯이: 코드보다 커뮤니티가 중요합니다.
OpenResty에 대한 체계적인 학습 자료는 없으며, 공식 코드 가이드도 없습니다. 많은 최적화 포인트가 오픈소스 프로젝트에 작성되어 있지만, 대부분의 개발자들은 그들이 무엇을 말하는지는 알지만 왜 그런지는 모릅니다. 이 Ebook의 목적이 바로 여기에 있습니다. 이를 학습한 후, 더 효율적인 OpenResty 코드를 작성하고, OpenResty 관련 오픈소스 프로젝트에 더 효율적으로 참여할 수 있기를 바랍니다. 예를 들어, Apache APISIX와 같은 프로젝트에 참여할 수 있습니다.
OpenResty 생태계에 대해 어떻게 생각하시나요? 자유롭게 댓글을 남기고 이야기해 보세요. 또한, 이 글을 공유해 주시기 바랍니다.