Nginx配置错误

时间:2018-11-06 14:17:46

标签: nginx nginx-location nginx-reverse-proxy nginx-config

我在配置带有某些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";
        }
}
}
  • 对于Prometheus网址,我有一个无限循环,因此该页面不会加载。

  • 对于Pushgateway,它重定向错误,因为它应该在/ api / v1 / namespaces / mynamespace / services / pushgatewaylb / proxy /中寻找样式,但是它会忽略该url部分,例如,它应该在/中寻找样式api / v1 / namespaces / mynamespace / services / pushgatewaylb / proxy / static / jquery-2.1.4.min.js

  • 对于cratedb,我会收到此错误:资源被解释为样式表,但以MIME类型text / html

  • 传输

我可以修改现有的服务器块,但是不能创建单独的服务器块。

我测试了ping目标,它们可以正常工作,如果我不使用变量,它们也可以正常工作,但是我需要使用带有解析器的变量,因为即使端点不可用,我们也需要nginx启动正常。

如何解决这些错误? 谢谢。

编辑1:

非常感谢@Richard Smith的回复,我不是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无限循环。

现在在检查浏览器说GET https://domain/api/v1/namespaces/clautagsfed/services/prometheuslb/proxy/api/v1/query?query=time()&_=1541522597396 400(错误请求)时,普罗米修斯还有其他错误,

所以似乎配置中还缺少一些东西(没有变量就可以了)。

关于Pushgateway,与上述问题相同,它应该在/api/v1/namespaces/mynamespace/services/pushgatewaylb/proxy/static/jquery-2.1.4.min.js中显示样式,但在jquery- 2.1.4.min.js

谢谢

1 个答案:

答案 0 :(得分:0)

使用变量时,proxy_pass伪指令的行为会更改。基本上,如果您指定URI,则需要指定完整的URI。有关详细信息,请参见this document

  • 从您的/变量中删除结尾的$endpoint
  • 要么使用rewrite...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;
}