清漆清除仅允许来自 public ip
varnish purge allowed only from a public ip
我的设置如下:
Nginx(443 https)-> Varnish(端口 6081)-> Nginx(端口 83 - 应用程序本身)
#nginx https 配置文件:
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1800;
proxy_request_buffering off;
proxy_buffering off;
proxy_pass http://127.0.0.1:6081;
}
#part of default.vlc 会议:
backend default {
.host = "127.0.0.1";
.port = "83";
}
当然,还有一个83端口的nginx配置,就是应用本身。
我已经这样配置了,所以我可以 运行 在 HTTPS 后面进行清漆。
尝试设置清除以使特定端点的缓存无效,我在 default.vcl 中配置了以下内容:
acl purge {
"127.0.0.1";
"some_public_ip"
}
sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return (synth(405, "This IP is not allowed to send PURGE requests."));
}
return (purge);
}
}
一切正常,我可以执行:
curl -X PURGE -I "https://web_server/index.php".
问题是,如果我从 acl 列表中删除“127.0.0.1”,只让“some_public_ip”,它将不再起作用。它将 return“不允许此 IP 发送 PURGE 请求”。
我只希望清除仅适用于那个“some_public_ip”。
可能吗?
因为 Nginx 位于 Varnish 之前,client.ip
变量总是通过 localhost
引用它。实际的客户端 IP 地址存储在 X-Forwarded-For
header.
调用std.ip(req.http.X-Forwarded-For,client.ip)
即可解压。这会将 X-Forwarded-For
的值从字符串转换为 IP 地址,并且在出现错误时仍将使用 client.ip
作为后备。
因为Nginx已经设置了X-Forwarded-For
header,varnish会把客户端的IP地址加进去
我的 varnishlog
输出显示以下日志行:
- ReqUnset X-Forwarded-For: 178.118.13.77
- ReqHeader X-Forwarded-For: 178.118.13.77, 127.0.0.1
我们必须删除第二部分才能获得正确的 IP 地址。我们可以使用以下 VCL 片段来完成此操作:
set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For,"^([^,]+),.*$","");
最后,这是完成这项工作所需的 VCL 代码:
vcl 4.0;
import std;
acl purge {
"127.0.0.1";
"some_public_ip"
}
sub vcl_recv {
if(req.http.X-Forwarded-For ~ ","){
set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For,"^([^,]+),.*$","");
}
if (req.method == "PURGE") {
if (!std.ip(req.http.X-Forwarded-For,client.ip) ~ purge) {
return (synth(405, "This IP is not allowed to send PURGE requests."));
}
return (purge);
}
}
我的设置如下: Nginx(443 https)-> Varnish(端口 6081)-> Nginx(端口 83 - 应用程序本身)
#nginx https 配置文件:
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1800;
proxy_request_buffering off;
proxy_buffering off;
proxy_pass http://127.0.0.1:6081;
}
#part of default.vlc 会议:
backend default {
.host = "127.0.0.1";
.port = "83";
}
当然,还有一个83端口的nginx配置,就是应用本身。 我已经这样配置了,所以我可以 运行 在 HTTPS 后面进行清漆。
尝试设置清除以使特定端点的缓存无效,我在 default.vcl 中配置了以下内容:
acl purge {
"127.0.0.1";
"some_public_ip"
}
sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return (synth(405, "This IP is not allowed to send PURGE requests."));
}
return (purge);
}
}
一切正常,我可以执行:
curl -X PURGE -I "https://web_server/index.php".
问题是,如果我从 acl 列表中删除“127.0.0.1”,只让“some_public_ip”,它将不再起作用。它将 return“不允许此 IP 发送 PURGE 请求”。 我只希望清除仅适用于那个“some_public_ip”。 可能吗?
因为 Nginx 位于 Varnish 之前,client.ip
变量总是通过 localhost
引用它。实际的客户端 IP 地址存储在 X-Forwarded-For
header.
调用std.ip(req.http.X-Forwarded-For,client.ip)
即可解压。这会将 X-Forwarded-For
的值从字符串转换为 IP 地址,并且在出现错误时仍将使用 client.ip
作为后备。
因为Nginx已经设置了X-Forwarded-For
header,varnish会把客户端的IP地址加进去
我的 varnishlog
输出显示以下日志行:
- ReqUnset X-Forwarded-For: 178.118.13.77
- ReqHeader X-Forwarded-For: 178.118.13.77, 127.0.0.1
我们必须删除第二部分才能获得正确的 IP 地址。我们可以使用以下 VCL 片段来完成此操作:
set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For,"^([^,]+),.*$","");
最后,这是完成这项工作所需的 VCL 代码:
vcl 4.0;
import std;
acl purge {
"127.0.0.1";
"some_public_ip"
}
sub vcl_recv {
if(req.http.X-Forwarded-For ~ ","){
set req.http.X-Forwarded-For = regsub(req.http.X-Forwarded-For,"^([^,]+),.*$","");
}
if (req.method == "PURGE") {
if (!std.ip(req.http.X-Forwarded-For,client.ip) ~ purge) {
return (synth(405, "This IP is not allowed to send PURGE requests."));
}
return (purge);
}
}