前言:我感谢这不理想,我正在迁移远离旧的基于Apache的服务器,现在需要在那里留下一些网站。
我想让Traefik将某些请求转发给其他服务器,请考虑以下配置:
[file]
[frontends.attie]
backend = "attie"
[frontends.attie.routes._]
rule = "HostRegexp: {host:^(www\\.)?attie.co.uk}"
[backends.attie.servers._]
url = "http://attie.co.uk:80"
在外部,DNS指向此服务器上的attie.co.uk
。然后,Traefik必须使用Host: attie.co.uk
标题将请求转发到旧服务器。
不幸的是,DNS将attie.co.uk
指向此服务器,我们最终会循环(当然)。
我已将条目添加到容器的/etc/hosts
,但这不起作用 - 我们最终仍然处于循环中(see the log in this gist),大概是因为Traefik正在进行名称解析并忽略hosts文件。
我尝试使用customRequestHeaders
无效 - 它出现在日志中的配置blob中,但不起作用。
[frontends.attie.headers.customRequestHeaders]
Host = "attie.co.uk"
[backends.attie.servers._]
url = "http://10.42.0.4:80"
请注意this页面上的警告:
如果自定义标题名称与请求或响应的一个标题名称相同,则将替换它。
我有什么方法可以做其中一个吗?
/etc/hosts
url
Host:
标头
我对documentation进行了相当广泛的审视,但可能错过了一些内容。
PS:我原本希望这个问题更适合ServerFault或SuperUser,但它们没有traefik标签,文档特别提到了StackOverflow。
答案 0 :(得分:1)
如果您使用的是官方traefik图像,则此图像是从头开始构建的。最值得注意的是,没有/etc/nsswitch.conf
文件存在。在这种情况下,golang implemented the same fallback mechanism as glibc(将忽略/etc/hosts
)-正是您正在观察的问题。
配置中的重要一行是,它告诉解析器首先查看本地/etc/hosts
文件,然后回退到DNS查询:
hosts: files dns
通过在容器中运行此文件而创建的最小nsswitch.conf
文件可以做到:
echo "hosts: files dns" > /etc/nsswitch.conf
但是,考虑到任何普通主机系统上都存在正确的nsswitch.conf
文件,也许最简单的解决方案是在docker run中添加额外的装载。这是traefik docker hub repo的改编示例:
docker run -d -p 8080:8080 -p 80:80 \
-v $PWD/traefik.toml:/etc/traefik/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/nsswitch.conf:/etc/nsswitch.conf:ro \
traefik
如果使用docker compose或其他工具,我敢肯定您可以对此进行调整。完成后,内部的/etc/hosts
文件应该可以正常工作。 (您可能已通过--add-host
docker run标志进行了修改)
答案 1 :(得分:0)
永久解决此问题的另一种方法是创建自己的Dockerfile
:
FROM traefik:v2.1
## Fix nssswitch not looking at hosts file (See https://github.com/containous/traefik/pull/6012)
RUN echo "hosts: files dns" > /etc/nsswitch.conf
我尝试在git上submit the change,但是官方图像似乎隐藏在某个地方。