我在用url配置nginx反向代理时遇到了一些问题。我的配置是:
events {
worker_connections 768;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
access_log /dev/stdout combined;
error_log /dev/stdout warn;
server {
ssl_certificate /opt/ssl/ca.crt;
ssl_certificate_key /opt/ssl/ca.key;
listen 443 ssl;
location /api/v1/namespaces/mynamespace/services/prometheuslb/proxy/ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://prometheuslb.mynamespace.svc.skydns.local:9090/";
proxy_pass $endpoint;
}
location /api/v1/namespaces/mynamespace/services/pushgatewaylb/proxy/ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://pushgatewaylb.mynamespace.svc.skydns.local:9091/";
proxy_pass $endpoint;
}
location /api/v1/namespaces/mynamespace/services/cratedb/proxy/ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://cratedb.mynamespace.svc.skydns.local:4200/";
proxy_pass $endpoint;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
}
}
}我可以修改现有的服务器块,但不能创建单独的服务器块。
我测试了命中目标,它们可以正常工作,如果我不使用变量,它们也可以工作,但是我需要使用变量和解析器,因为我们需要nginx启动,即使端点不可用。
我如何纠正这些错误?谢谢。
Edit1:
非常感谢您的回复,我不是nginx方面的专家,非常感谢您的帮助:新配置:
location ~ ^/api/v1/namespaces/mynamespace/services/prometheuslb/proxy(/.*)$ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://prometheuslb.mynamespace.svc.skydns.local:9090";
proxy_pass $endpoint$1;
}
location ~ ^/api/v1/namespaces/mynamespace/services/pushgatewaylb/proxy(/.*)$ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://pushgatewaylb.mynamespace.svc.skydns.local:9091";
proxy_pass $endpoint$1;
}
location ~ ^/api/v1/namespaces/mynamespace/services/cratedb/proxy(/.*)$ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://cratedb.mynamespace.svc.skydns.local:4200";
proxy_pass $endpoint$1;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
}修正了cratedb型错误和Prometheus无限循环。
现在我在prometheus浏览器检查中出现了其他错误: GET =1541522597396 400 (坏请求),
因此,在配置中似乎还缺少一些东西(没有变量,它可以正常工作)。
对于Pushgateway,与上面解释的问题相同,它在/api/v1/namespaces/mynamespace/services/pushgatewaylb/proxy/static/jquery-2.1.4.min.js中应该是样式,但在jquery-2.1.4.min.js中看起来是这样的。
谢谢
发布于 2018-11-06 15:15:57
使用变量时,proxy_pass指令的行为会发生变化。基本上,如果指定URI,则需要指定完整的URI。详情请参见本文件。
/变量中移除尾随的$endpointrewrite...break语句转换URI,要么将位置转换为正则表达式并使用捕获例如:
location ~ ^/api/v1/namespaces/mynamespace/services/prometheuslb/proxy(/.*)$ {
resolver 127.0.0.1 valid=30s;
set $endpoint "http://prometheuslb.mynamespace.svc.skydns.local:9090";
proxy_pass $endpoint$1$is_args$args;
}https://stackoverflow.com/questions/53173738
复制相似问题