The examples work since 0.4.0.
nginx.conf
:
events {} http { js_import http.js; server { listen 8000; location / { js_content http.hello; } } }
http.js
:
function hello(r) { r.return(200, "Hello world!"); } export default {hello};
nginx.conf
:
js_import http.js; js_set $decoded_foo http.decoded_foo;
http.js
:
function decoded_foo(r) { return decodeURIComponent(r.args.foo); } export default {decoded_foo};
nginx.conf
:
js_import http.js; js_set $encoded_foo http.encoded_foo; ... location / { proxy_pass http://example.com?foo=$encoded_foo; }
http.js
:
function encoded_foo(r) { return encodeURIComponent('foo & bar?'); } export default {encoded_foo};
nginx.conf
:
js_import http.js; location /redirect { js_content http.redirect; } location @named { return 200 named; }
http.js
:
function redirect(r) { r.internalRedirect('@named'); } export default {redirect};
nginx.conf
:
js_import http.js; location /start { js_content http.content; } location /foo { proxy_pass http://backend1; } location /bar { proxy_pass http://backend2; }
http.js
:
function content(r) { var n = 0; function done(res) { if (n++ == 0) { r.return(res.status, res.responseBody); } } r.subrequest('/foo', r.variables.args, done); r.subrequest('/bar', r.variables.args, done); } export default {content};
nginx.conf
:
js_import http.js; js_set $jwt http.jwt;
http.js
:
function generate_hs256_jwt(claims, key, valid) { var header = { typ: "JWT", alg: "HS256" }; var claims = Object.assign(claims, {exp: Math.floor(Date.now()/1000) + valid}); var s = [header, claims].map(JSON.stringify) .map(v=>v.toUTF8()) .map(v=>v.toString('base64url')) .join('.'); var h = require('crypto').createHmac('sha256', key); return s + '.' + h.update(s).digest().toString('base64url'); } function jwt(r) { var claims = { iss: "nginx", sub: "alice", foo: 123, bar: "qq", zyx: false }; return generate_hs256_jwt(claims, 'foo', 600); } export default {jwt};
nginx.conf
:
js_import http.js; keyval_zone zone=foo:10m; ... location /keyval { js_content http.set_keyval; } location /version { js_content http.version; } location /api { api write=on; }
http.js
:
function set_keyval(r) { r.subrequest('/api/5/http/keyvals/foo', { method: 'POST', body: JSON.stringify({ foo: 789, bar: "ss dd 00" })}, function(res) { if (res.status >= 300) { r.return(res.status, res.responseBody); return; } r.return(500); }); } function version(r) { r.subrequest('/api/5/nginx', { method: 'GET' }, function(res) { if (res.status != 200) { r.return(res.status); return; } var json = JSON.parse(res.responseBody); r.return(200, json.version); }); } export default {set_keyval, version};
nginx.conf
:
js_import http.js; js_set $new_foo http.create_secure_link; ... location / { secure_link $cookie_foo; secure_link_md5 "$uri mykey"; ... } location @login { add_header Set-Cookie "foo=$new_foo; Max-Age=60"; return 302 /; }
http.js
:
function create_secure_link(r) { return require('crypto').createHash('md5') .update(r.uri).update(" mykey") .digest('base64url'); } export default {create_secure_link};
nginx.conf
:
js_import http.js; js_set $num_requests http.num_requests; keyval_zone zone=foo:10m; keyval $remote_addr $foo zone=foo; log_format bar '$remote_addr [$time_local] $num_requests'; access_log logs/access.log bar; server { listen 8000; location / { root html; } }
http.js
:
function num_requests(r) { var n = r.variables.foo; n = n ? Number(n) + 1 : 1; r.variables.foo = n; return n; } export default {num_requests};
The keyval and keyval_zone directives are available as part of our commercial subscription.
nginx.conf
:
js_import http.js; location /start { js_content http.content; } location /auth { proxy_pass http://auth_backend; } location /backend { proxy_pass http://backend; }
http.js
:
function content(r) { r.subrequest('/auth') .then(reply => JSON.parse(reply.responseBody)) .then(response => { if (!response['token']) { throw new Error("token is not available"); } return reply['token']; }) .then(token => { r.subrequest('/backend', `token=${token}`) .then(reply => r.return(reply.status, reply.responseBody)); }) .catch(_ => r.return(500)); } export default {content};
© 2002-2020 Igor Sysoev
© 2011-2020 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/njs/examples.html