docker 内部使用 proxy_redirect 默认的 nginx 反向代理

docker 内部使用 proxy_redirect 默认的 nginx 反向代理

我正在努力奔跑让我们聊天在 nginx 后面的 docker 内部充当反向代理,以便 lets-chat 可以通过 HTTP 在 /chat 上访问。

过去,当在 docker 内部使用 nginx 作为另一个 docker 容器的反向代理时,我设置resolver 127.0.0.11 valid=300s;nginx 使用 docker DNS 服务器并将其设置proxy_pass为变量,这样 nginx 容器就可以启动,而无需上游 web 服务准备就绪。例子

然而,lets-chat 似乎需要 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;
    }
}

谢谢。

答案1

手册,以下语句是等效的:

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 defaultproxy_pass如果的值不是文字字符串则不起作用,但是,proxy_redirect它本身也可以由变量构造。

因此这个解决方案可能适合你:

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

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

答案2

我设置解析器127.0.0.11 valid=300s;

去阅读您提供的链接 - 您将其设置到了错误的地方。

服务器名称本地主机;

我很难想象这是如何做到的任何意义。聊天服务只能从运行 nginx 的主机访问。如果您以合理的方式使用 docker,则这是一个 docker 实例,而不是我们的浏览器运行的地方。

相关内容