我需要代理http://www.example.com/foo到http://<backend>/bar,使用 nginx 我有这样的配置:
server {
listen 80;
client_max_body_size 2048M;
server_name www.example.com;
location /foo {
proxy_pass http://container_name/bar/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Run Code Online (Sandbox Code Playgroud)
我会将其转换为 traefik。这是我的撰写文件:
version: '3'
services:
traefik:
image: traefik:1.7.3-alpine
command: --api --docker
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
labels:
- traefik.enable=false
webapp:
...
...
labels:
- traefik.backend=bar
- traefik.frontend.rule=Host:www.example.com;Path:/foo/
- traefik.port=80
Run Code Online (Sandbox Code Playgroud)
有办法解决吗?
谢谢
我正在尝试将 Traefik 作为 API 网关运行,并希望使用以下 docker compose 文件来触发 ForwardAuth 中间件,但中间件的身份验证端点未被命中。我将它与本地主机一起使用。
version: '3'
services:
reverse-proxy:
image: traefik # The official Traefik docker image
command: --api --docker # Enables the web UI and tells Traefik to listen to docker
ports:
- "80:80" # The HTTP port
- "8080:8080" # The Web UI (enabled by --api)
volumes:
- /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
- $PWD/traefik.toml:/traefik.toml
whoami:
image: emilevauge/whoami
labels:
- traefik.enable=true
- "traefik.frontend.rule=Host:whoami.docker.localhost"
- "traefik.http.middlewares.test-redirectscheme.redirectscheme.scheme=https"
- "traefik.http.middlewares.test-replacepath.replacepath.path=/foo" …Run Code Online (Sandbox Code Playgroud) 目前我正在尝试在我的服务器上运行 docker-compose 文件,我将在其中使用 traefik 和 Gunicorn 运行 django 应用程序。我当前的配置如下:
version: '3'
services:
web:
build:
context: ./src
dockerfile: dockerfiles-stage/Dockerfile
command: gunicorn core.wsgi:application --workers 2 --threads 2 --bind 0.0.0.0:8000
volumes:
- static_volume:/code/static
- ./src/logs/main/:/code/logs/
expose:
- 8000
labels:
- "traefik.enable=true"
- "traefik.http.routers.web.rule=Host(`mk.getalice.ai`)"
- "traefik.http.routers.web.entrypoints=websecure"
- "traefik.http.routers.web.tls.certresolver=myhttpchallenge"
depends_on:
- db
- mongo
- redis
traefik:
image: "traefik:v2.0.0-rc3"
container_name: "traefik"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.myhttpchallenge.acme.email=kmehran.1106@gmail.com"
- "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443" …Run Code Online (Sandbox Code Playgroud) 我决定尝试一下 Nomad,并且正在为公司的副项目建立一个小型环境。
尽管 Nomad/Consul 的文档很好而且很详细,但它们并没有达到向世界公开一个小型 Web 服务的简单任务。
按照官方教程使用 Traefik 作为负载均衡器,如何使这些公开的服务可访问?
该教程有一个脚注,指出可以通过端口 8080 从集群外部访问服务。
但在拥有 3 个服务器和 3 个客户端的集群中,我应该将 DNS 指向哪里?具有指向 3 个客户端的故障转移功能的 DNS 是否足够?我还需要为客户端提供负载均衡器吗?
我Traefik在我的 VPS 中使用它来将流量路由到我的网站,经过几个小时的摆弄,我终于成功地https使用 Le's Encrypt 让它工作。
现在,我需要做的一件事是也能够通过普通方式访问我的网站,http因为这是旧浏览器的一个爱好项目,我添加的唯一原因tls是 Firefox 不喜欢我的网站没有它。
问题是,使用我当前的配置,我可以https正常访问我的网站,但是当我尝试使用普通方式时,http我收到404错误。
这是我的配置docker-compose:
version: "3"
services:
traefik:
image: "traefik:v2.5"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.teeresolver.acme.tlschallenge=true"
- "--certificatesresolvers.teeresolver.acme.email=me@gmail.com"
- "--certificatesresolvers.teeresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "443:443"
- "80:80"
- "8080:8080"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
- mywebsite
# [...]
mywebsite:
image: my-web-site/site
build:
context: ~/mywebsite-runner/_work/my-web-site-php/my-web-site-php
dockerfile: Dockerfile
volumes: …Run Code Online (Sandbox Code Playgroud) 我之前的版本(去年的)minio运行良好traefik,portainer没有任何问题。我四天前尝试升级到新版本,但从那时起它就一直在走下坡路。我收到登录页面,但它不接受凭据;错误:
{"code":500,"detailedMessage":"Post \"https://storage.example.com/\": dial tcp <ip>:443: i/o timeout","message":"invalid Login"}
我怀疑这与 TLS 证书有关。
下面是我的撰写文件,我已根据需要生成了证书;欢迎任何帮助:
minio:
image: minio/minio
container_name: minio
restart: unless-stopped
command: server /data --certs-dir "./minio-data/certs" --address ":9000" --console-address ":9001"
networks:
- traefik-proxy2
expose:
- "9000"
- "9001"
volumes:
- ./minio-data:/data
environment:
- "MINIO_ROOT_USER=love"
- "MINIO_ROOT_PASSWORD=love1234"
- "MINIO_BROWSER_REDIRECT_URL=https://stash.example.com"
- "MINIO_SERVER_URL=https://storage.example.com"
labels:
- "traefik.enable=true"
- "traefik.http.services.minio.loadbalancer.server.port=9000"
- "traefik.http.routers.minio.rule=Host(`storage.example.com`)"
- "traefik.http.middlewares.minio-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.minio.middlewares=minio-https-redirect"
- "traefik.http.routers.minio.entrypoints=https"
- "traefik.http.routers.minio.service=minio"
- "traefik.http.routers.minio.tls=true"
- "traefik.http.routers.minio.tls.certresolver=http"
- "traefik.http.services.minio-console.loadbalancer.server.port=9001"
- "traefik.http.routers.minio-console.rule=Host(`stash.example.com`)"
Run Code Online (Sandbox Code Playgroud) 我有一个运行traefik反向代理的Docker容器,如下所示:
docker run \
-d \
--name traefik-reverse-proxy \
--network="host" \
-p 80:80 \
-v /dev/null:/etc/traefik/traefik.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
traefik:1.5-alpine \
--docker
Run Code Online (Sandbox Code Playgroud)
然后,我使用Jenkins运行另一个容器,该容器通过标签配置转发规则,以便traefik将所有请求转发到其路径以开头的/jenkins:
docker run \
-d \
--name jenkins \
--label "traefik.port=8080" \
--label "traefik.frontend.rule=PathPrefix: /jenkins" \
jenkins/jenkins:lts
Run Code Online (Sandbox Code Playgroud)
现在,打开http://localhost/jenkins,请求已正确转发到Jenkins容器,该容器将我重定向到index.html主页。但是,该页面大部分为空白,因为未正确加载JavaScript和CSS资产。
查看浏览器控制台,可以看到索引页面正在尝试从http://localhost/static/4e9c623d/scripts/yui/button/button-min.js该设置中不存在的地址中加载它们。相反,它应该/jenkins/在URL中包含该部分并尝试从中加载它们,例如http://localhost/jenkins/static/4e9c623d/scripts/yui/button/button-min.js-手动点击该URL将在浏览器中显示JS文件。
我尝试使用类似的规则组合,--label "traefik.frontend.rule=PathPrefix: /jenkins; AddPrefix: /jenkins/"但这并没有改变任何内容。
我将如何编写规则以使其正常工作?
所以我在这里做所有被Docker化的工作。Traefik和我的docker Registry实例一样都在容器中运行。如果我在注册表中单击,则可以从注册表中正常进行推/拉操作mydomain.com:5000/myimage。
问题出在我尝试使用443击打它时mydomain.com/myimage。我在这里设置的是Traefik反向代理,在侦听443 mydomain.com,并将内部请求转发到:5000我的Registry实例。
当我从Traefik网址进行推/拉时,它挂起并倒数,等待在循环上重试。当我查看注册表的日志时,每一个我都可以看到实例IS实际上与反向代理Traefik通信,但是,我一遍又一遍地(在客户端的每次重试中)都遇到此错误:
2018/05/31 21:10:43 http: TLS handshake error from proxy_container_ip:port: remote error: tls: bad certificate
关于TLS问题,Docker Registry确实非常严格。由于我仍在开发中,因此我在这里使用所有自签名证书。知道是什么原因导致此错误吗?我假设Traefik代理检测到注册表提供的证书不可信(自签名),因此没有完成“推送”请求,反之亦然-发送注册表时,注册表返回到Traefik代理会检测到它不受信任。
如果需要,我可以提供其他信息。当前设置是Traefik和Registry都有自己的.crt和.key文件集。这两个(当然)都启用了TLS。
谢谢。
我创建了一个我想使用 Docker 和 Traeffik 部署的网站。
当我手动部署服务时,一切都像魅力一样。
首先创建一个网络
docker network create --driver overlay traefik-net
Run Code Online (Sandbox Code Playgroud)
接下来创建 Traefik 服务
docker service create \
--name traefik \
--constraint=node.role==manager \
--publish 80:80 --publish 8080:8080 \
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
--mount type=bind,source=$PWD/traefik.toml,target=/etc/traefik/traefik.toml \
--network traefik-net \
traefik \
--docker \
--docker.swarmMode \
--docker.domain=traefik \
--docker.watch \
--api
Run Code Online (Sandbox Code Playgroud)
最后,创建网站服务
docker service create \
--name johanvergeer \
--label traefik.port=4000 \
--label traefik.frontend.rule='Host:johanvergeer.com' \
--network traefik-net \
registry.gitlab.com/johanvergeer/redgyro/site:latest
Run Code Online (Sandbox Code Playgroud)
对于配置,我创建了一个traefik.toml文件
[entryPoints]
[entryPoints.http]
address = ":80"
[docker]
endpoint = "unix:///var/run/docker.sock" …Run Code Online (Sandbox Code Playgroud)