>운영 및 유지보수 >엔진스 >nginx가 ctx를 사용하여 데이터 공유를 달성하는 방법

nginx가 ctx를 사용하여 데이터 공유를 달성하는 방법

PHPz
PHPz앞으로
2023-05-14 17:25:181647검색

환경: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., Balancer_by_lua

이 Lua 테이블은 요청 기반 Lua 환경 데이터를 저장하는 데 사용할 수 있으며 수명은 현재 요청과 동일합니다(Nginx 변수와 유사).

아래 예를 참조하세요.

위치/테스트 {

rewrite_by_lua_block {

        ngx.ctx.foo = 76

}

access_by_lua_block {

  ngx.ctx.foo = ngx.ctx.foo + 3

}

content_by_lua_block {

        ngx.say(ngx.ctx.foo)

}

}

GET /test 출력에 액세스하세요

79

즉, ngx.ctx.foo 항목은 요청의 재작성, 액세스 및 콘텐츠 처리 단계에서 일관됩니다.

하위 요청을 포함한 각 요청에는 자체 ngx.ctx 테이블이 있습니다. 예:

위치/하위 {

content_by_lua_block {

        ngx.say("하위 사전: ", ngx.ctx.blah)

        ngx.ctx.blah = 32

        ngx.say("하위 게시물: ", ngx.ctx.blah)

}

}

위치/메인 {

content_by_lua_block {

        ngx.ctx.blah = 73

        ngx.say("기본 사전: ", ngx.ctx.blah)

로컬 해상도 = ngx.location.capture("/sub")

        ngx.print(res.body)

        ngx.say("메인 게시물: ", ngx.ctx.blah)

}

}

GET /main 출력에 액세스

메인 프리: 73

하위 사전: nil

서브 포스트: 32

메인 포스트: 73

여기서 하위 요청의 ngx.ctx.blah 항목을 수정해도 상위 요청의 동일한 이름을 가진 항목에는 영향을 미치지 않습니다. 왜냐하면 각 항목은 서로 다른 버전의 ngx.ctx.blah를 유지하기 때문입니다.

내부 리디렉션은 원래 요청의 ngx.ctx 데이터(있는 경우)를 삭제하고 새 요청에는 빈 ngx.ctx 테이블이 포함됩니다. 예를 들어

위치/신규 {

content_by_lua_block {

        ngx.say(ngx.ctx.foo)

}

}

위치/원본 {

content_by_lua_block {

        ngx.ctx.foo = "안녕하세요"

        ngx.exec("/new")

}

}

GET /orig에 액세스하면

이 출력됩니다. 전무

원래의 "hello" 값 대신.

Lua 클로저 및 중첩 테이블을 포함한 임의의 데이터 값을 이 "마법" 테이블에 삽입할 수 있으며, 이를 통해 사용자 정의 메타메소드도 등록할 수 있습니다.

ngx.ctx를 새로운 Lua 테이블로 덮어쓸 수도 있습니다. 예:

ngx.ctx = { foo = 32, bar = 54 }

init_worker_by_lua* 환경에서 사용될 때 이 테이블은 현재 Lua 핸들 수명과 동일합니다.

ngx.ctx 테이블 쿼리에는 상대적으로 비용이 많이 드는 메타 메서드 호출이 필요하며 이는 사용자 고유의 함수 매개 변수를 통해 직접 요청 기반 데이터를 전달하는 것보다 훨씬 느립니다. 따라서 성능에 상당한 영향을 미칠 수 있으므로 이 API를 단지 사용자 함수 매개변수를 저장하기 위해 남용하지 마십시오.

그리고 "magic" 메타메서드 때문에 lua 모듈 수준에서 "로컬" 수준 ngx.ctx를 사용하려고 시도하지 마세요(예: 작업자 수준 데이터 공유). 다음 예는 좋지 않습니다.

-- mymodule.lua

지역 _M = {}

-- 다음 줄의 ngx.ctx는 단일 요청에 속하지만 ctx 변수는 Lua 모듈 수준에 있습니다

-- 단일 작업자에게 속합니다.

로컬 ctx = ngx.ctx

함수 _M.main()

ctx.foo = "바"

반품 _M

대신 다음을 사용해야 합니다:

-- mymodule.lua

지역 _M = {}

함수 _M.main(ctx)

ctx.foo = "바"

반품 _M

즉, ctx 테이블에 대한 호출자의 호출은 함수 매개변수를 전달하여 완료되어야 합니다.

위 내용은 nginx가 ctx를 사용하여 데이터 공유를 달성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제