我使用docker和nginx与varnish一起运行。
因为我运行的是docker,所以我在nginx配置(resolver 127.0.0.11 ipv6=off valid=10s;
)的顶部手动设置了解析器,这样,对容器IP的更改将在不需要重新启动nginx的情况下获得。
这是配置中给我带来麻烦的相关部分:
location ~^/([a-zA-Z0-9/]+)$ {
set $args ''; #clear out the entire query string
set $card_name $1;
set $card_name $card_name_lowercase;
rewrite ^ /cards?card=$card_name break;
proxy_set_header x-cache-key card-type-$card_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header REQUEST_URI $request_uri;
proxy_http_version 1.1;
set $backend "http://varnish:80";
proxy_pass $backend;
proxy_intercept_errors on;
proxy_connect_timeout 60s;
proxy_send_timeout 86400s;
proxy_read_timeout 86400s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
error_page 503 /maintenance.html;
}
当我访问这个的URL时,例如https://example.com/Test
,我得到500内部服务器错误。
在nginx错误日志中,我看到以下内容:2022/04/27 23:59:45 [error] 53#53: *1 invalid URL prefix in "", client: 10.211.55.2, server: example.com, request: "GET /Test HTTP/2.0", host: "example.com"
我不确定是什么导致了这个问题--http://
包含在后端中,所以它确实有一个正确的前缀。
如果我只使用proxy_pass http://varnish:80
,它可以正常工作,但是后端需要是一个变量,以便强制docker使用解析器。
1条答案
按热度按时间kjthegm61#
我也遇到过类似的问题。我不知道为什么,但定义
设置$后端“http://varnish:80”;
位置块外部