2016-10-11 1 views
1

저는 PHP 나 다른 것들을 거치지 않고 nginx에서 직접 301 리디렉션을 제공하기 위해 루아를 사용하려고합니다.블록간에 데이터 공유?

내가 여기이 글에서 영감을 해요 :

http://www.agileweboperations.com/supporting-millions-of-pretty-url-rewrites-in-nginx-with-lua-and-redis

생각은 그때에 맞게 직접 성능을 향상시킬 nginx를 내 루아로 서비스를 제공, 레디 스에 직접 리디렉션의 목록을 저장할 수 있다는 것입니다 . 백엔드 프로젝트 심포니 때문에

, 내 필요에 맞게 약간의 코드를 조정할 수있는 방법을 찾아야 아래 내가 가진 무엇 : 여기

나는 보통 mysite.com/this 일치하도록 시도/그 요청. mysite.com/app_dev을 : 나는뿐만 아니라이 같은 URL을 처리 할 수있는, 아무것도 일치 내가 Nginx에의 try_files

location/{ 
    include /etc/nginx/include.d/lua_st_redis_rewrites.lua; 
    try_files $uri @rewriteapp; 
} 
location @rewriteapp { 
    rewrite ^(.*)$ /app.php/$1 last; 
} 

허락한다면 내가 dev에 환경을 지원하기 원하기 때문에 루아 스크립트가 먼저 리디렉션을 처리 할 수 ​​있습니다. php/this/that

이 URL은 위치/블록과 일치하지 않으므로 여기에 include lua를 다시 호출해야합니다. 문제는 실제로 mysite.com/this/that가 실제로 lua 스크립트를 두 번 호출한다는 것입니다.

제 아이디어는 첫 번째 호출에서 참/거짓 플래그를 초기화하고 두 번째 호출에서이 스크립트를 사용하여 스크립트가 이미 포함되어 있는지 확인하는 것입니다. 이 단계에서 나는 그러나 변수의 범위와 매우 혼란 스러워요 :

# pass the PHP scripts to FastCGI server from upstream phpfcgi 
location ~ ^/(app|app_dev)\.php(/|$) { 
    # # Setup var defaults 
    # set $no_cache ""; 

    include /etc/nginx/include.d/lua_st_redis_rewrites.lua; 

    # some more usual code for symfony here 
} 
  1. 나는 루아 코드 2 개 블록간에 데이터를 공유하는이 경우 전역 변수를 사용해야합니까? 나는 전역 변수의 사용을 강력히 권장하지 않습니까?
  2. lua 스크립트를 두 번 포함하면 스크립트에서 선언 된 변수가 호출 될 때마다 항상 다시 선언된다고 가정 할 수 있습니까?

고맙습니다. 전 완전히 새로운 것입니다. 분명한 질문을 용서해주십시오.

답변

0

필자가 아는 바로는 Lua 파일을 직접 포함 할 수 없다는 것입니다. Openresty를 사용한다고 가정하면 관련 * _by_lua 단계를 사용하여 요청을 처리해야합니다 (이 경우 rewrite_by_lua).

서로 다른 블록은 서로 다른 전역 변수에 액세스 할 수 없지만 요청 기간 동안 지속되는 ngx.ctx 테이블을 사용할 수 있습니다.

openresty 단계 here의 편리한 다이어그램이 있습니다.

+0

감사합니다. ngx.ctx를 살펴 보겠습니다. 필요한 것 같습니다. 이상하게도 include가 스크립트에 표시된대로 작동하지만 권장 방법이 더 나은 방법 일 수 있습니다. – mr1031011

+0

업데이트 : ngx.ctx는 특정 요청/하위 요청 내에서만 값을 보유하므로 작동하지 않습니다. 왜냐하면 데이터가 위의 두 위치 블록에서 공유되지 않는다는 것을 의미하기 때문입니다. 그래서 지금은 지방의 foo = require "foo"모듈을 사용하고 있습니다.하지만 문제는 nginx 작업자가 아직 살아있는 한 모든 모듈이 모든 요청에서 공유 된 데이터를 유지한다는 것입니다. – mr1031011