我正在使用ngnix作为反向代理服务器。有一种情况,当后端服务器关闭,我知道它。因此,我正在添加'Check-Cache'标头来请求,我想要做的是在缓存中获取文件,以及何时不仅仅返回错误页面。我不想将请求传递给后端。
脚本
$ curl -s -o /dev/null -w "%{http_code}" 0/images/2.jpg -H'Host: example.com'
200
$ pkill -9 backend_server
$ curl -s -o /dev/null -w "%{http_code}" 0/images/2.jpg -H'Host: example.com' -H'Check-Cache: true'
404 <-- I want to 200 here
nginx.conf
server {
listen 80;
underscores_in_headers on;
proxy_cache_purge on;
location / {
error_page 599 = @jail;
recursive_error_pages on;
if ($http_check_cache = "true") {
return 599;
}
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_cache my-cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_key $uri$is_args$args;
}
location @jail {
# try_files ??
# proxy_cache_key (If i can get it i can use try_files)
# what other solution...
return 404;
}
}
好吧,也许不是那么漂亮的解决方案,但上游可以与标记为down的一台服务器一起使用。
http {
upstream backend-jail {
server 0.0.0.0 down;
}
server {
listen 80;
underscores_in_headers on;
recursive_error_pages on;
error_page 597 = @jail;
location / {
if ($http_x_backend_down = "1") {
return 597;
}
########
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_cache my-cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_key $uri$is_args$args;
}
location @jail {
# dont need to log error about 'no live upstreams'
error_log /dev/null crit;
# backend-jail always return 502, want 404 to be returned.
error_page 502 =404 /;
proxy_pass http://backend-jail;
}
}
}