2016-08-02 6 views
0

Ich brauche https://github.com/openresty/lua-nginx-moduleWie zu Nginx fastcgi_pass innerhalb ngx_http_lua_module übergeben?

ich eine Nginx Variable auf meine PHP 7.0-Backend mit der ausgezeichneten Bibliothek passieren bevorzugen content_by_lua_block statt set_by_lua_block, zu verwenden, da die Dokumentation für die ‚Set‘ Funktion heißt es: „Diese Richtlinie kurz auszuführen ausgelegt ist schnell laufende Codebausteine, da die Nginx-Ereignisschleife während der Codeausführung blockiert wird. Zeitaufwendige Codefolgen sollten daher vermieden werden. " https://github.com/openresty/lua-nginx-module#set_by_lua

Da jedoch die ‚content _...‘ Funktion ist nicht blockierend, der folgende Code nicht rechtzeitig zurückkehren, und $ Hallo ungesetzt ist, wenn an PHP übergeben:

location ~ \.php{ 
    set $hello ''; 

    content_by_lua_block { 
     ngx.var.hello = "hello there."; 
    } 

    fastcgi_param HELLO $hello; 
    include fastcgi_params; 
    ... 
    fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
} 

Das Problem ist, hat mein Lua-Code das Potenzial, "zeitaufwendige Codefolgen" zu sein, wenn bestimmte Codepfade verwendet werden, zum Beispiel mit Crypto.

Die folgende Nginx Lage funktioniert ganz gut, aber das ist, weil set_by_lua_block() ein blockierende Funktionsaufruf:

location ~ \.php { 
    set $hello ''; 

    set_by_lua_block $hello { 
     return "hello there."; 
    } 

    fastcgi_param HELLO $hello; 
    include fastcgi_params; 
    ... 
    fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
} 

Meine Frage ist, was ist der beste hier Ansatz? Gibt es eine Möglichkeit, die Nginx-Direktive fastcgi_pass und zugehörige Direktiven nur innerhalb eines content_by_lua_block() aufzurufen, nachdem meine Variablen gesetzt wurden?

Antwort

1

Ja, das ist möglich mit ngx.location.capture. Schreiben Sie einen separaten Ort Block Beispiel:

location /lua-subrequest-fastcgi { 
     internal; # this location block can only be seen by Nginx subrequests 

     # Need to transform the %2F back into '/'. Do this with set_unescape_uri() 
     # Nginx appends '$arg_' to arguments passed to another location block. 
     set_unescape_uri $r_uri $arg_r_uri; 
     set_unescape_uri $r_hello $arg_hello; 

     fastcgi_param HELLO $r_hello; 

     try_files $r_uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param SCRIPT_NAME $fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
    } 

die Sie dann thusly anrufen:

location ~ \.php { 
     set $hello ''; 

     content_by_lua_block { 
      ngx.var.hello = "hello, friend." 

      -- Send the URI from here (index.php) through the args list to the subrequest location. 
      -- Pass it from here because the URI in that location will change to "/lua-subrequest-fastcgi" 
      local res = ngx.location.capture ("/lua-subrequest-fastcgi", {args = {hello = ngx.var.hello, r_uri = ngx.var.uri}}) 

      if res.status == ngx.HTTP_OK then 
       ngx.say(res.body) 
      else 
       ngx.say(res.status) 
      end 
     } 
    } 
+0

Das neue 'default_type' in der Nginx conf ändert sich von' application/octet-Stream' zu 'Text/html, weil wir ngx.say() verwenden, um den von PHP zurückgegebenen HTML-Code anzuzeigen. – AaronDanielson