forked from openresty/nginx-eval-module
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
142 lines (110 loc) · 4.09 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
Status
This module is experimental and production use is discouraged.
If you want similar (but more powerful) functionalities, see
the ngx_lua module instead:
http://github.com/chaoslawful/lua-nginx-module
Synopsis
# an example for working with the ngx_drizzle + ngx_rds_json
# modules, but you must put ngx_rds_json *after*
# ngx_eval during nginx configure, for example:
# ./configure --add-module=/path/to/nginx-eval-module \
# --add-module=/path/to/rds-json-nginx-module \
# --add-module=/path/to/drizzle-nginx-module
location = /mysql {
eval_subrequest_in_memory off;
eval_override_content_type text/plain;
eval_buffer_size 4k; # default 4k, truncated if overflown
eval $res {
drizzle_query "select * from cats";
drizzle_pass my_mysql_backend;
rds_json_on;
}
# now $res holds the JSON formatted result set
if ($res ~ '"Tom"') {
echo "Found the Tom cat!";
break;
}
echo "The Tom cat is missing!";
}
# an example for working with the ngx_postgres module
location = /login {
eval_subrequest_in_memory off;
eval_override_content_type text/plain;
eval_buffer_size 1k;
eval $uid {
postgres_query "select id
from users
where name=$arg_name and pass=$arg_pass";
postgres_pass pg_backend;
postgres_output value 0 0;
}
if ($uid !~ '^\d+$') {
rewrite ^ /relogin redirect; break;
}
# your content handler settings...
}
Description
This fork of ngx_eval can work with any content handlers and
even with filters enabled as long as you put ngx_eval *before*
your filter modules during nginx configure, for instance
./configure --prefix=/opt/nginx \
--add-module=/path/to/this/nginx-eval-module \
--add-module=/path/to/your/filter/module \
--add-module=/path/to/your/other/filters
such that ngx_eval's filter works *after* your filter modules.
Limitations
* The contents of subrequests issued from within the eval block
(like those fired by echo_subrequest) won't be
captured properly.
Compatibility
The following versions of Nginx should work with this module:
* 0.9.x (last tested: 0.9.4)
* 0.8.0 ~ 0.8.41, 0.8.54+ (0.8.42 ~ 0.8.53 requires patching, see below)
(last tested: 0.8.54)
* 0.7.x >= 0.7.21 (last tested: 0.7.68)
Note that nginx 0.8.42 ~ 0.8.53 won't work due to a famous regression appeared
since 0.8.42: <http://forum.nginx.org/read.php?29,103078,103078 >,
but fortunately a patch is available for nginx 0.8.53:
http://agentzh.org/misc/nginx/nginx-0.8.53-rewrite_phase_fix.patch
This one-line patch should also be able to apply cleanly to other versions
of nginx 0.8.42 ~ 0.8.53.
Nowadays we prefer ngx_lua to do the tasks originally done by ngx_eval
because of various inherent limitations in ngx_eval (and yeah, it also
requires patching the core for nginx 0.8.42+, sigh).
Here's a small example using ngx_lua:
location = /filter-spam {
internal;
proxy_pass http://blah.blah/checker;
}
location / {
rewrite_by_lua '
local res = ngx.location.capture("/filter-spam")
if res.status ~= ngx.HTTP_OK or res.body == nil then
return
end
if string.match(res.body, "SPAM") then
return ngx.redirect("/terms-of-use")
end
';
fastcgi_pass ...;
}
this is roughly equivalent to
location / {
eval $res {
proxy_pass http://blah.blah/checker;
}
if ($res ~ 'SPAM') {
rewrite ^ /terms-of-use redirect;
break;
}
fastcgi_pass ...;
}
Even though the Lua example is a little longer but is much more flexible
and stable.
Original ngx_eval documentation:
Documentation for this module could be found under following URLs:
* English:
http://www.grid.net.ru/nginx/eval.en.html
* Russian:
http://www.grid.net.ru/nginx/eval.ru.html
This work is commissioned by gadu-gadu.pl