Полагаю, вы получили основы. То есть вы установили 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», если вам нужно установить какие-либо другие директивы.
I.E., Если вы устанавливаете директиву внутри блока "if" или "limit_except", она может быть неактивной вне его и, аналогично, нечто, установленное снаружи, может наследоваться внутри. Поэтому вы должны следить за тем, как наследуются значения по умолчанию или нет, в зависимости от обстоятельств, при обоих подходах.
Все потенциальные проблемы, перечисленные на странице If is Evil , в равной степени относятся к "if" и "limit_except" здесь. Подход сценариев на основе Lua позволит избежать многих из этих потенциальных ловушек, как предлагается на этой странице.
Удачи!