openresty 학습 기록

6024 단어 nginx
에서https://legacy.gitbook.com/book/moonbingbing/openresty-best-practices 학습 기록 의 목적 은 조회 의 편 의 를 위해 서 이다.
openresty 학습 기록
openresty 와 nginx 의 차이
  • OpenResty 는 Nginx 와 Lua 를 바탕 으로 하 는 고성능 웹 플랫폼 으로 그 내부 에 대량의 우수한 Lua 라 이브 러 리, 제3자 모듈 과 대부분의 의존 항
  • 이 통합 되 었 다.
  • OpenResty 의 목 표 는 웹 서 비 스 를 Nginx 서비스 내부 로 직접 달 려 가 Nginx 의 비 차단 I / O 모델 을 충분히 이용 하 는 것 입 니 다. HTTP 클 라 이언 트 에 대한 요청 뿐만 아니 라 원 격 백 엔 드, 예 를 들 어 MySQL, PostgreSQL, Memcached 와 Redis 등 도 일치 하 는 고성능 응답 을 하 는 것 입 니 다.
  • openresty 는 진급 패 키 징 판 nginx
  • 로 이해 된다.
    run
    docker 로 미 러 실행docker run --name openresty -d -p 80:80 -v /Users/zhangyong/Documents/docker/openresty/openresty/conf:/usr/local/openresty/nginx/conf openresty/openresty:focal-nosse42
    동시 다발 요청 을 포함 하여 lua 작성 방법 을 테스트 합 니 다.
    server {
        listen 80;
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("HelloWorld")
                local res_add = ngx.location.capture(
                	"/add",{args={a=2, b=7}}
                )
                ngx.say(res_add.body)
    
    			local res1,res2 = ngx.location.capture_multi({
                	{"/add",{args={a=3, b=7}}},
                	{"/del",{args={a=3, b=7}}}
                })
                ngx.say(res1.body,"---",res2.body)
    
            }
        }
        location /add {
    		internal; #       
    		content_by_lua_block{
    			local args = ngx.req.get_uri_args()
    			ngx.say(tonumber(args.a) + tonumber(args.b))
    		}
        }
        location /del {
    		internal; #       
    		content_by_lua_block{
    			local args = ngx.req.get_uri_args()
    			ngx.say(tonumber(args.a) - tonumber(args.b))
    		}
        }
    }
    

    게임 방법
  • ngx.location.capture_multi 는 동시 실행 요청
  • ngx. exec 방법 은 ngx. redirect 와 완전히 다 릅 니 다. 전 자 는 순수한 내부 도약 이 고 추가 HTTP 신호
  • 를 도입 하지 않 았 습 니 다.
  • location 에 대해 정규 가 있다.안에서 $var 를 사용 할 수 있 습 니 다.1 달러, 1 달러, 1 달러, 2 달러 받 으 세 요.ngx.var.var_1. var 사용 하기1 은 변수 이름 입 니 다.
  • 	location = / {
    	    rewrite_by_lua_block {
    	        return ngx.redirect('/add'); #    
    	    }
    	}
    
  • ngx.req.get_uri_args、ngx.req.get_post_args 전 자 는 uri 요청 매개 변수 에서 왔 고 후 자 는 post 요청 내용 에서 왔 다.Nginx 는 부하 균형 장면 을 해결 하기 위해 탄생 했 기 때문에 기본적으로 body 를 읽 지 않 는 행위 입 니 다. post 매개 변 수 는 ngx.req.read_body() 를 추가 하거나 외부 에서 지정 lua_need_request_body on; 다음 과 같이 post 를 location 에 보 내 는 요청 이 필요 합 니 다.ngx. location. capture 는 비동기 입 니 다.
  • res = ngx.location.capture(
         '/foo/bar',
         { method = ngx.HTTP_POST, body = 'hello, world' }
     )
    

    응답 을 받 으 면 네 개의 요 소 를 포함 하 는 Lua 표 (res. status, res. header, res. body, res. truncated) 를 되 돌려 줍 니 다.res. truncated 는 절단, 불 값 표 시 를 통 해 res. body 가 절 단 된 데 이 터 를 포함 하 는 지 여 부 를 판단 합 니 다.이러한 데이터 가 절 단 된 이 유 는 하위 요청 이 복구 할 수 없 는 오류 가 발생 했 기 때 문 일 수 있 습 니 다. 예 를 들 어 원 격 응답 체 를 보 낼 때 너무 일찍 연결 을 중단 하거나 하위 요청 이 원 격 응답 체 를 받 을 때 시간 을 초과 한 것 입 니 다.
  • 큰 파일 세그먼트 에 되 돌아 갈 수 있 습 니 다
  • while true do
        data = file:read(1024)
        if nil == data then
            break
        end
        ngx.print(data)
        ngx.flush(true)
    end
    
  • 로그 출력 에 대해 일반적인 외곽 nginx 설정 error_log logs/error.log info; 은 info 를 error / 기타 로그 단계 ngx.log(ngx.ERR, "this is error log")
  • 로 지정 합 니 다.
  • 을 통 해 파라미터 검 사 를 할 수 있다.
  • location ~ ^/api/([-_a-zA-Z0-9/]+) {
        access_by_lua_file  lua/access_check.lua;
        content_by_lua_file lua/$1.lua;
    }
    
  • 아 날로 그 다운로드 요청 속도 제한 반환 결과
  • location /download {
            access_by_lua_block {
                ngx.var.limit_rate = 1000
            }
            content_by_lua_block{
    			ngx.say(1111)
    		}
        }
    
    access_by_lua_file 접근 을 통 해 반환 결 과 를 1. cab 에 저장 할 수 있 습 니 다.
  • 새로운 HTTP 요청 을 만 들 고 resty. http 모듈
  • 을 사용 합 니 다.
    local http = require "resty.http"   
    local httpc = http.new()
    local data = {}
    local res, err = httpc:request_uri(
        "http://127.0.0.1:81/hello",
            {
            method = "POST",
            body = data,
          }
    )
    
  • Redis 버퍼 에 있 는 select (1) 는 여러 요청 이 같은 Redis 연결 에 사 용 될 때 select 가 지정 한 라 이브 러 리 를 사용 할 수 있 음 을 주의 하 십시오.
  • 이상 처리, pcall 은 함수 와 후자 에 전달 할 인 자 를 받 고 실행 합 니 다. 실행 결과: 오류 가 있 고 오류 가 없습니다.반환 값 true 또는 false
  • local ok, t = pcall(test_method, str)
    if not ok then
      return nil
    end
    return t
    
  • openresty 의 집행 단계
  • set_by_lua*:              
    rewrite_by_lua*:   、   、     (           )
    access_by_lua*: IP   、           (     iptable        )
    content_by_lua*:     
    header_filter_by_lua*:         (        )
    body_filter_by_lua*:        (             )
    log_by_lua*:                (         ,          )
    
  • 열 로드: wget '127.0.0.1/download/1.cab' lua 를 고치 고 다시 시작 하지 않 아 도 됩 니 다
  • openresty 는 http 모듈 설정 lua_code_cache off 에 캐 시 를 사용 합 니 다. 이 cache 는 Nginx 모든 worker 간 에 공 유 된 것 입 니 다
  • location / {
        default_type text/html;
        content_by_lua_block {
            local cache_ngx = ngx.shared.my_cache
            cache_ngx:set('key', 111, 1000)
    		local value = cache_ngx:get('key')
    		ngx.say(value)
        }
    }
    
  • sleep ngx. sleep (1) 초
  • 타이머 에 대하 여: lua_shared_dict my_cache 128m;
  • 클 라 이언 트 에 게 결 과 를 되 돌려 주 고 후속 작업 을 할 수 있 습 니 다. ngx. eof () 전에 ngx. say 가 결 과 를 되 돌려 준 다음 에 로그 등 작업 을 해서 응답 시간 을 낮 출 수 있 습 니 다.하지만 막 힌 조작 은 안 됩 니 다.차단 은 워 커 를 점용 합 니 다
  • OpenResty 에서 ngx.timer.at(delay,function) 단계 에서 만 진정한 전역 변 수 를 정의 할 수 있 습 니 다.
  • 연결 을 연결 탱크 에 넣 을 때 이 연결 이 정상 적 인 것 임 을 보증 해 야 합 니 다. if not nil 그렇지 않 으 면 연결 탱크 가 더러 워 집 니 다.데이터 전송 이 끝나 야만 연못 에 넣 을 수 있 고 코드 는 맨 뒤에 쓸 수 있 습 니 다.red:set_keepalive(10000, 100)
  • resty 라 이브 러 리 를 사용 하면 해당 하 는 코드 를 해당 하 는 디 렉 터 리 에 추가 하면 됩 니 다.
  • keepalive_disable none; 사용자 에이전트 의 브 라 우 저 정보 에 따라 keepalive 여 부 를 결정 하지 않 습 니 다
  • 좋은 웹페이지 즐겨찾기