静看光阴荏苒
不管不顾不问不说也不念

Traefik:现代的HTTP反向代理和负载均衡器

Traefik目前是一个在国外特别流行的HTTP反向代理和负载均衡器,可以看项目页面star高达27.3k:

https://github.com/containous/traefik

Traefik是Go开发的,有二进制文件可以直接用,但大多数情况下都是配合docker或者k8s使用。目前有两个主版本一个是最新的2.0,还有一个是1.7。这里我选择使用1.7,因为2.0版本的配置要比1.7复杂不少。

这篇文章主要介绍一下Traefik的反向代理,例如现在我们有这样一个需求:

在同一台服务器上,用docker部署wordpress/nextcloud等等其他很多web应用,这时候如何快速给这些容器绑定域名并配置SSL呢?Traefik的作用就体现出来了。

更详细的看看官方的这张示意图:

废话不多说,先安装docker:

apt -y update
apt -y install curl
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker

安装docker-compose:

curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装apache2-utils用于生成.htpasswd文件:

apt -y install apache2-utils

现在创建一个目录:

mkdir -p /opt/traefik

创建acme.json用于保存自动生成的ssl证书:

touch /opt/traefik/acme.json && chmod 600 /opt/traefik/acme.json

创建一个docker-compose.yml:

cd /opt/traefik
nano docker-compose.yml

在这个docker-compose内我们只运行traefik,下面是我的一个配置示例:

version: '3.5'

services:
    reverse-proxy:
      container_name: traefik
      image: traefik:v1.7
      command: --api --docker
      ports:
        - "80:80"
        - "443:443"
      networks:
        - traefik
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - /opt/traefik/traefik.toml:/traefik.toml
        - /opt/traefik/acme.json:/acme.json
        - /opt/traefik/.htpasswd:/.htpasswd
      labels:
        - "traefik.port=8080" 
        - "traefik.frontend.rule=Host:traefik.233.fi"
        - "traefik.frontend.auth.basic.usersFile=/.htpasswd"

networks:
    traefik:
      name: imlala

注意版本选择使用3.5或者以上,自3.5起可以在docker-compose内指定network的name。

如你所看到的,在这个docker-compose内我们创建了一个名为imlala的网络,同时让traefik使用这个网络,并且后续所有需要用到traefik的容器都使用这个网络。

labels下面配置了一个traefik的webui,如果不需要可以删除这些配置以及对应的卷。

接着生成.htpasswd文件(不需要webui可以省略这步):

htpasswd -c $(pwd)/.htpasswd imlala

现在创建traefik.toml配置文件:

nano traefik.toml

写入如下配置:

defaultEntryPoints = ["https","http"]

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
  [entryPoints.https.tls]

[acme]
email = "example@qq.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"

在这个配置内,我们会将80端口的流量全部重定向到443端口,同时使用acme自动为域名申请ssl证书。你只需要将example@qq.com修改为你自己的邮箱即可。

现在up起来即可:

docker-compose up -d

接下来我使用2个whoami容器演示traefik是如何工作的。

mkdir -p /opt/whoami
mkdir -p /opt/whoami2

在whoami目录内创建docker-compose.yml,写入如下配置:

version: '3.5'

services: 
  whoami:
    image: containous/whoami
    labels:
      - "traefik.frontend.rule=Host:whoami.233.fi"

networks:
  default:
    external:
      name: imlala

在whoami2目录内创建docker-compose.yml,写入如下配置:

version: '3.5'

services: 
  whoami:
    image: containous/whoami
    labels:
      - "traefik.frontend.rule=Host:whoami2.233.fi"

networks:
  default:
    external:
      name: imlala

可以看到只是简单的使用labels给不同的容器指定了不同的host,然后将这些容器的网络都加入到之前创建的imlala内即可。

将这两个容器up起来:

docker-compose up -d

访问这两个域名你可以看到每个域名都自动生成了SSL证书,并且对应指向了不同的容器:

以及:

在webui上可以看到前后端对应的关系:

健康状态:

赞(5)
未经允许不得转载:荒岛 » Traefik:现代的HTTP反向代理和负载均衡器
分享到: 更多 (0)

评论 9

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    这个跑起来稳定吗

    地皮5年前 (2020-02-10) Google Chrome 79.0.3945.136 Google Chrome 79.0.3945.136 Android 10 Android 10回复
    • 稳的一匹

      LALA5年前 (2020-02-10) Google Chrome 74.0.3729.169 Google Chrome 74.0.3729.169 Windows 10 x64 Edition Windows 10 x64 Edition回复
  2. #2

    大佬厉害,容器都直接写了 :mrgreen:

    欧文斯5年前 (2020-03-19) Google Chrome 80.0.3987.132 Google Chrome 80.0.3987.132 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 我菜的一批 :cry:

      LALA5年前 (2020-03-20) Google Chrome 74.0.3729.169 Google Chrome 74.0.3729.169 Windows 10 x64 Edition Windows 10 x64 Edition回复
  3. #3

    博主好,配置nextcloud时候原来有一个网络,加上这个反代网络,就是两个网络,那docker-compose.yml最后那个网络部分应该如何写?

    haofunny4年前 (2020-06-27) Google Chrome 83.0.4103.116 Google Chrome 83.0.4103.116 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • traefik需要和反代的应用在一个网络内,docker-compose的版本不同写法也有不同。。

      LALA4年前 (2020-06-30) Google Chrome 80.0.3987.163 Google Chrome 80.0.3987.163 Windows 10 x64 Edition Windows 10 x64 Edition回复
  4. #4

    容易上手,但是感觉配网盘工具(比如cloudreve)下载大文件(5G以上)下载到80%左右会中断,请教如何破?

    haofunny4年前 (2020-07-16) Google Chrome 84.0.4147.89 Google Chrome 84.0.4147.89 Windows 10 x64 Edition Windows 10 x64 Edition回复
    • 这个我还真没遇到过,也许不一定是Traefik的问题?

      LALA4年前 (2020-07-17) Google Chrome 83.0.4103.116 Google Chrome 83.0.4103.116 Windows 10 x64 Edition Windows 10 x64 Edition回复

分享创造快乐

广告合作资源投稿