如何查看Traefik中失败的代理?

我正在构build一个基于微服务的PHP Web应用程序,目前,进入我的应用程序的路线是在不同的端口上。 这对发展很好,但是一旦启动就不会那么可靠。 我有:

  • SPA前端10001端口
  • 端口10000上的HTTP API
  • 在10002上的Web Socket

我希望这些都在同一个端口上。 我最近发现Traefik看起来非常灵活,能够适应我未来的需求。 我很欣赏我可以使用NginX进行简单的代理,但是我非常喜欢能够告诉代理通过APIredirectstream量的想法(将在未来有用)。

但是,我已经build立了一个Traefikconfiguration,而且它并不像我想要的那样代理。 我正在努力让它产生日志来说出什么是错误的,我正在寻找一个“快速取胜”来鼓励我继续坚持下去。

我已经configuration了一个主机到容器卷,所以它可以探索Docker,使用-v /var/run/docker.sock:/var/run/docker.sock )。 我不明白为什么需要知道我的容器,因为我打算在我的traefik.toml设置所有的configuration。

所以,当我(模糊地)理解它时,我需要设置入口点(stream量进入),前端(如何路由的决定)和后端(服务器做什么)。 我最初的尝试是这样的:

 # 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头)。

所以,当我访问http://localhost:10005/404 page not found 。 那么,很公平,我可能错误地configuration了一些东西。 所以我重置日志级别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上不会输出额外的日志,所以我不知道问题是什么。 我认为这不是我的服务之一。

我猜测,也许我的后端应该指出处理该服务的容器的名称,所以我可以删除“跳过”的错误? 我还应该注意到,我没有使用Kubernetes或类似的东西 – 现在只是普通的Docker Compose。

什么东西我没有发现,会推动我前进?

更新

如果我不让它访问我的Dockerconfiguration,Traefik似乎非常不高兴。 如果我在-v上删除了-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]在configuration中,我得到这写到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 

好的,首先,如果你不使用Dockerconfiguration,那么即使你的服务在容器中运行,你也不需要提供套接字(但是当你对Traefik更加舒适的时候,你应该看看它,因为它真的很有用)

第二件事是日志告诉你到底是什么问题,没有你的前端实际使用,因为他们没有指定入口点。 你可以添加

 defaultEntryPoints = ["everything"] 

在入口点定义之上或添加

 entrypoints = ["everything"] 

到你的每个前端。

另一个问题是,你有两个前端没有任何规则,所以它可能不会工作,因为没有办法告诉他们分开。 您可以使用主机规则或向WS前端添加path前缀。

最后,你需要让Traefik知道使用哪个configuration系统。 把这个放在你的[frontends]之前:

 [file] 

基本页面上的模式很好地描述了一切如何协同工作。