nginx proxy_pass是基于请求方法是POST,PUT还是DELETE

我有两个iKaaro实例在端口8080和9080上运行,其中9080实例是只读的。

我不确定如何使用nginx,例如如果请求方法是POST,PUT,DELETE然后发送到写实例(8080),否则发送到9080实例。

我已经做了一些使用正则expression式的位置,但这是不正确的。

从http://wiki.nginx.org/HttpLuaModule我看到有'HTTP方法常量'可以调用,所以是正确的添加一个位置块为:

location ~* "(ngx.HTTP_POST|ngx.HTTP_DELETE|ngx.HTTP_PUT)" { proxy_pass http://127.0.0.1:8080; 

谢谢

我只是做了一个快速测试,这对我有效:

 server { location / { # This proxy_pass is used for requests that don't # match the limit_except proxy_pass http://127.0.0.1:8080; # For requests that *aren't* a PUT, POST, or DELETE, # pass to :9080 limit_except PUT POST DELETE { proxy_pass http://127.0.0.1:9080; } } } 

我假设你已经掌握了基础知识。 IE,你已经在你的服务器上安装了Lua 5.1,或者更好,LuaJIT 2.0,编译Nginx和ngx_lua模块,并根据需要配置ngx_lua。

有了这个,这将做到这一点:

 location /test { content_by_lua ' local reqType = ngx.var.request_method if reqType == ngx.HTTP_POST OR reqType == ngx.HTTP_DELETE OR reqType == ngx.HTTP_PUT then res = ngx.location.capture("/write_instance") else res = ngx.location.capture("/read_instance") end ngx.say(res.body) '; } location /write_instance { internal; proxy_pass http://127.0.0.1:8080; } location /read_instance { internal; proxy_pass http://127.0.0.1:9080; } 

UPDATE

我想也许你是专门在更大范围内使用Lua的。 下面的例子也会和limit_except一样工作。

 location /test { if ($request_method !~* GET) { # For Write Requests proxy_pass http://127.0.0.1:8080; } # For Read Requests proxy_pass http://127.0.0.1:9080; } 

“if”和“limit_except”块都会有效地创建一个嵌套的位置块,一旦条件匹配,将只执行由此创建的内部位置块的内容处理程序(“proxy_pass”)。

没有完全得到这个是为什么如果有时被认为是“邪恶的”,但在这种情况下,“if”和“limit_except”共同的“邪恶”行为可能正是你想要的。

所以你有三个选择可供选择!

但是请注意,如果您需要设置任何其他指令,则必须注意您不会被“if”或“limit_except”选项中的“邪恶”行为所困扰。

IE,如果你在“if”或者“limit_except”块中设置了一个指令,它可能不在外面激活,同样的,设置在外面的东西可能会被继承。 所以你必须看两种方法如何默认继承,或者不这样做。

If is Evil页面上列出的所有潜在问题同样适用于此处的“if”和“limit_except”。 基于Lua的脚本编写方法将避免该页面上提出的许多潜在缺陷。

祝你好运!

如果有人想要通过请求方法简单地创建条件,则语法是:

 if ($request_method = DELETE ) { . . . } 

我会推荐nginx地图功能。 这超出了你的位置块:

 map $request_method $destination { default 8080; PUT 9080; POST 9080; DELETE 9080; } 

然后在你的位置块:

 proxy_pass http://127.0.0.1:$destination 

这也是所有正则表达式,所以你可以做这样的事情:

 map $request_method $cookie_auth $destination { default 8080; "^POST " 9080; "^PUT someAuthCookieValue" 9080; } 

再加上这个可以避免使用。 这真是太棒了。 我用它将一个WordPress集群中的所有写入流量指向远程节点上的一个FastCGI TCP套接字,但是将读取的流量发送到本地的FastCGI UNIX套接字。