前言
作為一個天天學習的好同學,我相信你也一定知道Caddy
如果還不知道,可以自掛東南枝了=。=
簡單說一下優缺點吧
優點:備案過的域名可以自動簽證,無需單獨購買和配置https證書!配置簡單!性能高!
缺點:底層是go語言,網上相關資料特別是Caddyfile的配置案例比較少。
好了,話不多說。
今天我要分享的是用Caddy2做代理,以及做圖片服務器。
配置
首先,基於docker
第一步,在 /etc/caddy
目錄下創建Caddyfile
文件,並添加以下配置
www.aaaa.com {
log {
output stdout
}
file_server /images/* {
root /
}
reverse_proxy /aaa-api/* aaa-api:8081
reverse_proxy /bbb-admin/* bbb-admin:8080
tls aaa@163.com
}
創建容器
第二步,docker-compose創建caddy2容器以及你自己的項目容器
version: '2'
services:
#aaa-api
aaa-api:
container_name: aaa-api
image: aaa-api:v20211008001
restart: unless-stopped
networks:
- default
ports:
- "8081:8081"
volumes:
- "/data/www/market/images:/data/www/market/images"
environment:
spring_profiles_active: test
TZ: Asia/Shanghai
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
#bbb-admin
bbb-admin:
container_name: bbb-admin
image: bbb-admin:v20211008001
restart: unless-stopped
networks:
- default
volumes:
- "/data/www/market/images:/data/www/market/images"
ports:
- "8080:8080"
environment:
spring_profiles_active: test
TZ: Asia/Shanghai
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# caddy
caddy:
container_name: caddy
image: caddy
restart: unless-stopped
networks:
- default
environment:
ACME_AGREE: "true"
ports:
- "80:80"
- "443:443"
volumes:
- "/etc/caddy/Caddyfile:/etc/caddy/Caddyfile"
- "/data/www/market/images:/images"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
#mariadb
mariadb:
container_name: mariadb
image: mariadb
restart: unless-stopped
networks:
- default
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: market@33223344
volumes:
- "/data/mysql/data:/var/lib/mysql"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
#redis
redis:
container_name: redis
image: redis
restart: unless-stopped
networks:
- default
ports:
- "9987:6379"
volumes:
- "/data:/data/redis/data"
- "/data/redis/conf:/etc/redis"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
default:
driver: bridge
說明
重點說明一下caddy的配置:
1.關於代理,我的項目都有上下文路徑的,所以 reverse_proxy
代理后面匹配的是上下文路徑(注意一定要加/*),如:https://www.aaa.com/aaa-api/login.html,空格 后面接容器名和容器的啟動端口
2.關於圖片,我的訪問方式是:https://www.aaa.com/images/20211009/asdfasdf.jpg,所以file_server
后面匹配 /images/*
,root
則代表文件的根目錄,注意,這是caddy容器內的路徑,所以在添加caddy容器的時候需要映射你的圖片文件夾路徑到容器內,我的root /
是因為我把宿主機的圖片映射到了caddy容器內的 /images
2022.02.09補充,如果代理存在多個且存在無匹配校驗的代理,代理的邏輯是匹配最佳匹配項,在file_server匹配后,會繼續匹配無匹配項的代理,導致文件無法訪問404,所以需要使用@name標簽和not path 指令
www.aaaa.com {
log {
output stdout
}
file_server /images/* {
root /
}
reverse_proxy /aaa/* aaa-api:8081
reverse_proxy /bbb/* bbb-admin:8080
@path not path /images/* /aaa/* /bbb/*
reverse_proxy @path ccc-name
tls aaa@163.com
}
記錄:caddy的docker-compose
version: '2'
services:
caddy2:
container_name: caddy2
image: caddy
restart: on-failure
ports:
- "443:443"
- "443:443/udp"
- "80:80"
volumes:
- "/mnt/caddy2/config:/config"
- "/mnt/caddy2/Caddyfile:/etc/caddy/Caddyfile"
- "/mnt/caddy2/data:/data"
- "/data/www/cert:/cert"
networks:
- monitor
environment:
TZ: "Asia/Shanghai"
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"
networks:
monitor:
external:
name: myNetwork
總結
關於caddy2的簡單使用,我就主要提到了file_server
和 reverse_proxy
兩個指令。更多操作可以看看文檔:https://caddyserver.com/docs/
額外增加了 @name
not
path
三個指令。遇到問題還是多看官方文檔吧!很有用
瑞思拜!