我正在努力奔跑让我们聊天在 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 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/;
...
}
答案2
我设置解析器127.0.0.11 valid=300s;
去阅读您提供的链接 - 您将其设置到了错误的地方。
服务器名称本地主机;
我很难想象这是如何做到的任何意义。聊天服务只能从运行 nginx 的主机访问。如果您以合理的方式使用 docker,则这是一个 docker 实例,而不是我们的浏览器运行的地方。