【发布时间】:2017-10-09 13:41:49
【问题描述】:
我想默认将发送到我的 nginx 服务器的所有请求路由到我的后端应用程序,但有选择地将带有 GET HTTP 动词的 API 请求发送到由 content_by_lua nginx 指令支持的基于 OpenResty Lua 的 REST API。
我能够使用以下配置成功地将所有 API 请求基于其 URL 前缀路由到 Lua API(请注意,这不考虑 HTTP 动词):
http {
upstream backend {
server localhost:8080;
}
server {
listen 80;
location / {
# Send all requests to the backend application
proxy_pass http://backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header CLIENT_IP $remote_addr;
proxy_set_header HTTP_CLIENT_IP $remote_addr;
proxy_redirect off;
}
location /api {
# Send any URL with the /api prefix to the nginx Lua API application
content_by_lua '
require("lapis").serve("app")
';
}
}
}
但是,如上所述,我想进一步限制 API 请求,以便使用除 GET 之外的 HTTP 动词的任何请求(如 POST、PUT、DELETE 等)仍被路由到后端,而 GET 请求单独路由到 Lua API 位置。
根据其他一些帖子、博客和文档(并听说 the if directive is frowned upon),我尝试使用 limit_except 指令,但随后 nginx 服务器在启动时崩溃,因为似乎 content_by_lua 指令不是设计的对于limit_except 块。这是我的尝试:
http {
upstream backend {
server localhost:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header CLIENT_IP $remote_addr;
proxy_set_header HTTP_CLIENT_IP $remote_addr;
proxy_redirect off;
}
location /api {
# Default the non-get API requests back to the backend server
proxy_pass http://backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header CLIENT_IP $remote_addr;
proxy_set_header HTTP_CLIENT_IP $remote_addr;
proxy_redirect off;
# Select requests that *aren't* a PUT, POST, or DELETE, and pass those to the Lapis REST API
limit_except PUT POST DELETE {
content_by_lua '
require("lapis").serve("app")
';
}
}
}
}
它立即与
崩溃nginx: [emerg] "content_by_lua" directive is not allowed here in nginx.conf:46
在委派content_by_lua 指令时,基于 URL 前缀 和 HTTP 动词在 nginx 中选择性路由的最佳方法是什么?
【问题讨论】: