Traefik 入手及简单配置

栏目: 数据库 · 发布时间: 5年前

内容简介:Traefik 与 nginx 一样,是一款反向代理的工具,至于使用他原因基于以下几点接下来讲一下它的基本功能以及文件配置

原文地址

Traefik 与 nginx 一样,是一款反向代理的工具,至于使用他原因基于以下几点

  • 漂亮的 dashboard 界面
  • 可基于容器 label 进行配置
  • 对 prometheus 和 k8s 的集成
  • 尝试一下...

接下来讲一下它的基本功能以及文件配置

安装

下载二进制文件,指定配置文件,直接执行可以启动。

./traefik -c traefik.toml
复制代码

当然,你也可以通过 docker 启动,参考Traefik Get Started。

另外,如果需要使用 docker 启动,需要所有的服务都在一个 network 中,或者设置 traefik 的 network 为 host。

启动成功后,可以访问 localhost:8080 访问 Dashboard 页面。

问题

nginx -t

日志

[accessLog]

# Sets the file path for the access log. If not specified, stdout will be used.
# Intermediate directories are created if necessary.
#
# Optional
# Default: os.Stdout
#
filePath = "./traefik-access.json"

# Format is either "json" or "common".
#
# Optional
# Default: "common"
#
format = "json"
复制代码

日志文件配置为 json 格式,方便调试。同时,强烈推荐 jq ,一款 linux 下解析 json 的工具。

以下是两个常用的命令,统计某个站点的请求以及响应时间。不过最好建议有专门的日志系统去处理,可以获取更完善的,更定制化的信息。另外,traefik 无法查看请求的 body。

# 筛选特定站点的请求
cat traefik-access.json | jq 'select(.["RequestHost"] == "shici.xiange.tech") | {RequestPath, RequestHost, DownstreamStatus, "request_User-Agent", OriginDuration}'


# 筛选大于 300ms 的接口
cat traefik-access.json | jq 'select(.["RequestHost"] == "shici.xiange.tech" and .OriginDuration > 300000000) | {RequestPath, RequestHost, DownstreamStatus,
"request_User-Agent", OriginDuration, DownstreamContentSize}'
复制代码

prometheus + grafana

jq 虽然可以分析日志,但是适合做日志的统计以及更细化的分析。

Prometheus 作为时序数据库,可以用来监控 traefik 的日志,支持更加灵活的查询,报警以及可视化。traefik 默认设置 prometheus 作为日志收集工具。另外可以使用 grafana 做为 prometheus 的可视化工具。

某个服务的平均响应时间

Traefik 入手及简单配置

PromQL 为

sum(traefik_backend_request_duration_seconds_sum{backend="$backend"}) / sum(traefik_backend_requests_total{backend="$backend"}) * 1000
复制代码

某个服务响应时长大于 300ms 的请求的个数

TODO

统计请求数大于 10000 的服务

TODO

entryPoint

http

http 配置在 entryPoints 中,暴露出80端口。开启 gzip 压缩,使用 compress = true 来配置。

[entryPoints]
    [entryPoints.http]
    address = ":80"
    compress = true

    # 如果配置了此项,会使用 307 跳转到 https 
    [entryPoints.http.redirect]
    entryPoint = "https"
复制代码

考虑到隐私以及安全,不对外公开的服务可以配置 Basic AuthDigest Auth 或者 WhiteList ,或者直接搭建 VPN,在内网内进行访问。如在我服务器上 xiange.tech 对外公开, xiange.me 只能通过VPN访问。

更多文档查看Traefik entrypoints。

https

使用 Let's Encrypt 安装证书后,在 entryPoints.https.tls.certificats 中指定证书位置。

[entryPoints]
    [entryPoints.https]
    address = ":443"
    compress = true

        [[entryPoints.https.tls.certificates]]
            certFile = "/etc/letsencrypt/live/xiange.tech/fullchain.pem"
            keyFile = "/etc/letsencrypt/live/xiange.tech/privkey.pem"
复制代码

另外,traefik 默认开启 http2。

other

另外,如果需要暴露其它的端口出去,如 consul 的 8500,类似于 nginx 的 listen 指令。

可以设置

[entryPoints]
    [entryPoints.consul]
    address = ":8500"
复制代码

Docker

traefik 会监听 docker.sock ,根据容器的 label 进行配置。容器的端口号需要暴露出来,但是不需要映射到 Host。因为 traefik 可以通过 docker.sock 找到 container 的 IP 地址以及端口号,无需使用 docker-proxy 转发到 Host。

version: '3'
services:
  frontend:
    image: your-frontend-server-image
    labels:
      - "traefik.frontend.rule=Host:frontend.xiange.tech"

  api:
    image: your-api-server-image
    expose: 80
    labels:
      # 同域配置, /api 走server
      - "traefik.frontend.rule=Host:frontend.xiange.tech;PathPrefix:/api"
复制代码

如何给一个服务配置多个域名

labels:
  - "traefik.prod.frontend.rule=Host:whoami.xiange.tech"
  - "traefik.another.frontend.rule=Host:who.xiange.tech"
  - "traefik.dev.frontend.rule=Host:whoami.xiange.me"
复制代码

如何把前端和后端配置在统一域名

services:
  frontend:
    image: your-frontend-server-image
    labels:
      - "traefik.frontend.rule=Host:frontend.xiange.tech"

  api:
    image: your-api-server-image
    expose: 80
    labels:
      - "traefik.frontend.rule=Host:frontend.xiange.tech;PathPrefix:/api"
复制代码

部署时,如果项目代码有更新,如何当新服务 start 后,再去 drop 掉旧服务

TODO

负载均衡

如果使用docker,对一个容器进行扩展后,traefik 会自动做负载均衡,而 nginx 需要手动干预。

version: '3'
services:
  whoami:
    image: emilevauge/whoami
    labels:
      - "traefik.frontend.rule=Host:whoami.xiange.tech"
复制代码

手动扩展为3个实例,可以自动实现负载均衡。实现效果可以直接访问whoami.xiange.tech,每次通过 WRR 策略分配到不同的容器处理,可以通过 Hostname 和 IP 字段看出。

docker-compose up whoami=3
复制代码

手动配置

当然,以上反向代理配置都是基于 docker,那如何像 nginx 一样配置呢。如把 consul.xiange.me 转发到 8500 这个端口。可以利用 traefik 的 file provider。

[file]
    [backends]
        # consul 是服务的名字,也可以叫张三,也可以叫李四
        [backends.consul]
            [backends.consul.servers]
                [backends.consul.servers.website]
                url = "http://0.0.0.0:8500"
                weight = 1

    [frontends]
        [frontends.consul]
        entryPoints = ["http"]
        backend = "consul"
            [frontends.consul.routes]
                # website 是路由的名字,也可以叫阿猫,也可以叫阿狗
                [frontends.consul.routes.website]
                rule = "Host:consul.xiange.me"

                # 可以配置多个域名
                [frontends.consul.routes.website2]
                rule = "Host:config.xiange.me"
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序与民主

程序与民主

皮罗·克拉玛德雷 / 翟小波 / 高等教育 / 2005-3 / 8.20元

《程序与民主》是意大利著名政治学家、法学家皮罗·克拉玛德雷(Pierocalamandrei)(1889-1956)讨论现代诉讼程序的著作。该书篇幅虽小,但影响甚大。国内对该著者及其作品的介绍较少,倒是其弟子卡佩莱蒂的著作已有中文译本:《当事人基本程序保障权与未来的民事诉讼》,徐昕译,法律出版社2000年版。《程序与民主》一书,并非平行地讨论程序和民主,而是从程序的视角讨论民主。这里的民主,也不是......一起来看看 《程序与民主》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码