[Docker]Traefik搭建日志

Traefik 是一個開源邊際路由,它能夠?qū)⒄埱蟾鶕?jù)不同的條件轉(zhuǎn)發(fā)給后端不同的服務(wù)。Traefik 和 Nginx 都可以用于反向代理,但是你可以說“Nginx反向代理服務(wù)器”,而不能說“Traefik反向代理服務(wù)器”,因為 Traefik 并沒有創(chuàng)建網(wǎng)站服務(wù)器的功能,它不能完全代替 Nginx。
Traefik 對 Docker 的支持非常強大,其中一個很方便的功能是它能夠自主發(fā)現(xiàn)后端的 Docker 服務(wù),進行反向代理的配置。這個功能是通過在創(chuàng)建容器的時候添加 "label" 參數(shù)(就是鍵值),Traefik 根據(jù) "label" 字符串自動配置。這樣無需像使用 Nginx 時頻繁修改配置文件。
本來這是一個很好的功能,label 字符串寫在容器的 compose.yaml 文件里很方便。但目前 unRAID 默認沒有 docker compose,使用過 unRAID 系統(tǒng)的都知道在容器創(chuàng)建界面里添加各種 label 屬性是極其繁瑣的,而且能被 Traefik 識別的 label 字符串很長,寫起來很難受。
網(wǎng)絡(luò)上的 Traefik 教程大部分都是結(jié)合 docker compose、docker.sock 和 label 來配置,個人感覺在 unRAID 系統(tǒng)下不方便,所以本篇搭建教程主要采用 File 動態(tài)文件來配置。我在 unRAID 系統(tǒng)和 Jetson Nano 下都使用過 Traefik,下文將介紹使用 Docker 和編譯好的可執(zhí)行文件兩種方式來搭建 Traefik 服務(wù)。
初始化配置文件
下載配置示例: traefik.sample.yml https://github.com/traefik/traefik/blob/master/traefik.sample.yml
這是用來測試 Traefik 運行的,只需簡單修改配置文件,在下面配置服務(wù)章節(jié)會使用到它。
Traefik安裝(Docker)
打開 unRAID 終端,創(chuàng)建 Traefik 配置文件目錄:
靜態(tài)配置文件
將上面的 traefik.sample.yml
示例上傳到主目錄 traefik
里,修改文件名為 traefik.yml
。這是靜態(tài)配置文件,先修改下面幾段配置:
創(chuàng)建容器
DOCKER > ADD CONTAINER
訪問 Traefik 儀表盤
在上文中已經(jīng)修改了靜態(tài)配置文件,開啟了儀表盤功能,所以訪問 http://[IP]:[PORT:8080]
即可打開 Traefik 儀表盤。
在 Linux 系統(tǒng)下使用編譯好的 Traefik 可執(zhí)行文件安裝,并且以系統(tǒng)服務(wù)啟動。筆者在 Jetson Nano 上的 Traefik 就是按下面步驟安裝的。
First, put the traefik binary in the system wide binary directory and give it appropriate ownership and permissions:
Give the traefik binary the ability to bind to privileged ports (e.g. 80, 443) as a non-root user:
Set up the user, group, and directories that will be needed:
Place your traefik configuration file ("traefik.yml") in the proper directory and give it appropriate ownership and permissions:
Install the systemd service unit configuration file, reload the systemd daemon, and start traefik:
Have the traefik service start automatically on boot if you like:
If traefik doesn't seem to start properly you can view the log data to help figure out what the problem is:
If your GNU/Linux distribution does not use journald with systemd then check any logfiles in /var/log
.
If you want to follow the latest logs from traefik you can do so like this:
配置Traefik
Traefik 支持很多種配置方式,網(wǎng)絡(luò)上的很多教程使用 Docker label 的方式配置,但我發(fā)現(xiàn)其有很多功能無法實現(xiàn),并且在 unRAID 下給每個容器寫 label 操作非常繁瑣。這里通過靜態(tài)配置文件和動態(tài)配置文件的方式來配置。
靜態(tài)配置文件
Traefik 啟動后默認會讀取 /etc/traefik/traefik.yml
進行初始化,這個文件就是它的靜態(tài)配置文件。Traefik 根據(jù)文件內(nèi)的元素開啟監(jiān)聽端口、連接后端服務(wù)、啟用關(guān)閉日志儀表盤等。這個配置文件不經(jīng)常改動,所以叫做“靜態(tài)配置文件”,如果修改了該文件的內(nèi)容,必須重啟 Traefik 才能使改動生效。
上文已經(jīng)根據(jù)示例生成過靜態(tài)配置文件了,其中幾個重要元素包括:
動態(tài)配置文件
動態(tài)配置文件存儲在指定的目錄中,它配置了從接收到客戶端請求到中間件預(yù)處理再到后端服務(wù)的整個流程。Traefik 提供了豐富的中間件和規(guī)則,可以滿足對請求的各種處理。
反向代理配置
下面是一個簡單的反向代理示例,后端服務(wù)是前幾篇文章中筆者搭建的 FileBrowserEx 文件管理器。
創(chuàng)建 FileBrowserEx 的動態(tài)配置文件:
編輯文件內(nèi)容:
簡單說明該配置文件的內(nèi)容:
動態(tài)配置文件默認是 YAML 格式的,按層級閱讀起來很清晰。首先,筆者定義了 http 協(xié)議下的一個路由 router,命名為 "FBE-http",監(jiān)聽 "web" 端口("web"已經(jīng)在靜態(tài)文件中定義,即80端口),規(guī)則是主機域名 "fbe.example.com",后端服務(wù)是 "FileBrowserEx"(這個服務(wù)也在下面定義),所有訪問該域名的請求都會轉(zhuǎn)發(fā)到 "FileBrowserEx" 服務(wù)上。然后,定義這個服務(wù),名稱 "FileBrowserEx",負載均衡服務(wù)器 servers 只有一個,就是后端的內(nèi)網(wǎng)地址 "http://192.168.1.110:19001/"。
這樣就完成了簡單的反向代理配置。Traefik 的動態(tài)配置還有很多的功能,比如:設(shè)置訪問密碼,IP地址黑白名單,網(wǎng)址路徑規(guī)則等等。可參看:File Configuration Reference。
Let's Encrypt 自動申請
要使用 Let's Encrypt 自動生成證書,需要使用 ACME 并在靜態(tài)配置中定義 certificatesResolvers,Traefik 將自動完成證書的申請。
使用 DNSPod 的話要添加環(huán)境變量 DNSPOD_API_KEY
在靜態(tài)配置文件中添加 certificatesResolvers
在動態(tài)配置文件中添加 certResolver
JSON格式的證書轉(zhuǎn)換為CRT普通證書文件
Traefik 自動申請的證書是以 JSON 文本格式存儲在 "/etc/traefik/acme/acme.json" 文件中的,筆者還有個群暉NAS,但群暉不支持導(dǎo)入JSON格式的證書,所以必須把 Traefik 的 JSON 證書文件轉(zhuǎn)換成普通證書文件。
這是筆者在 Github 上找到的開源倉庫:traefik-certs-dumper
同時監(jiān)聽http和https
從 Traefik v2 開始,在一個端口(entryPoints)開啟tls后,這個端口就只會接受https流量了,此時通過http訪問該端口的請求被忽略。要在同一個端口同時監(jiān)聽http和https則需要配置2個routers。
路徑規(guī)則
只匹配 "example.com" 域名下的 "/_matrix" 和 "/_synapse" 前綴的路徑規(guī)則:
MiddleWares
中間件(Middleware)是一種在請求發(fā)送到您的服務(wù)之前(或在服務(wù)的響應(yīng)傳回客戶端前)調(diào)整請求的方法。Traefik 中有幾個可用的中間件,有的可以修改請求、headers,有的負責重定向,有的添加認證等等。使用相同協(xié)議的中間件可以組合成鏈以適應(yīng)各種場景。
實現(xiàn)url重定向
使用 RedirectRegex
這個中間件方法來實現(xiàn) url 重定向功能(即 CODE 302)。
示例:
RedirectRegex
Reference
https://doc.traefik.io/traefik/
https://gist.github.com/ubergesundheit/7c9d875befc2d7bfd0bf43d8b3862d85
https://regex101.com/