nginx + lua 학습 노트 1 Nginx Lua API

7096 단어
일반적인 웹 서버 와 유사 합 니 다. 요청 을 받 고 처리 하 며 응답 을 출력 해 야 합 니 다.요청 에 대해 서 는 요청 인자, 요청 헤더, Body 체 등 정 보 를 가 져 와 야 합 니 다.처리 에 있어 서 는 해당 하 는 Lua 코드 를 호출 하면 됩 니 다.출력 응답 은 응답 상태 코드, 응답 헤드 와 응답 내용 체 의 출력 을 해 야 합 니 다.그래서 우 리 는 위 와 같은 몇 가지 점 에서 출발 하면 된다.
요청 접수
1. example. conf 프로필
location ~ /lua_request/(\d+)/(\d+) {  
    #  nginx    
    set $a $1;   
    set $b $host;  
    default_type "text/html";  
    #nginx      
    content_by_lua_file /usr/example/lua/test_request.lua;  
    #            
    echo_after_body "ngx.var.b $b";  
}  

2、test_request.lua
--nginx    
local var = ngx.var  
ngx.say("ngx.var.a : ", var.a, "
") ngx.say("ngx.var.b : ", var.b, "
") ngx.say("ngx.var[2] : ", var[2], "
") ngx.var.b = 2; ngx.say("
") -- local headers = ngx.req.get_headers() ngx.say("headers begin", "
") ngx.say("Host : ", headers["Host"], "
") ngx.say("user-agent : ", headers["user-agent"], "
") ngx.say("user-agent : ", headers.user_agent, "
") for k,v in pairs(headers) do if type(v) == "table" then ngx.say(k, " : ", table.concat(v, ","), "
") else ngx.say(k, " : ", v, "
") end end ngx.say("headers end", "
") ngx.say("
") --get uri ngx.say("uri args begin", "
") local uri_args = ngx.req.get_uri_args() for k, v in pairs(uri_args) do if type(v) == "table" then ngx.say(k, " : ", table.concat(v, ", "), "
") else ngx.say(k, ": ", v, "
") end end ngx.say("uri args end", "
") ngx.say("
") --post ngx.req.read_body() ngx.say("post args begin", "
") local post_args = ngx.req.get_post_args() for k, v in pairs(post_args) do if type(v) == "table" then ngx.say(k, " : ", table.concat(v, ", "), "
") else ngx.say(k, ": ", v, "
") end end ngx.say("post args end", "
") ngx.say("
") -- http ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "
") -- ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "
") -- ngx.say("ngx.req.raw_header : ", ngx.req.raw_header(), "
") -- body ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "
") ngx.say("
")

lua API 소개
ngx.var : nginx  ,      ngx.var.b = 2,         ;    nginx location               ngx.var[     ]  ;

ngx.req.get_headers:     ,      100,            

ngx.req.get_headers(0):               headers.user_agent    ;           ,     table;

ngx.req.get_uri_args:  url    ,    get_headers  ;

ngx.req.get_post_args:  post     ,    get_headers  ,        ngx.req.read_body()   body (      nginx      )lua_need_request_body on;    body ,       );

ngx.req.raw_header:          ;

ngx.req.get_body_data:      body      。


위 와 같은 방법 으로 일반적인 요 구 를 처리 하면 기본적으로 충분 하 다.또한 post 내용 체 를 읽 을 때 실제 상황 에 따라 client 를 설정 합 니 다.body_buffer_size 와 clientmax_body_크기 는 파일 이 아 닌 메모리 에 내용 을 저장 합 니 다.
다음 스 크 립 트 테스트 사용 하기
wget --post-data 'a=1&b=2' 'http://127.0.0.1/lua_request/1/2?a=3&b=4' -O -   


출력 응답
1.1, example. conf 프로필
location /lua_response_1 {  
    default_type "text/html";  
    content_by_lua_file /usr/example/lua/test_response_1.lua;  
}  

1.2、test_response_1.lua
--      
ngx.header.a = "1"  
--         table  
ngx.header.b = {"2", "3"}  
--      
ngx.say("a", "b", "
") ngx.print("c", "d", "
") --200 return ngx.exit(200)
  • ngx. header: 출력 응답 헤드;
  • ngx. print: 출력 응답 내용 체;
  • ngx. say: ngx. print 를 통 하지만 마지막 으로 줄 바 꿈 자 를 출력 합 니 다.
  • ngx. exit: 지정 한 상태 코드 를 종료 합 니 다.

  • 2.1, example. conf 프로필
    location /lua_response_2 {  
        default_type "text/html";
        content_by_lua_file /usr/example/lua/test_response_2.lua;
    }  
    

    2.2、test_response_2.lua
    ngx.redirect("http://jd.com", 302)  
    
  • ngx. redirect: 방향 을 바 꿉 니 다.

  • ngx. status = 상태 코드, 응답 하 는 상태 코드 설정;ngx.resp.get_headers () 설정 한 응답 상태 코드 가 져 오기;ngx.send_headers () 는 응답 상태 코드 를 보 내 고 ngx. say / ngx. print 를 호출 할 때 자동 으로 응답 상태 코드 를 보 냅 니 다.ngx. headers 를 통 해sent = true 응답 상태 코드 를 보 냈 는 지 판단 합 니 다.
    기타 API 1, example. conf 프로필
    location /lua_other {  
        default_type "text/html";  
        content_by_lua_file /usr/example/lua/test_other.lua;  
    }  
    

    2、test_other.lua
    --       uri  
    local request_uri = ngx.var.request_uri;  
    ngx.say("request_uri : ", request_uri, "
    "); -- ngx.say("decode request_uri : ", ngx.unescape_uri(request_uri), "
    "); --MD5 ngx.say("ngx.md5 : ", ngx.md5("123"), "
    ") --http time ngx.say("ngx.http_time : ", ngx.http_time(ngx.time()), "
    ")
  • ngx.escape_uri/ngx.unescape_uri: uri 인 코딩 디 코딩;
  • ngx.encode_args/ngx.decode_args: 매개 변수 인 코딩 디 코딩;
  • ngx.encode_base64/ngx.decode_base 64: BASE 64 인 코딩 디 코딩;
  • ngx. re. match: nginx 정규 표현 식 일치;

  • 더 많은 Nginx Lua API 참고http://wiki.nginx.org/HttpLuaModule#Nginx_API_for_Lua。
    Nginx 전역 메모리
    자바 와 같은 친 구 는 Ehcache 등 프로 세 스 내 로 컬 캐 시 를 알 수 있 습 니 다. Nginx 는 Master 프로 세 스 여러 Worker 프로 세 스 의 작업 방식 이기 때문에 여러 Worker 프로 세 스 에서 데 이 터 를 공유 해 야 할 수도 있 습 니 다. 이 때 [ngx.shared.DICT] 를 사용 하여 전체 메모리 공 유 를 실현 할 수 있 습 니 다.
    1. 먼저 nginx. conf 의 http 부분 에 메모리 크기 를 할당 합 니 다.
    #      ,   worker     
    lua_shared_dict shared_data 1m;  
    

    2. example. conf 프로필
    location /lua_shared_dict {  
        default_type "text/html";  
        content_by_lua_file /usr/example/lua/test_lua_shared_dict.lua;  
    }  
    

    3、 test_lua_shared_dict.lua
    --1、            
    local shared_data = ngx.shared.shared_data  
      
    --2、       
    local i = shared_data:get("i")  
    if not i then  
        i = 1  
        --3、      
        shared_data:set("i", i)  
        ngx.say("lazy set i ", i, "
    ") end -- i = shared_data:incr("i", 1) ngx.say("i=", i, "
    ")

    더 많은 API 참고http://wiki.nginx.org/HttpLuaModule#ngx.shared.DICT。
    이 기본 적 인 Nginx Lua API 를 배 웠 습 니 다. 요청 처리 와 출력 응답 은 위 에서 소개 한 API 와 충분히 사용 할 수 있 습 니 다. 더 많은 API 는 공식 문 서 를 참고 하 십시오.

    좋은 웹페이지 즐겨찾기