我願稱它為最強!Caddy2替代Nginx方案!


前言

作為一個天天學習的好同學,我相信你也一定知道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_serverreverse_proxy 兩個指令。更多操作可以看看文檔:https://caddyserver.com/docs/

額外增加了 @name not path三個指令。遇到問題還是多看官方文檔吧!很有用

瑞思拜!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM