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 파일 에서 입 출력 정 보 를 똑똑히 볼 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.