Назад | Перейти на главную страницу

обратный прокси nginx внутри докера с proxy_redirect по умолчанию

Я пытаюсь бежать давай поговорим внутри докера за nginx, действующим как обратный прокси, так что Let-chat будет доступен в / chat через HTTP.

Раньше при использовании nginx в качестве обратного прокси внутри докера для другого контейнера докеров я устанавливал resolver 127.0.0.11 valid=300s; чтобы nginx использовал DNS-сервер докеров и установил proxy_pass в качестве переменной, чтобы контейнер nginx мог запускаться без необходимости подготовки исходной веб-службы. пример.

Тем не мение, Давай-чат, кажется, нужен proxy_redirect default; какая конфигурация nginx не позволяет в сочетании с переменной proxy_pass.

Кто-нибудь знает способ обойти это, чтобы получить желаемый эффект? Я пробовал несколько перенаправлений вручную, но безуспешно. Моя соответствующая конфигурация nginx ниже.

# use docker's nameserver for changing container IPs
resolver 127.0.0.11 valid=300s;
resolver_timeout 5s;

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /chat/ {
        # I would like this part to work
        #set $chat_backend http://chat_server:8080/;
        #proxy_pass $chat_backend;

        # But I can only get it to work like this
        proxy_pass http://chat_server:8080/;
        proxy_redirect /  /chat/;
        proxy_redirect default; # this line errors when setting a variable to proxy_pass

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

Спасибо.

Из руководство, следующие утверждения эквивалентны:

location /chat/ {
    proxy_pass http://chat_server:8080/;
    proxy_redirect default;
}
location /chat/ {
    proxy_pass http://chat_server:8080/;
    proxy_redirect http://chat_server:8080/ /chat/;
}

proxy_redirect default не работает, если значение proxy_pass не является буквальной строкой, однако proxy_redirect сам по себе также может быть построен из переменных.

Итак, это решение может сработать для вас:

location /chat/ {
    set $chat_backend http://chat_server:8080/;
    proxy_pass $chat_backend;

    proxy_redirect /             /chat/;
    proxy_redirect $chat_backend /chat/;
    ...
}