Использование переменной для proxy_pass для предотвращения сбоя nginx, если хост в апстриме не найден

Я попытался предотвратить сбой nginx, когда восходящий поток не найден, используя переменную для proxy_pass (как описано в этот поток stackoverflow):

# Set front-dev in a variable to let nginx start even if it is not accessible (which is the case in production)
set $frontdev front-dev;
resolver 127.0.0.11 [::1]; # in a docker environment

location /dev/ {
    proxy_pass              http://$frontdev:4200/;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}

Таким образом, nginx запускается без сбоев, но вместо ресурсов возвращается пустая html-страница, когда я подключаюсь к восходящему потоку.

Firefox возвращает эту ошибку:

Uncaught SyntaxError: expected expression, got '<'    jquery.min.js:1

Так как этот файл возвращается вместо jquery.min.js:

<!doctype html>
<html lang="en">

<head>
    <title>Shanoir</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" href="assets/images/favicon.ico" type="image/x-icon">
    <link href="assets/css/awesome.min.css" rel="stylesheet">
    <script src="/auth/js/keycloak.js"></script>
    <script defer type="text/javascript" src="assets/papaya-nojquery/jquery.min.js"></script>
    <script defer type="text/javascript" src="assets/papaya-nojquery/papaya.js"></script>
    <script defer type="text/javascript" src="assets/jszip.min.js"></script>
</head>


</head>
<body>
  <app-root></app-root>
<script src="runtime.js" type="module"></script><script src="polyfills.js" type="module"></script><script src="styles.js" type="module"></script><script src="vendor.js" type="module"></script><script src="main.js" type="module"></script></body>
</html>

Вот несколько логов nginx:

shanoir-ng-nginx            | 172.18.0.1 - - [16/Nov/2020:15:55:09 +0000] "GET /dev/ HTTP/1.1" 200 408 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
shanoir-ng-nginx            | 172.18.0.1 - - [16/Nov/2020:15:55:09 +0000] "GET /dev/assets/css/awesome.min.css HTTP/1.1" 200 408 "https://shanoir-ng-nginx/dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
shanoir-ng-nginx            | 172.18.0.1 - - [16/Nov/2020:15:55:09 +0000] "GET /dev/polyfills.js HTTP/1.1" 200 408 "https://shanoir-ng-nginx/dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0" "-"
[...]

Примечание

Эта конфигурация работает отлично, но апстрим должен быть запущен до запуска nginx:


# Front development with angular-cli server
location /dev/ {
    proxy_pass              http://front-dev:4200/;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}

Я не понимаю, чего не хватает, есть идеи?


person arthur.sw    schedule 16.11.2020    source источник
comment
408 — длина ответа в байтах. Код состояния 200.   -  person Richard Smith    schedule 16.11.2020
comment
ахах спасибо ^^! Я обновил свой вопрос. Я должен убедиться, что восходящий поток действительно запущен при инициализации nginx; возможно, мой апстрим запускается слишком долго и становится доступным после инициализации nginx. Я подтвержу это через минуту.   -  person arthur.sw    schedule 17.11.2020
comment
хорошо, у меня возникает та же проблема, даже когда мой восходящий поток доступен при запуске nginx.   -  person arthur.sw    schedule 17.11.2020
comment
У вас есть конечный / в вашем выражении proxy_pass, что означает, что каждый запрос изменяется на / перед передачей вверх по течению. Вероятно, вы захотите использовать rewrite ^/dev(.*)$ $1 break;, если вам нужно удалить префикс /dev из запрошенного URI.   -  person Richard Smith    schedule 17.11.2020
comment
Я обновил свой вопрос рабочей конфигурацией (которая требует, чтобы мой восходящий поток работал до nginx). Поскольку proxy_pass http://front-dev:4200/; работает, я предположил, что proxy_pass http://$frontdev:4200/; также работает, как только $frontdev установлено на front-dev;.   -  person arthur.sw    schedule 18.11.2020
comment
Плохое предположение. См. этот документ, особенно часть Когда используются переменные...   -  person Richard Smith    schedule 18.11.2020
comment
@RichardSmith - это действительно должен быть ответ, а не комментарий. Я обнаружил, что использование переменной в proxy_pass приводит к тому, что эта директива не работает должным образом даже с косой чертой в конце. Добавление rewrite и удаление завершающего / из proxy_pass устранило мою проблему.   -  person Neil C. Obremski    schedule 10.04.2021