如何在 Traefik 中查看失败的代理?
How to view failed proxying in Traefik?
我正在构建一个基于 micro-services 的 PHP 网络应用程序,目前,进入我的应用程序的路由位于不同的端口上。这对开发来说很好,但一旦我启动就不会那么可靠了。我有:
- 端口 10001 上的 SPA 前端
- HTTP API 端口 10000
- 10002 上的网络套接字
我希望这些都在同一个端口上。我最近发现 Traefik which looks very flexible and would be able to accommodate my future needs. I appreciate I can do simple proxying with NginX 但我非常喜欢能够告诉代理通过 API 重定向流量的想法(将来会有用)。
但是,我已经设置了一个 Traefik 配置,它似乎并没有像我想要的那样进行代理。我正在努力让它生成日志来说明它出了什么问题,我正在寻找一个 "quick win" 来鼓励我进一步坚持下去。
我已经为它配置了一个 host-to-container 卷,因此它可以使用 -v /var/run/docker.sock:/var/run/docker.sock
探索 Docker。我真的不明白为什么它需要了解我的容器,因为我打算在 traefik.toml
.
中设置所有配置
因此,据我(模糊地)理解,我需要设置入口点(流量进入的地方)、前端(决定如何路由)和后端(执行操作的服务器)。我最初的尝试是这样的:
# Entrypoints definition
#
# It looks like we have one entry point, and use
# frontends to filter WS/HTTP
[entryPoints]
[entryPoints.everything]
address = ":10005"
# Frontends definition
[frontends]
[frontends.http]
backend = "backend-spa"
[frontends.http-api]
backend = "backend-http-api"
rule = "PathPrefix: /v1/captcha"
[frontends.ws]
backend = "backend-ws"
# Backends definition
[backends]
[backends.backend-spa]
url = "http://missive-interface:80"
[backends.backend-http-api]
url = "http://missive-controller:8080"
[backends.backend-ws]
url = "http://missive-controller:8081"
目前我每项服务只有一个容器。我在模式匹配器上区分 HTTP API,我想我也会在某些东西上匹配套接字服务器(可能是 Upgrade
header)。
所以,当我访问 http://localhost:10005/
时,我得到 404 page not found
。好吧,很公平,我可能配置错误了。所以我将日志级别重置为 INFO
并且我得到了这个:
time="2017-09-06T13:45:35Z" level=info msg="Using TOML configuration file /etc/traefik/traefik.toml"
time="2017-09-06T13:45:35Z" level=info msg="Traefik version v1.4.0-rc1 built on 2017-08-29_08:35:24AM"
time="2017-09-06T13:45:35Z" level=info msg="Preparing server everything &{Network: Address::10005 TLS:<nil> Redirect:<nil> Auth:<nil> WhitelistSourceRange:[] Compress:false ProxyProtocol:false} with readTimeout=0s writeTimeout=0s idleTimeout=3m0s"
time="2017-09-06T13:45:35Z" level=info msg="Starting provider *docker.Provider {"Watch":true,"Filename":"","Constraints":null,"Trace":false,"DebugLogGeneratedTemplate":false,"Endpoint":"unix:///var/run/docker.sock","Domain":"","TLS":null,"ExposedByDefault":true,"UseBindPortIP":false,"SwarmMode":false}"
time="2017-09-06T13:45:35Z" level=info msg="Starting provider *web.Provider {"Address":":8080","CertFile":"","KeyFile":"","ReadOnly":false,"Statistics":null,"Metrics":null,"Path":"","Auth":null,"Debug":false,"CurrentConfigurations":{},"Stats":{"Uptime":"2017-09-06T13:45:35.383750945Z","Pid":1,"ResponseCounts":{},"TotalResponseCounts":{},"TotalResponseTime":"0001-01-01T00:00:00Z"},"StatsRecorder":null}"
time="2017-09-06T13:45:35Z" level=info msg="Starting server on :10005"
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-controller-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-controller-app..."
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-interface-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-interface-app..."
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-storage-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-storage-app..."
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-transmitter-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-transmitter-app..."
time="2017-09-06T13:45:35Z" level=info msg="Server configuration reloaded on :10005"
但是,当触发404时,stdout
上没有额外的日志输出,所以我不知道是什么问题。我不认为这是我的服务之一。
我猜也许我的后端应该指示处理该服务的容器的名称,这样我就可以删除 "Skipping" 错误?我还应该注意,我没有使用 Kubernetes 或类似的东西 - 现在只是简单的 Docker Compose。
我没有发现什么可以推动我前进?
更新
如果我不让 Traefik 访问我的 Docker 配置,Traefik 似乎很不高兴。如果我删除 docker run
上的 -v
音量开关,那么我会每隔一秒左右将其添加到日志中:
time="2017-09-06T17:18:20Z" level=error msg="Failed to retrieve information of the docker client and server host: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"
time="2017-09-06T17:18:20Z" level=error msg="Provider connection error Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?, retrying in 443.292653ms"
我还找到了如何在配置中打开 [accessLogs]
,并将其写入 stdout
。这些显示我的请求正在访问代理,但它们没有提供有关它们如何路由的任何信息,也没有提供我的前端和后端定义是否被识别为有效的信息。
172.17.0.1 - - [06/Sep/2017:17:57:44 +0000] "GET / HTTP/1.1" %!d(<nil>) %!d(<nil>) - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0" 1 - - 0ms
172.17.0.1 - - [06/Sep/2017:17:57:49 +0000] "GET /index.php HTTP/1.1" %!d(<nil>) %!d(<nil>) - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0" 2 - - 0ms
172.17.0.1 - - [06/Sep/2017:17:58:09 +0000] "GET /index.php HTTP/1.1" %!d(<nil>) %!d(<nil>) - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0" 3 - - 0ms
好的,所以首先,如果你不使用 Docker 配置,那么即使你的服务是 运行 在容器中,你也不需要为它提供套接字(但是当你是对 Traefik 更满意,你应该研究它,因为它真的很有用)
第二件事是日志告诉您确切的问题,none 您的前端实际上被使用了,因为它们没有指定入口点。您可以添加
defaultEntryPoints = ["everything"]
在您的入口点定义上方或添加
entrypoints = ["everything"]
到您的每个前端。
另一个问题是您有 2 个没有任何规则的前端,因此它可能无法工作,因为无法区分它们。您可以使用主机规则或向 WS 前端添加路径前缀。
最后,你需要让Traefik知道使用哪个配置系统。把这个放在你的 [frontends]
:
之前
[file]
basics 页面上的架构很好地描述了一切如何协同工作。
我正在构建一个基于 micro-services 的 PHP 网络应用程序,目前,进入我的应用程序的路由位于不同的端口上。这对开发来说很好,但一旦我启动就不会那么可靠了。我有:
- 端口 10001 上的 SPA 前端
- HTTP API 端口 10000
- 10002 上的网络套接字
我希望这些都在同一个端口上。我最近发现 Traefik which looks very flexible and would be able to accommodate my future needs. I appreciate I can do simple proxying with NginX 但我非常喜欢能够告诉代理通过 API 重定向流量的想法(将来会有用)。
但是,我已经设置了一个 Traefik 配置,它似乎并没有像我想要的那样进行代理。我正在努力让它生成日志来说明它出了什么问题,我正在寻找一个 "quick win" 来鼓励我进一步坚持下去。
我已经为它配置了一个 host-to-container 卷,因此它可以使用 -v /var/run/docker.sock:/var/run/docker.sock
探索 Docker。我真的不明白为什么它需要了解我的容器,因为我打算在 traefik.toml
.
因此,据我(模糊地)理解,我需要设置入口点(流量进入的地方)、前端(决定如何路由)和后端(执行操作的服务器)。我最初的尝试是这样的:
# Entrypoints definition
#
# It looks like we have one entry point, and use
# frontends to filter WS/HTTP
[entryPoints]
[entryPoints.everything]
address = ":10005"
# Frontends definition
[frontends]
[frontends.http]
backend = "backend-spa"
[frontends.http-api]
backend = "backend-http-api"
rule = "PathPrefix: /v1/captcha"
[frontends.ws]
backend = "backend-ws"
# Backends definition
[backends]
[backends.backend-spa]
url = "http://missive-interface:80"
[backends.backend-http-api]
url = "http://missive-controller:8080"
[backends.backend-ws]
url = "http://missive-controller:8081"
目前我每项服务只有一个容器。我在模式匹配器上区分 HTTP API,我想我也会在某些东西上匹配套接字服务器(可能是 Upgrade
header)。
所以,当我访问 http://localhost:10005/
时,我得到 404 page not found
。好吧,很公平,我可能配置错误了。所以我将日志级别重置为 INFO
并且我得到了这个:
time="2017-09-06T13:45:35Z" level=info msg="Using TOML configuration file /etc/traefik/traefik.toml"
time="2017-09-06T13:45:35Z" level=info msg="Traefik version v1.4.0-rc1 built on 2017-08-29_08:35:24AM"
time="2017-09-06T13:45:35Z" level=info msg="Preparing server everything &{Network: Address::10005 TLS:<nil> Redirect:<nil> Auth:<nil> WhitelistSourceRange:[] Compress:false ProxyProtocol:false} with readTimeout=0s writeTimeout=0s idleTimeout=3m0s"
time="2017-09-06T13:45:35Z" level=info msg="Starting provider *docker.Provider {"Watch":true,"Filename":"","Constraints":null,"Trace":false,"DebugLogGeneratedTemplate":false,"Endpoint":"unix:///var/run/docker.sock","Domain":"","TLS":null,"ExposedByDefault":true,"UseBindPortIP":false,"SwarmMode":false}"
time="2017-09-06T13:45:35Z" level=info msg="Starting provider *web.Provider {"Address":":8080","CertFile":"","KeyFile":"","ReadOnly":false,"Statistics":null,"Metrics":null,"Path":"","Auth":null,"Debug":false,"CurrentConfigurations":{},"Stats":{"Uptime":"2017-09-06T13:45:35.383750945Z","Pid":1,"ResponseCounts":{},"TotalResponseCounts":{},"TotalResponseTime":"0001-01-01T00:00:00Z"},"StatsRecorder":null}"
time="2017-09-06T13:45:35Z" level=info msg="Starting server on :10005"
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-controller-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-controller-app..."
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-interface-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-interface-app..."
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-storage-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-storage-app..."
time="2017-09-06T13:45:35Z" level=error msg="No entrypoint defined for frontend frontend-Host-missive-transmitter-app, defaultEntryPoints:[]"
time="2017-09-06T13:45:35Z" level=error msg="Skipping frontend frontend-Host-missive-transmitter-app..."
time="2017-09-06T13:45:35Z" level=info msg="Server configuration reloaded on :10005"
但是,当触发404时,stdout
上没有额外的日志输出,所以我不知道是什么问题。我不认为这是我的服务之一。
我猜也许我的后端应该指示处理该服务的容器的名称,这样我就可以删除 "Skipping" 错误?我还应该注意,我没有使用 Kubernetes 或类似的东西 - 现在只是简单的 Docker Compose。
我没有发现什么可以推动我前进?
更新
如果我不让 Traefik 访问我的 Docker 配置,Traefik 似乎很不高兴。如果我删除 docker run
上的 -v
音量开关,那么我会每隔一秒左右将其添加到日志中:
time="2017-09-06T17:18:20Z" level=error msg="Failed to retrieve information of the docker client and server host: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"
time="2017-09-06T17:18:20Z" level=error msg="Provider connection error Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?, retrying in 443.292653ms"
我还找到了如何在配置中打开 [accessLogs]
,并将其写入 stdout
。这些显示我的请求正在访问代理,但它们没有提供有关它们如何路由的任何信息,也没有提供我的前端和后端定义是否被识别为有效的信息。
172.17.0.1 - - [06/Sep/2017:17:57:44 +0000] "GET / HTTP/1.1" %!d(<nil>) %!d(<nil>) - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0" 1 - - 0ms
172.17.0.1 - - [06/Sep/2017:17:57:49 +0000] "GET /index.php HTTP/1.1" %!d(<nil>) %!d(<nil>) - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0" 2 - - 0ms
172.17.0.1 - - [06/Sep/2017:17:58:09 +0000] "GET /index.php HTTP/1.1" %!d(<nil>) %!d(<nil>) - "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0" 3 - - 0ms
好的,所以首先,如果你不使用 Docker 配置,那么即使你的服务是 运行 在容器中,你也不需要为它提供套接字(但是当你是对 Traefik 更满意,你应该研究它,因为它真的很有用)
第二件事是日志告诉您确切的问题,none 您的前端实际上被使用了,因为它们没有指定入口点。您可以添加
defaultEntryPoints = ["everything"]
在您的入口点定义上方或添加
entrypoints = ["everything"]
到您的每个前端。
另一个问题是您有 2 个没有任何规则的前端,因此它可能无法工作,因为无法区分它们。您可以使用主机规则或向 WS 前端添加路径前缀。
最后,你需要让Traefik知道使用哪个配置系统。把这个放在你的 [frontends]
:
[file]
basics 页面上的架构很好地描述了一切如何协同工作。