对于以 /c/ 开头的 uri,我想进行 memcached 密钥测试,并返回密钥的值(如果存在)。如果没有密钥,则应将其传递给代理。
我通过这个指令来做到这一点:
location ^~ /c/ {
set $memcached_key "prefix:$request_uri";
memcached_pass 127.0.0.1:11211;
default_type application/json;
error_page 404 405 502 = @proxy
}
对于所有其他请求,我希望它们传递给同一个代理。我使用下面的指令来实现:
location / {
proxy_pass http://127.0.0.1:5555;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}
我的@proxy
位置是这样的:
location @proxy {
proxy_pass http://127.0.0.1:5555;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}
如图所示,@proxy
与 相同/
。我不想复制粘贴我的代理配置。相反,我想将位置重定向/
到@proxy
。如何将一个位置块重定向到另一个位置块?如何摆脱代理的重复配置?
答案1
最简单的做法是将所有常用代理设置放入服务器,然后每个位置都有一个 proxy_pass。您还可以使用上游来避免在多个位置使用地址:端口:
upstream _backend {
server 127.0.0.1:5555;
}
server {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://_backend;
}
location @proxy {
proxy_pass http://_backend;
}
location ^~ /c/ {
set $memcached_key "prefix:$request_uri";
memcached_pass 127.0.0.1:11211;
default_type application/json;
error_page 404 405 502 = @proxy
}
}