我假設你得到了基礎知識到位。 I.E.,您已經在您的服務器上安裝了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」選項中的「邪惡」行爲。如果您在「if」或「limit_except」塊內設置了一個指令,它可能不在其外部,並且類似地,外部設置的內容可能會被繼承。所以你必須看兩種方法如何默認繼承,或者不是,視情況而定。
If is Evil頁面上列出的所有潛在問題均適用於此處的「if」和「limit_except」。基於Lua的腳本編寫方法將避免該頁面上提出的許多潛在缺陷。
祝你好運!
你能解釋一下這個問題好一點?你嘗試過這種設置嗎?你有任何錯誤(哪些)? – kikito 2011-12-21 16:22:46