我的 nginx 服务器当前设置为通过以下方式处理所有请求uwsgi_pass
:
location / {
uwsgi_pass unix:///tmp/uwsgi-zerocater.sock;
include uwsgi_params;
uwsgi_read_timeout 7200;
client_max_body_size 20M;
}
在我的应用程序代码中,我设置了一个名为的 cookie,new_fe
其值为“True”或“False”。
当值为“True”时,我想改为proxy_pass
使用另一个外部服务器,但仅限于特定路由。如下所示伪代码:
location ~ "^/my/complicated/regex$" {
if ($cookie_new_fe = "True") {
# pass the request to my other server
# at something like http://other.server.com
} else {
# do the usual uwsgi stuff
}
}
我该怎么做?我对 还不太熟悉nginx
,所以如果我遗漏了一些简单的东西,请原谅我的问题。
答案1
作为一个临时解决方案,这应该有效:
location ~ "^/my/complicated/regex$" {
if ($cookie_new_fe = "True") {
error_page 418 = @proxy;
return 418;
}
# do the usual uwsgi stuff
}
location @proxy {
# do proxy stuff
}
答案2
我对地图进行了更多的研究,并想出了这个解决方案,它似乎有效(使用了@womble 和@alexey-ten 的建议):
map $cookie_new_fe $serve_request_from {
default @uwsgi;
"True" @proxy;
}
server {
# ...
# BEGIN Routes to switch based on value of $cookie_new_fe
location ~ "^/my/complicated/regex$" {
error_page 418 = $serve_request_from;
return 418;
}
# END
location / {
error_page 418 = @uwsgi;
return 418;
}
location @uwsgi {
uwsgi_pass unix:///tmp/uwsgi-origserver.sock;
include uwsgi_params;
uwsgi_read_timeout 7200;
client_max_body_size 20M;
}
location @proxy {
proxy_pass https://other.server.com;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
这样,在迁移完成之前,我需要在此过程中添加的许多路线的重复性将降到最低。