OpenResty 관련 nginx 및 lua 함수

10708 단어 짜임새
nginx. conf 에서 lua 코드 를 실행 할 수 있 습 니 다.lua 모듈 은 class 를 파일 로 따로 저장 하 는 것 으로 볼 수 있 습 니 다.그래서 OpnenResty 를 공부 하려 면 두 가지 문법 을 배 워 야 한다. 하 나 는 Nginx 에 바 인 딩 변수 와 함 수 를 내장 하고 다른 하 나 는 Lua 문법 과 Lua 가 Nginx 를 대상 으로 하 는 라 이브 러 리 이다.그래서 다음은 이 두 가지 측면 에서 학습 과 정 리 를 한다.
Nginx 문법
Nginx 에 대한 소개 가 많 습 니 다. 이것 은 아주 좋 습 니 다. agentzh 의 Nginx 튜 토리 얼 이지 만 저 는 아직 다 보지 못 했 습 니 다.Nginx 내 장 된 바 인 딩 변 수 를 먼저 소개 합 니 다.
명칭.
설명 하 다.
$arg_name
요청 한 name 인자
$args
요청 중인 인자
$binary_remote_addr
원 격 주소 의 바 이 너 리 표시
$body_bytes_sent
보 낸 메시지 바이트 수
$content_length
HTTP 요청 메시지 의 "Content - Length"
$content_type
요청 메시지 의 "Content - Type"
$document_root
현재 요청 한 루트 경로 설정 값
$document_uri
$uri 와 같 음;예 를 들 면 / test 2 / test. php
$host
요청 정보 에 있 는 "Host" 는 요청 에 Host 줄 이 없 으 면 설 정 된 서버 이름 과 같 습 니 다.
$hostname
기계 이름 사용 gethostname 시스템 호출 값
$http_cookie
쿠키 정보
$http_referer
참조 주소
$http_user_agent
클 라 이언 트 에이전트 정보
$http_via
마지막 으로 서버 에 접근 할 IP 주소 입 니 다.
$http_x_forwarded_for
네트워크 접근 경로 에 해당 합 니 다.
$is_args
요청 줄 에 인자 가 있 으 면 "?" 를 되 돌려 주 십시오. 그렇지 않 으 면 빈 문자열 을 되 돌려 줍 니 다.
$limit_rate
연결 속도 제한
$nginx_version
현재 실행 중인 nginx 버 전 번호
$pid
worker 프로 세 스 의 PID
$query_string
$args 와 같 음
$realpath_root
루트 명령 이나 alias 명령 에 따라 현재 요청 한 절대 경로 입 니 다.심볼 체인
$remote_addr
클 라 이언 트 IP 주소
$remote_port
클 라 이언 트 포트 번호
$remote_user
클 라 이언 트 사용자 이름, 인증 용
$request
사용자 요청
$request_body
이 변수 (0.7.58 +) 는 요청 한 주요 정 보 를 포함 합 니 다.proxy 사용 중pass 또는 fastcgipass 명령 의 location 에서 의미 가 있 습 니 다.
$request_body_file
클 라 이언 트 가 주체 정 보 를 요청 하 는 임시 파일 이름
$request_completion
요청 이 성공 하면 "OK" 로 설정 합 니 다.요청 이 완료 되 지 않 았 거나 일련의 요청 중 마지막 부분 이 아니라면 비어 있 습 니 다.
$request_filename
현재 요청 한 파일 경로 이름, 예 를 들 어 / opt / nginx / www / test. php
$request_method
"GET", "POST" 등 요청 방법
$request_uri
요청 한 URI, 인자 포함
$scheme
사용 하 는 프로 토 콜, 예 를 들 어 http 또는 https
$server_addr
서버 주소, 서버 주 소 를 listen 으로 가리 키 지 않 으 면 이 변 수 를 사용 하면 주 소 를 얻 기 위해 시스템 호출 을 시작 합 니 다 (자원 낭비)
$server_name
요청 한 서버 이름
$server_port
요청 한 서버 포트 번호
$server_protocol
요청 한 프로 토 콜 버 전, "HTTP / 1.0" 또는 "HTTP / 1.1"
$uri
요청 한 URI 는 초기 값 과 다 를 수 있 습 니 다. 예 를 들 어 방향 을 바 꾸 는 것 과 같은 것 입 니 다.
내 장 된 바 인 딩 변 수 를 어떻게 사용 하 는 지 예 를 들 어 보 겠 습 니 다.
server {
    listen       8080;
    server_name  _;

    location /test {
        default_type "text/html";
        echo $host;
    }
}

방문 할 때
http://localhost:8080/test  #     "localhost"

다른 바 인 딩 변수의 사용 도 마찬가지 입 니 다.
Lua 코드
루 아 코드 를 어떻게 사용 하 는 지 소개 한다.두 가지 방법 이 있 습 니 다.첫 번 째, server 의 location 에 직접 삽입 합 니 다.
    content_by_lua_block{...}

예 를 들 면:
location /test{
    default_type "text/html";
    content_by_lua_block {
        local res = ngx.location.capture('/print_param',
        {
            method = ngx.HTTP_POST,
            args = {a = 1, b = '2&'},
            body = 'c=3&d=4%26'
        }
        )
        ngx.say(res.body)
    }
}

contentby_lua_block 아래 는 lua 문법 입 니 다.두 번 째 방식 은 파일 도입 이다.이런 방식 은 모듈 화 된 사상 에 더욱 부합 되 고 도입 방식 은
content_by_lua_block{}

다음으로 바꾸다
content_by_lua_file /usr/openresty/example/test.lua

그리고 test. lua 에 뭐 가 있 는 지 보 러 가요.
test.lua
-------
ngx.location.capture('/print_param',
        {
            method = ngx.HTTP_POST,
            args = {a = 1, b = '2&'},
            body = 'c=3&d=4%26'
        }
        )
        ngx.say(res.body)

첫 번 째 방식 의 lua 코드 부분 을 볼 수 있 습 니 다. 이것 은 파일 방식 의 인용 을 설명 합 니 다. 사실은 코드 를 삽입 하 는 형식 입 니 다.이것 은 루 아의 모듈 사상 과 같다.그대로 놓 을 수 있 고 파일 하 나 를 뜯 어 내 는 것 은 모듈 화 사상 이다.
저 는 Lua 의 문법 이 Lua 의 간단명료 한 강 좌 를 배 울 수 있다 고 생각 합 니 다. 여 기 는 Nginx 와 관련 된 문법 만 소개 해 야 합 니 다.ngx. say 와 ngx. print 는 모두 화면 에 내용 을 출력 합 니 다. 지식 ngx. say 는 내용 뒤에 리 턴 부 호 를 추가 합 니 다. print 와 println 의 차이 와 유사 합 니 다.nginx 의 set 명령, lua 에 대응 하 는 setby_lua, lua 코드 의 반환 값 을 받 을 수 있 습 니 다.
set %name "lisi";
set_by_lua_file $name /usr/openresty/example/lua/test1.lua

Nginx API 는 ngx 와 ndk 두 패키지 에 봉 인 됩 니 다.예 를 들 어 ngx. var. NGXVAR_NAME 는 Nginx 변수 에 접근 할 수 있 습 니 다.여기 서 ngx. location. capture 와 ngx. location. capture 를 소개 합 니 다.multi。
ngx. location. capture 문법: res = ngx. location. capture (uri, options?) 는 동기 화 되 고 막 히 지 않 는 Nginxsubrequest (하위 요청) 를 보 내 는 데 사 용 됩 니 다.
Nginx subrequest 를 통 해 다른 location 에 막 히 지 않 는 내부 요청 을 할 수 있 습 니 다.이 location 들 은 디 렉 터 리 를 읽 는 데 사용 할 수도 있 고 다른 C 모듈 일 수도 있 습 니 다. 예 를 들 어 ngxproxy, ngx_fastcgi, ngx_memc, ngx_postgres, ngx_drizzle 심지어 ngxlua 자신.Subrequest 는 아 날로 그 Http 인터페이스 일 뿐 추가 Http 나 Tcp 전송 비용 이 없습니다. C 차원 에서 실행 되 고 효율 적 입 니 다.Subrequest 는 Http 301 / 302 리 셋 및 내부 리 셋 (ngx. redirection 을 통 해) 과 다 릅 니 다.
#  :
location =/other {
    ehco 'Hello, world!';
}

# Lua   IO
location =/lua {
    content_by_lua '
        local res = ngx.location.capture("/other")
        if res.status == 200 then
            ngx.print(res.body)
        end
    ';
}

출력:
$ curl  'http://localhost/lua'
$ Hello, world!

실제로 location 은 외부 Http 에서 호출 을 요청 할 수도 있 고 내부 의 하위 요청 에 의 해 호출 될 수도 있 습 니 다.모든 location 은 하나의 함수 에 해당 하 며, 전송 자 요청 은 함수 호출 과 유사 합 니 다.또한 이러한 호출 은 비 막 힌 것 으로 강력 한 모델 을 만 들 었 습 니 다. 그 다음 에 우 리 는 location 과 백 엔 드 의 memcached, redis 를 통 해 비 막 힌 통신 을 하 는 방법 을 볼 수 있 습 니 다.ngx.location.capture_multi
문법: res1, res2,... = ngx. location. capturemulti ({uri, options?}, {uri, options?},...}) 는 ngx. location. capture 기능 과 마찬가지 로 여러 개의 키 요청 을 병행 할 수 있 습 니 다.이 방법 은 모든 하위 요청 처리 가 끝 난 후에 돌아온다.또한 전체 방법의 실행 시간 은 가장 긴 하위 요청 을 실행 하 는 데 달 려 있 으 며, 모든 하위 요청 의 실행 시간의 합 이 아 닙 니 다.
배치 하 다.
#            (subrequest)
location =/moon {
    ehco 'moon';
}
location =/earth {
    ehco 'earth';
}

location =/lua {
    content_by_lua '
        local res1,res2 = ngx.location.capture_multi({ {"/moon"}, {"earth"} })
        if res1.status == 200 then
            ngx.print(res1.body)
        end
        ngx.print(",")
        if res2.status == 200 then
            ngx.print(res2.body)
        end
    ';
}

출력
$ curl  'http://localhost/lua'
$ moon,earth

Lua 코드 에 있 는 네트워크 IO 작업 은 Nginx Lua API 를 통 해서 만 완료 할 수 있 습 니 다.표준 Lua API 를 통 해 Nginx 의 이벤트 순환 이 막 힌 다 고 가정 하면 성능 이 급 격 히 떨어진다.데이터 양 이 상당히 적은 디스크 IO 를 진행 할 때 표준 Lua io 라 이브 러 리 를 사용 할 수 있 지만 큰 파일 을 읽 을 때 는 안 됩 니 다. NginxWorker 프로 세 스 전 체 를 막 을 수 있 기 때 문 입 니 다.더 큰 성능 을 얻 기 위해모든 네트워크 IO 와 디스크 IO 를 Nginx 서브 에 맡 기 는 것 을 강력 히 권장 합 니 다 (ngx. location. capture 를 통 해).다음은 / html / index. html 파일 에 접근 합 니 다.Nginx 에 디스크 IO 를 맡 기 고 Lua io 를 통 해 직접 접근 하 는 효율 을 테스트 합 니 다.디스크 IO 를 ngx. location. capture 로 맡 기기:
배치 하 다.
location / {
    internal;
    root html;
}

location /capture {
    content_by_lua '
        res = ngx.location.capture("/")
        echo res.body
    ';
}

표준 lua io 를 통 해 디스크 파일 에 접근:
설정:
location /luaio{
    content_by_lua '
        local io = require("io")
        local chunk_SIZE = 4096
        local f = assert(io.open("html/index.html","r"))
        while true do
            local chunk = f:read(chunk)
            if not chunk then
                break
            end
            ngx.print(chunk)
            ngx.flush(true)
        end
        f:close()
    ';
}

그래서 Lua 에서 각종 IO 를 진행 할 때.ngx. location. capture 를 통 해 Nginx 이벤트 모델 에 하위 요청 을 보 내 면 IO 가 막 히 지 않 는 지 확인 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기