【发布时间】:2019-08-25 23:41:06
【问题描述】:
我最近在启用 Docker Swarm 的集群上的 Docker 容器中设置了 Traefik v.1.7.14。作为测试,我创建了一个简单的服务:
docker service create --name demo-nginx \
--network traefik-net \
--label traefik.app.port=80 \
--label traefik.app.frontend.auth.basic="test:$$apr1$$LG8ly.Y1$$1J9m2sDXimLGaCSlO8.T20" \
--label traefik.app.frontend.rule="Host:t.myurl.com" \
nginx
正如上面的代码所说,我只是在我的 url 上安装 nginx,在指定的子域 t 上。
当这段代码运行时,服务被成功创建。 Traefik 还会在 traefik api 以及 traefik 管理员中显示服务。
在traefik api中,后端服务报如下:
"frontend-Host-t-myurl-com-0": {
"entryPoints": [
"http",
"https"
],
"backend": "backend-demo-nginx",
"routes": {
"route-frontend-Host-t-myurl-com-0": {
"rule": "Host:t.myurl.com"
}
},
"passHostHeader": true,
"priority": 0,
"basicAuth": null,
"auth": {
"basic": {}
}
当我去访问t.myurl.com时,我得到了认证提示,正如预期的那样。
但是,当我输入我的用户名/密码(在本例中为 test:test)时,登录提示只是再次提示我,而不是对我进行身份验证。
我已检查以确保我正在使用以下方法转义 docker 标签中的字符:
echo $(htpasswd -nb test test) | sed -e s/\\$/\\$\\$/g
生成密码。
作为测试的一部分,我还尝试关闭 https 入口点,因为我想看看这个循环是否是由 ssl 以某种方式触发的。这似乎对解决这个问题没有任何影响(规则:--label traefik.app.frontend.entryPoints=http)。 Traefik 在执行此操作时确实在 http 上做出了正确的响应,但密码验证仍然像以前一样陷入相同的提示循环。
删除traefik.app.frontend.auth.basic 标签后,我可以通过我的网址 (t.myurl.com) 访问我的网站。所以这个问题似乎在基本身份验证功能中是孤立的。
我的 DNS 提供商是 Cloudflare。
如果有人有任何想法,我将不胜感激。
【问题讨论】:
-
您可以尝试将
traefik.app.frontend.auth.basic替换为traefik.app.frontend.auth.basic.users吗?第一个已弃用 -
嗨,zochamx,谢谢您的评论。我尝试用您的建议替换
traefik.app.frontend.auth.basic。我仍然得到相同的登录提示。我还用 test test 再次运行了 echo 命令(usr/pwd ...只是为了 100% 确定我是从新开始的)。这些似乎都没有任何影响。密码仍然不被接受。 -
嗯,我只是注意到了别的东西。你能做一个
docker inspect <your nginx service id>并检查你的标签的价值吗?这是正确的密码吗?我确信$符号需要在撰写文件中转义,尽管我对命令行服务创建命令有疑问。