主体部分

  1. # traefik.toml
  2. ################################################################
  3. # 全局配置文件
  4. ################################################################
  5. # 设置超时的时间(以秒为单位)
  6. # 在热更新期间给还在活动中的请求来完成当前任务的超时时间
  7. #
  8. # 可选
  9. # 默认: 10
  10. #
  11. # graceTimeOut = 10
  12. # 开启调试模式
  13. #
  14. # 可选
  15. # 默认: false
  16. #
  17. # debug = true
  18. # 定期检查是否有新版本产生
  19. #
  20. # 可选
  21. # 默认: true
  22. #
  23. # checkNewVersion = false
  24. # Traefik 日志文件
  25. # 如果没有定义, 日志文件输出到 stdout
  26. #
  27. # 可选
  28. #
  29. # traefikLogsFile = "log/traefik.log"
  30. # 日志文件路径
  31. #
  32. # 可选
  33. #
  34. # accessLogsFile = "log/access.log"
  35. # 日志等级
  36. #
  37. # 可选
  38. # 默认: "ERROR"
  39. # 接受以下值,按照严重程度排序: "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "PANIC"
  40. # 日志等级在配置值或配置值以上的信息将被日志记录。
  41. #
  42. # logLevel = "ERROR"
  43. # 后端节流持续时间:在应用新配置之前,提供者的2个事件之间的最短持续时间(以秒为单位)
  44. # 如果在短时间内发送多个事件,它可以避免不必要的重新加载。
  45. #
  46. # 可选
  47. # 默认: "2"
  48. #
  49. # ProvidersThrottleDuration = "5"
  50. # 为每个host控制最大空闲连接(keep-alive)。如果设置为0,那么将会使用
  51. # Go语言基础库net/http中的DefaultMaxIdleConnsPerHost。
  52. # 如果造成 'too many open files' 错误,你也可以增加这个值或改变 `ulimit`。
  53. #
  54. # 可选
  55. # 默认: 200
  56. #
  57. # MaxIdleConnsPerHost = 200
  58. # 如果设置为 true, 无效的 SSL 证书也会被后端所接受。If set to true invalid SSL certificates are accepted for backends.
  59. # 注意:这会禁用中间人攻击(man-in-the-middle attacks)监测,所以只能被用在安全的后端网络中。
  60. #
  61. # 可选
  62. # 默认: false
  63. #
  64. # InsecureSkipVerify = true
  65. # 被前端所使用的入口点未指定任何入口点。
  66. # 任何前端可以指定它自己的入口点。
  67. #
  68. # 可选
  69. # 默认: ["http"]
  70. #
  71. # defaultEntryPoints = ["http", "https"]

约束

在一个以中央服务发现的微服务架构中,配置文件会将Træfɪk的发现范围约束到一小部分路由上。

Træfɪk 根据你在配置后端时为服务设置的属性/标签来过滤服务。

支持的后端类型:

  • Docker
  • Consul K/V
  • BoltDB
  • Zookeeper
  • Etcd
  • Consul Catalog 支持的过滤方式:

  • tag

  1. # 定义约束条件
  2. #
  3. # 可选
  4. #
  5. # 简单约束匹配的条件
  6. # constraints = ["tag==api"]
  7. #
  8. # 简单约束不匹配的条件
  9. # constraints = ["tag!=api"]
  10. #
  11. # 约束全局匹配条件
  12. # constraints = ["tag==us-*"]
  13. #
  14. # 后端指定约束条件
  15. # [consulCatalog]
  16. # endpoint = 127.0.0.1:8500
  17. # constraints = ["tag==api"]
  18. #
  19. # 多个约束条件
  20. # - "tag==" 必需匹配至少一个标签
  21. # - "tag!=" 必需不匹配任何标签
  22. # constraints = ["tag!=us-*", "tag!=asia-*"]
  23. # [consulCatalog]
  24. # endpoint = 127.0.0.1:8500
  25. # constraints = ["tag==api", "tag!=v*-beta"]

入口点定义

  1. # 入口点定义
  2. #
  3. # 可选
  4. # 默认:
  5. # [entryPoints]
  6. # [entryPoints.http]
  7. # address = ":80"
  8. #
  9. # 将一个http入口点转发到一个https入口点上(保留 SNI 支持):
  10. # [entryPoints]
  11. # [entryPoints.http]
  12. # address = ":80"
  13. # [entryPoints.http.redirect]
  14. # entryPoint = "https"
  15. # [entryPoints.https]
  16. # address = ":443"
  17. # [entryPoints.https.tls]
  18. # [[entryPoints.https.tls.certificates]]
  19. # CertFile = "integration/fixtures/https/snitest.com.cert"
  20. # KeyFile = "integration/fixtures/https/snitest.com.key"
  21. # [[entryPoints.https.tls.certificates]]
  22. # CertFile = "integration/fixtures/https/snitest.org.cert"
  23. # KeyFile = "integration/fixtures/https/snitest.org.key"
  24. #
  25. # 将一个入口点转发重写为URL:
  26. # [entryPoints]
  27. # [entryPoints.http]
  28. # address = ":80"
  29. # [entryPoints.http.redirect]
  30. # regex = "^http://localhost/(.*)"
  31. # replacement = "http://mydomain/$1"
  32. #
  33. # 只接受提供了被指定证书认证机构(CA)签发的证书的客户端。
  34. # ClientCAFiles 可以在同一个文件被配置为多个CA证书或使用一个或多个文件配置多个CA证书。
  35. # CA证书必需是PEM文件格式的。
  36. # 所有客户端将被要求提供一个有效的证书。
  37. # 这个队客户端的要求会被应用到该入口点下的所有服务器证书
  38. # 在下面的例子中 snitest.com 与 snitest.org 都需要提供客户端证书
  39. #
  40. # [entryPoints]
  41. # [entryPoints.https]
  42. # address = ":443"
  43. # [entryPoints.https.tls]
  44. # ClientCAFiles = ["tests/clientca1.crt", "tests/clientca2.crt"]
  45. # [[entryPoints.https.tls.certificates]]
  46. # CertFile = "integration/fixtures/https/snitest.com.cert"
  47. # KeyFile = "integration/fixtures/https/snitest.com.key"
  48. # [[entryPoints.https.tls.certificates]]
  49. # CertFile = "integration/fixtures/https/snitest.org.cert"
  50. # KeyFile = "integration/fixtures/https/snitest.org.key"
  51. #
  52. # 要为一个入口点开启基础认证(basic auth)
  53. # 使用2组用户名/密码: test:test 与 test2:test2
  54. # 密码可以以MD5、SHA1或BCrypt方式加密:你可以使用htpasswd来生成这些用户名密码。
  55. # [entryPoints]
  56. # [entryPoints.http]
  57. # address = ":80"
  58. # [entryPoints.http.auth.basic]
  59. # users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"]
  60. #
  61. # 要为一个入口点开启摘要认证(digest auth)
  62. # 使用2组用户名/域/密码: test:traefik:test 与 test2:traefik:test2
  63. # 你可以使用htdigest来生成这些用户名/域/密码
  64. # [entryPoints]
  65. # [entryPoints.http]
  66. # address = ":80"
  67. # [entryPoints.http.auth.basic]
  68. # users = ["test:traefik:a2688e031edb4be6a3797f3882655c05 ", "test2:traefik:518845800f9e2bfb1f1f740ec24f074e"]
  69. #
  70. # 要指定一个https入口点使用一个较低的TLS版本并且指定一组密钥(在crypto/tls包中定义):
  71. # [entryPoints]
  72. # [entryPoints.https]
  73. # address = ":443"
  74. # [entryPoints.https.tls]
  75. # MinVersion = "VersionTLS12"
  76. # CipherSuites = ["TLS_RSA_WITH_AES_256_GCM_SHA384"]
  77. # [[entryPoints.https.tls.certificates]]
  78. # CertFile = "integration/fixtures/https/snitest.com.cert"
  79. # KeyFile = "integration/fixtures/https/snitest.com.key"
  80. # [[entryPoints.https.tls.certificates]]
  81. # CertFile = "integration/fixtures/https/snitest.org.cert"
  82. # KeyFile = "integration/fixtures/https/snitest.org.key"
  83. # 要启用gzip格式压缩支持:
  84. # [entryPoints]
  85. # [entryPoints.http]
  86. # address = ":80"
  87. # compress = true
  88. [entryPoints]
  89. [entryPoints.http]
  90. address = ":80"

重试配置

  1. # 当网络故障时启用重发请求
  2. #
  3. # 可选
  4. #
  5. [retry]
  6. # 重试次数
  7. #
  8. # 可选
  9. # 默认: (后端服务器数量) -1
  10. #
  11. # attempts = 3

ACME (Let's Encrypt) 配置

  1. # 使用ACME的入口点配置样本
  2. [entryPoints]
  3. [entryPoints.https]
  4. address = ":443"
  5. [entryPoints.https.tls]
  6. # 启用 ACME (Let's Encrypt): 自动 SSL
  7. #
  8. # 可选
  9. #
  10. [acme]
  11. # 用于注册的邮箱地址
  12. #
  13. # 必需
  14. #
  15. email = "[email protected]"
  16. # 证书存储使用的文件或键。
  17. # 警告,如果你在Docker中使用Traefik你有两种选择:
  18. # - 在你的服务器上创建一个文件并作为一个卷挂载
  19. # storageFile = "acme.json"
  20. # $ docker run -v "/my/host/acme.json:acme.json" traefik
  21. # - 将包含这个文件的目录作为一个卷挂载
  22. # storageFile = "/etc/traefik/acme/acme.json"
  23. # $ docker run -v "/my/host/acme:/etc/traefik/acme" traefik
  24. #
  25. # 必需
  26. #
  27. storage = "acme.json" # or "traefik/acme/account" if using KV store
  28. # 代理acme验证证书challenge/apply的入口点。
  29. # 警告, 必需指向到一个443端口作为入口点
  30. #
  31. # 必需
  32. #
  33. entryPoint = "https"
  34. # 使用一个基于DNS的acme challenge而不是使用额外的HTTPS接入,例如,一个带有前置防火墙的服务器的情况可能无法完成验证
  35. # 选择一个可以设置 challenge TXT 匹配记录的DNS域名的提供者,
  36. # 并提供以下环境变量来启用它:
  37. # - cloudflare: CLOUDFLARE_EMAIL, CLOUDFLARE_API_KEY
  38. # - digitalocean: DO_AUTH_TOKEN
  39. # - dnsimple: DNSIMPLE_EMAIL, DNSIMPLE_API_KEY
  40. # - dnsmadeeasy: DNSMADEEASY_API_KEY, DNSMADEEASY_API_SECRET
  41. # - exoscale: EXOSCALE_API_KEY, EXOSCALE_API_SECRET
  42. # - gandi: GANDI_API_KEY
  43. # - linode: LINODE_API_KEY
  44. # - manual: 无,但是需要以可交互模式运行traefik & 打开acmeLogging来查看说明 & 按下回车
  45. # - namecheap: NAMECHEAP_API_USER, NAMECHEAP_API_KEY
  46. # - rfc2136: RFC2136_TSIG_KEY, RFC2136_TSIG_SECRET, RFC2136_TSIG_ALGORITHM, RFC2136_NAMESERVER
  47. # - route53: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, or configured user/instance IAM profile
  48. # - dyn: DYN_CUSTOMER_NAME, DYN_USER_NAME, DYN_PASSWORD
  49. # - vultr: VULTR_API_KEY
  50. # - ovh: OVH_ENDPOINT, OVH_APPLICATION_KEY, OVH_APPLICATION_SECRET, OVH_CONSUMER_KEY
  51. # - pdns: PDNS_API_KEY, PDNS_API_URL
  52. #
  53. # 可选
  54. #
  55. # dnsProvider = "digitalocean"
  56. # 默认情况下,DNS提供者会在ACME验证前验证TXT DNS challenge
  57. # 如果 delayDontCheckDNS 是一个比0大的值,跳过这里 & 否则配置这里就是等待多长时间(以秒为单位)
  58. # 当内网屏蔽了附加的DNS查询时非常有用
  59. #
  60. # Optional
  61. #
  62. # delayDontCheckDNS = 0
  63. # 如果设置为true,将显示由acme客户端代码库中产生的调试日志信息
  64. #
  65. # 可选
  66. #
  67. # acmeLogging = true
  68. # 启用按需证书。如果这个主机名还没有证书,这将会在与一个主机名发起请求的第一个TLS握手中向Let's Encrypt请求一个证书。
  69. # 警告,第一次在请求中获取主机证书会导致TLS握手会非常慢,这会引起Dos攻击。
  70. # 警告,值得注意的是Let's Encrypt是有请求上限的:https://letsencrypt.org/docs/rate-limits
  71. #
  72. # 可选
  73. #
  74. # onDemand = true
  75. # 启用根据前端Host规则来生成证书。这将会为每个具有Host规则的前端生成一个Let's Encrypt的证书。
  76. # 举个例子,一个具有规则的Host:test1.traefik.cn,test2.traefik.cn 将会为主域名test1.traefik.cn与SAN(替代域名) test2.traefik.cn生成一个证书。
  77. #
  78. # 可选
  79. #
  80. # OnHostRule = true
  81. # 所使用的CA服务器
  82. # 取消注释这行来使其运行在正式环境的Let's Encrypt证书服务器上
  83. # 在生产环境中请取消注释
  84. #
  85. # 可选
  86. #
  87. # caServer = "https://acme-staging.api.letsencrypt.org/directory"
  88. # 域名列表
  89. # 你可以为每个主域名提供多个SANs(替代域名)
  90. # 所有域名的A/AAAA记录必需指向 Traefik
  91. # 警告,值得注意的是Let's Encrypt是有请求上限的:https://letsencrypt.org/docs/rate-limits
  92. # 每个域名 & SANs(替代域名)都将会指向一个证书请求。
  93. #
  94. # [[acme.domains]]
  95. # main = "local1.com"
  96. # sans = ["test1.local1.com", "test2.local1.com"]
  97. # [[acme.domains]]
  98. # main = "local2.com"
  99. # sans = ["test1.local2.com", "test2x.local2.com"]
  100. # [[acme.domains]]
  101. # main = "local3.com"
  102. # [[acme.domains]]
  103. # main = "local4.com"
  104. [[acme.domains]]
  105. main = "local1.com"
  106. sans = ["test1.local1.com", "test2.local1.com"]
  107. [[acme.domains]]
  108. main = "local3.com"
  109. [[acme.domains]]
  110. main = "local4.com"