Nginx 제3자 모듈 시용 기

9045 단어
최근 에 몇 개의 @ agentzh 가 쓴 제3자 Nginx 모듈 을 사용 해 보 았 는데 매우 즐 거 웠 습 니 다. Nginx 에서 많은 기술 과 확장 을 할 수 있 을 줄 은 몰 랐 습 니 다. 공유 해 보 세 요.
본 논문 에서 시도 한 몇 가지 모듈 은 대략 다음 과 같다.
  • echo
  • memcached
  • nginx
  • lua

  • 상세 모듈 주 소 는 다음 과 같 습 니 다.
  • ngx_devel_kit https://github.com/simpl/ngx_devel_kit
  • set-misc-nginx-module https://github.com/agentzh/set-misc-nginx-module
  • memc-nginx-module https://github.com/agentzh/memc-nginx-module
  • echo-nginx-module https://github.com/agentzh/echo-nginx-module
  • lua-nginx-module https://github.com/chaoslawful/lua-nginx-module
  • srcache-nginx-module https://github.com/agentzh/srcache-nginx-module
  • drizzle-nginx-module https://github.com/chaoslawful/drizzle-nginx-module
  • rds-json-nginx-module https://github.com/agentzh/rds-json-nginx-module

  • 여 기 를 아 끼 기 위해 위의 모듈 을 모두 다운로드 하고 함께 컴 파일 합 니 다.PS: 더 게 으 르 면 openresty 프로젝트 를 시도 해 보 세 요. Nginx 와 확장 모듈 을 포장 해 드 립 니 다. @ agentzh 에 감 사 드 립 니 다.
    여기 서 drizzle 과 lua 모듈 을 컴 파일 합 니 다. Nginx 를 컴 파일 하기 전에 이 두 라 이브 러 리 의 LIB 와 INCLUDE 파일 주 소 를 설정 해 야 합 니 다.
    -- lua --
    export LUA_LIB=/path/to/lua/lib
    export LUA_INC=/path/to/lua/include
    
    -- drizzle --
    export LIBDRIZZLE_INC=/opt/drizzle/include/libdrizzle-1.0
    export LIBDRIZZLE_LIB=/opt/drizzle/lib

    Nginx 컴 파일 옵션 은 다음 과 같 습 니 다. 우선 순위 에 주의 하 십시오.
    ./configure --prefix=/opt/nginx \
        --with-pcre=../pcre \
        --add-module=../ngx_devel_kit \
        --add-module=../set-misc-nginx-module \
        --add-module=../memc-nginx-module \
        --add-module=../echo-nginx-module \
        --add-module=../lua-nginx-module \
        --add-module=../srcache-nginx-module \
        --add-module=../drizzle-nginx-module \
        --add-module=../rds-json-nginx-module

    Nginx 바 이 너 리 를 다시 컴 파일 합 니 다. Nginx 는 quit 를 다시 시작 해 야 합 니 다.일반 설정 업 데 이 트 는 reload 하면 됩 니 다.
    1. kill -HUP `cat /path/nginx/logs/nginx.pid`
    2. /path/nginx/sbin/nginx -s reload

    PS: 상세 한 모듈 컴 파일 은 각 모듈 의 문서 설명 을 참고 할 수 있 습 니 다.
    좋 습 니 다. 여기까지 Nginx 와 제3자 확장 이 설치 되 어 있다 고 가정 하 십시오.다음은 위 에 있 는 재 미 있 는 모듈 들 을 시도 해 보도 록 하 겠 습 니 다.
    장면 1: Helloworld
    프로그램 에서 hello World 는 매우 간단 합 니 다. nginx 의 hello 는 어떻게 실현 합 니까?
    1.     helloworld
    location /hello1 {
        echo "hello 1111!";
    }
    
    2.       echo  
    location /hello2 {
        echo "hello 2222!";
        echo_location_async /hello1;
    }
    
    3.   GET    ,      name,    name      
    location /hello3 {
        set_unescape_uri $name $arg_name;
        set_if_empty $name "None";
        echo "hello, $name!";
    }
    
            。 2  subrequest   non-blocking 。
    echo    timer  ,           case 。

    장면 2: Memcached HTTP 인터페이스
    그 당시 에 형 은 서로 다른 언어의 api 를 호 환 하기 위해 memcached 작업 을 스스로 봉 했 습 니 다. 정말 힘 들 었 습 니 다. 그 때 는 tokyotyrant 의 http 인터페이스 가 부 러 웠 는데 지금 은 memc 모듈 효과 와 마찬가지 로 upstream 과 keepalive 기능 도 있 습 니 다.
    location /memcached {
        set $memc_cmd $arg_cmd;
        set $memc_key $arg_key;
        set $memc_value $arg_val;
        set $memc_exptime $arg_exptime;
        memc_pass 127.0.0.1:11211;
    }
    
    URL     http://host:port/memcached?cmd=aaa&key=bbb&val=ccc
    
            ?     url   ,         memcached api,cluster    。

    필드 3: 데이터베이스 조회
    여 기 는 libdrizzle 모듈 을 사용 하여 MySQL, Drizzle, SQLite 데이터 베 이 스 를 호 환 합 니 다.가끔 은 조회 나 인 터 페 이 스 를 위해 언어 로 데이터베이스 조회 작업 을 밀봉 해 야 합 니 다. 지금 은 drizzle 모듈 을 통 해 쉽게 할 수 있 습 니 다 ~ ~
    #   MySQL  
    upstream mysql {
        drizzle_server 127.0.0.1:3306 dbname=test user=smallfish password=123 protocol=mysql;
    }
    
    #   url   name,       ,   json      。
    location ~ '^/mysql/(.*)' {
        set $name $1;
        set_quote_sql_str $quote_name $name;
        set $sql "SELECT * FROM users WHERE name=$quote_name";
        drizzle_query $sql;
        drizzle_pass mysql;
        rds_json on;
    }
    
    #   MySQL    ,      。
    location /mysql-status {
        drizzle_status;
    }

    필드 4: lua 확장
    lua 언어 가 내장 되 어 있 습 니 다. 슈퍼 파워 입 니 다 ~ ~ 하고 싶 은 대로 하 세 요. 그리고 lua coroutine 의 풍 요 를 충분히 발휘 할 수 있 습 니 다. 타 오 바 오 양자 통 계 는 완전히 lua 확장 입 니 다.
    location /lua1 {
        default_type 'text/plain';
        content_by_lua 'ngx.say("hello, lua")';
    }
    
    #      url
    location /lua2 {
        content_by_lua '
     local res = ngx.location.capture("/hello1")
     ngx.say("data: " .. res.body)
     ';
    }
    
    Lua       ,       WIKI  。

    응, 여기 서 몇 가지 모듈 을 해 봤 어. 상세 한 예 는 각자 의 모듈 문 서 를 참고 할 수 있어. 안에 상세 한 설명 과 옵션 설정 이 있어.
    이 를 통 해 알 수 있 듯 이 전통 적 인 프로 그래 밍 과 약간 다른 점 이 있 고 URL 을 바탕 으로 하 는 HTTP 인터페이스 로 전통 적 인 방식 보다 더욱 간단 하고 뚜렷 하 다.그리고 non - blocking 의 실현 은 더욱 가 볍 습 니 다.
    END

    좋은 웹페이지 즐겨찾기