Ошибки конфигурации Nginx - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблемы с настройкой обратного прокси-сервера nginx с некоторым URL-адресом. Моя конфигурация:

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";
        }
}
}
  • Для URL-адреса 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 типа / html

Я могу изменить существующий блок сервера, но не могу создать отдельный блок сервера.

Я тестировал цели pinging, и они работают нормально, также, если я не использую переменные, они работают нормально, но мне нужно использовать переменные с resolver, потому что нам нужно nginx start ok, даже если конечные точки недоступны.

Как я могу исправить эти ошибки? Спасибо.

Edit1:

Большое спасибо @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 (Bad Request),

так что кажется, что-то не хватает в конфиге (без переменных он работает нормально).

А что касается Pushgateway, та же проблема, что и описанная выше, заключается в том, что она должна выглядеть в /api/v1/namespaces/mynamespace/services/pushgatewaylb/proxy/static/jquery-2.1.4.min.js, но она выглядит в jquery- 2.1.4.min.js

Спасибо

1 Ответ

0 голосов
/ 06 ноября 2018

При использовании переменной поведение директивы proxy_pass изменяется. В основном, если вы указываете URI, необходимо указать полный URI. Подробнее см. в этом документе .

  • Удалите завершающий / из вашей $endpoint переменной
  • Либо переведите URI с помощью оператора rewrite...break, либо преобразуйте свои местоположения в регулярные выражения и используйте захват

Например:

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;
}
...