我想要设置 NGINX,以便将缓存中的内容提供给除一个 IP 地址之外的所有人。
我想要实现的两个目标是:
- 确保从指定的 IP 永远不会命中缓存,但会提供磁盘上的实际文件(因此,如果我删除该文件,它会立即给出 404)
- 对于所有其他 IP:如果请求的内容尚未在缓存中,则立即从文件中加载并将其存储在缓存中(因此,如果我删除该文件,它应该在缓存持续期间提供服务)
这是我目前的配置:
server {
listen 80;
listen 127.0.0.1:9999 default;
server_name storage.example.com;
charset utf-8;
autoindex off;
access_log "/var/log/nginx/storage.access.log";
udplog_tag "www.example.com/storage";
set_real_ip_from 127.0.0.0/8;
set_real_ip_from unix:;
real_ip_header X-Real-IP;
server_name_in_redirect off;
port_in_redirect off;
location /a/ {
alias "/storage/public/a/";
}
location /b/ {
alias "/storage/public/b/";
}
}
server {
listen 80;
server_name static.example.com;
charset utf-8;
autoindex off;
access_log "/var/log/nginx/static.access.log";
udplog_tag "www.example.com/static";
location / {
proxy_set_header Host "$host";
proxy_pass http://127.0.0.1:9999/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 15;
proxy_send_timeout 60;
proxy_read_timeout 60;
include proxy_cache;
proxy_redirect default;
}
}
这是包含的文件 proxy_cache 的内容:
proxy_cache cache;
proxy_cache_key "$scheme://$host$uri";
proxy_cache_use_stale error;
proxy_next_upstream off;
proxy_cache_min_uses 1;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 30m;
proxy_buffers 128 4k;
我想做的是类似的事情:
if ( $remote_addr != "ip to exclude" )
{ include proxy_cache; }
不幸的是,这不起作用。任何帮助都非常感谢。谢谢。
答案1
绕过缓存的方法如下proxy_cache_bypass
。如果传递给它的任何值非零,它将导致绕过缓存。
但在此之前,你需要将一个变量传递给它。对于你的情况,可以使用geo
指令来检查远程 IP 地址。(也可以使用 来完成map
,这是一个更通用的指令。)
因此,您所在街区的第一名是http
:
geo $ip_cache_bypass {
default 0;
192.0.2.81 1;
}
然后在您的代理配置指令中:
proxy_cache_bypass $ip_cache_bypass;
然后,IP 地址 192.0.2.81 将绕过缓存。您可以在geo
块中添加任意数量的 IP 地址或 CIDR 范围。