nginx + lua 를 이용 하여 일반적인 요청 입 출력 로그 인쇄 를 실현 합 니 다.

7766 단어
nginx + lua 를 이용 하여 일반적인 요청 입 출력 로그 인쇄 를 실현 합 니 다.
nginx + lua 는 웹 개발 에서 공격 방지 등 공공 전략 논 리 를 실현 하 는 데 점점 더 많이 사용 되 고 있 습 니 다. nginx 는 고성능 의 병행 처리 프레임 워 크 를 가지 고 있 습 니 다. lua 언어 개발 도 간단 합 니 다. 이번 에는 nginx 층 에서 lua 로 우리 가 요청 한 로그 의 인쇄 를 실현 하려 고 합 니 다.
개발 디 버 깅, 문제 조사 에서 로그 정 보 는 매우 중요 합 니 다. 특히 요청 한 입력 과 출력 정 보 는 nginx 자체 의 로그 정 의 는 출력 정보 와 POST 인 자 를 인쇄 할 수 없습니다. 저 희 는 백 엔 드 업무 코드 (예 를 들 어 PHP) 에서 이러한 notice 로 그 를 인쇄 하지만 nginx 에서 lua 로 실현 할 수 있 습 니 다.이 nginx 를 거 친 모든 요청 로 그 는 원 하 는 형식 으로 인쇄 되 어 간단 하고 통 일 됩 니 다.nginx 에서 lua 로 이 루어 진 로그 인쇄 스 크 립 트 를 소개 합 니 다.
nginx + lua 의 구체 적 인 개발 튜 토리 얼 은 여기 있 습 니 다.https://github.com/openresty/lua-nginx-module저 는 소개 하지 않 겠 습 니 다. 다음은 실현 코드 를 소개 하 겠 습 니 다.
nginx 각 처리 단계 의 코드 파일 을 만 들 려 면 먼저 access. lua 파일 을 만 듭 니 다. 코드 는 다음 과 같 습 니 다.
if ngx.var.log_val ~= nil then
    local request = "["..ngx.var.time_local.."] ".."\""..ngx.var.request_method.." "..ngx.var.scheme.."://"..
                     ngx.var.host..ngx.var.request_uri.."\""
    local post = ""
    local delimiter = ""
    local item = ""
    ngx.req.read_body()
    local args, err = ngx.req.get_post_args()
    if args then
        for key, val in pairs(args) do
           item = ""
           if type(val) == "string" then
               key =  string.gsub(key,"%c"," ")
               val = string.gsub(val,"%c"," ")
               item = key.."="..val
           elseif type(val) == "table" then
               item = key.."="
               local tstr = "";
               local tdelimiter = ""
               for k, v in pairs(val) do
                   if type(v) == "string" then
                      tstr = tstr..tdelimiter..v
                      tdelimiter = ','
                   end
               end
               item = item..tstr
           end
           post = post..delimiter..item
           delimiter = "&"
        end
    end

    ngx.var.log_val = request.."      ".."  postdata=["..post.."]   output=["
end

이 파일 은 주로 요청 한 시간, url 및 입력 매개 변수 등 정 보 를 기록 합 니 다. post 데 이 터 를 포함 합 니 다.
이어서 body 만 들 기filter. lua 파일 의 내용 은 다음 과 같 습 니 다.
if ngx.var.log_val ~= nil then
    local newcontent = string.gsub(ngx.arg[1],"%c"," ")
    ngx.var.log_val = ngx.var.log_val..newcontent
end

출력 정 보 를 기록 합 니 다. 개발 중 ngx. arg [1] 이 모든 문자열 과 연결 되 어 있 는 것 을 발견 하면 로그 인쇄 는 두 번 인쇄 됩 니 다. 내 장 된 log 를 제외 하고.val 변수 가 연결 되 어 있 습 니 다. 이 유 는 내부 점프 와 관련 이 있 을 수 있 기 때문에 여 기 는 두 줄 코드 입 니 다. 더 이상 다른 조작 이 없 을 것 입 니 다.
log. lua 파일 을 다시 만 듭 니 다. 내용 은 다음 과 같 습 니 다.
if ngx.var.log_val ~= nil then
    function mylog(msg)
        file = io.open ("/home/rong/nginx/logs/monitor.log","a+")
        file:write (msg)
        file:flush();
        file:close();
    end

    ngx.var.log_val = ngx.var.log_val.."]      httpstatus="..
                      ngx.var.status.." request_time="..ngx.var.request_time.."
"
mylog(ngx.var.log_val) end

연 결 된 로그 정 보 를 파일 에 기록 합 니 다.
각 단계 의 처리 파일 을 만 들 었 습 니 다. nginx 프로필 에 넣 으 면 다음 과 같 습 니 다.
 ......
 access_by_lua_file /home/rong/nginx/conf/access.lua;
 body_filter_by_lua_file /home/rong/nginx/conf/body_filter.lua;
 log_by_lua_file /home/rong/nginx/conf/log.lua;
 .....

nginx 설정 중 clientbody_buffer_size 와 clientmax_body_size 의 값 은 똑 같이 크 고 너무 작 으 면 안 됩 니 다.
마지막 으로 server 세그먼트 에서 모든 로그 정 보 를 저장 하 는 데 사용 할 변 수 를 정의 해 야 합 니 다.
server{
     ......
     set $log_val '';
     ......
}

이렇게 요청 이 있 을 때 / home / rong / nginx / logs / monitor. log 파일 에서 입 출력 정 보 를 똑똑히 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기