nginx+lua access_by_lua_질문

3564 단어 nginx
1. 배경 설명 은 프로젝트 에서 nginx 를 바탕 으로 간단 한 게 이 트 웨 이 를 구축 하고 같은 도 메 인 이름 이 서로 다른 쿠키 에이전트 에 따라 서로 다른 docker 기능 을 실현 하 며 전단, 모 바 일 다 중 업무 라인 병행 테스트 연결 원 가 를 낮 출 계획 입 니 다.쉽게 말 하면 서버 에 여러 개의 테스트 환경 docker 가 서로 다른 업무 수요 코드 를 배치 하고 전단, 모 바 일 에서 쿠키 (서버 테스트 환경 docker IP 주소 저장) 방식 으로 서버 테스트 환경 을 선택 할 수 있 는 능력 을 가지 게 하여 환경 설정 원 가 를 크게 낮 춘 다.구체 적 인 쿠키 의 해석 논 리 는 nginx 에서 lua 를 사용 하여 이 루어 집 니 다.
2. 문제 설명 은 해당 nginx + lua 자료 에 따라 설정 한 후에 모든 것 이 순 조 롭 고 정상 적 인 방문 이 가능 합 니 다.그러나 전단, 모 바 일 개발 자 에 게 연락 을 할 때 간접 적 으로 404 요청 상황 이 빈번히 발생 한다. 같은 인터페이스 요청 파라미터 가 같 고 요청 시간 대가 다 르 면 404 보고 상황 이 간접 적 으로 발생 한다. 404 가 발생 할 때 nginx 에서 오 류 를 보고 하 는 정 보 는 다음 과 같다.
2020/01/02 17:16:51 [error] 506478#0: *2183 open() "/export/Instances/Logs/runtime/api/timer/info" failed (2: No such file or directory), client: xx.xx.xx.xx, server: www.timer.com, request: "GET" .......

오류 정 보 를 보면 404 오류 가 발생 했 을 때 요청 은 nginx 에서 정적 파일 의 역방향 대 리 를 직접 찾 는 것 입 니 다.lua 스 크 립 트 에 실행 로그 정 보 를 인쇄 했 습 니 다. 404 오류 가 발생 했 을 때 lua 스 크 립 트 가 정상적으로 실행 되 었 습 니 다.이 문제 가 간접 적 으로 발생 하여 문제 조사 의 난이 도 를 크게 증가 시 켰 다.
3. 해결 방안 은 먼저 해결 방안 을 말 하고 nginx 에서 lua 스 크 립 트 가 져 오기 방식 을 수정 합 니 다. 상세 한 것 은 다음 과 같 습 니 다. 오류 방식 (404) 이 나타 납 니 다.
location / {
	 default_type 'application/json';  
	 charset utf-8;  
	 lua_code_cache on;  
	 access_by_lua_file /export/Instances/timer/runtime/lua/timer.lua;
}

올 바른 방식:
location / {
	 default_type 'application/json';  
	 charset utf-8;  
	 lua_code_cache on;  
	 content_by_lua_file /export/Instances/timer/runtime/lua/timer.lua;
}

access_by_lua: 접근 요청 단계 에서 처리 하고 접근 제어 에 사용 하 며 http, server, location, location ifcontent 에 적 용 됩 니 다.by_lua: 콘 텐 츠 프로세서 입 니 다. 요청 을 받 고 출력 응답 을 받 습 니 다. location, location if 주 에 적 용 됩 니 다. 제 솔 루 션 은 accessby_lua 와 content_by_lua 자료 가 상대 적 으로 적 고 가장 근본 적 인 원인 에 대해 저 는 아직 4. 조사 와 정리 노트 1. 초기 에 고려 한 것 은 배치 때 문 이라는 것 을 알 지 못 했 습 니 다. lua_code_cache on, lua 스 크 립 트 가 캐 시 되 어 생 긴 것 입 니 다. 문제 의 근본 원인 이 아 닙 니 다.lua_code_cache: 명령 에 있 는 Lua 코드 의 Lua 코드 캐 시 를 사용 하거나 사용 하지 않 습 니 다.닫 을 때, ngxlua 가 제공 하 는 모든 요청 은 하나의 Lua VM 인 스 턴 스 에서 실 행 됩 니 다. 인 용 된 Lua 파일 은 캐 시 되 지 않 고 사용 하 는 Lua 모듈 은 처음부터 불 러 옵 니 다.오픈 시 lua 스 크 립 트 가 캐 시 됩 니 다. reload nginx 가 있어 야 업 데 이 트 된 lua 스 크 립 트 가 적 용 됩 니 다.
2. lua 스 크 립 트 오류 로 인 한 것 을 고려 하여 lua 스 크 립 트 북 에 많은 로 그 를 인쇄 했 습 니 다. 마지막 으로 404 오류 가 발생 했 을 때 lua 스 크 립 트 는 정상적으로 실 행 될 수 있 습 니 다. 출력 로그 정보 기록 상용 명령:
---  header
local reqHeaders = ngx.req.get_headers();
----    
local reqType= ngx.var.request_method;
---  cookie
local reqCookie = reqHeaders["cookie"];
local pcIp = ngx.var.cookie_pcip;
local appIp = ngx.var.cookie_appip;
--  URL
local requestUri = ngx.var.request_uri;
--      
local requestHost = ngx.var.host;

5. 미 완성 계속 access 찾기by_lua  화해시키다 content_by_lua 설정 에 관 한 자료 이상 의 문제 에서 lua 반환 코드 는 다음 과 같 습 니 다.
local timerHttp = require "resty.http"
---Post   
local function http_post(url,headerParm,body,timeout)
    local httpc = timerHttp.new();
    timeout = timeout or 30000;
    httpc:set_timeout(timeout);
    local res, err_ = httpc:request_uri(url, {
        method = "POST",
        body = body,
        keepalive=false,
        headers = headerParm;
    })
    httpc:set_keepalive(5000, 100)
    return res,err_;
end

local reqResult,reqErr = http_post(nowUrl,reqHeaders,reqBody,30000);
if(reqResult.status==200) then
	ngx.say(reqResult.body);
	return ;
else
	ngx.say(reqErr);
	return ;
end

좋은 웹페이지 즐겨찾기