OnlyTL

OnlyTL

Caddy:更现代、更易用的Web服务器和反向代理

2024-12-14
Caddy:更现代、更易用的Web服务器和反向代理

Caddy

一直以来,站点的Web服务器都使用的是nginx,结合nginx-proxy-manager管理使用,但是NPM莫名奇妙接口502,懒得去找问题了,直接转投Caddy,使用起来感觉比NPM更加简单。再见了nginx-proxy-manager。

介绍

Caddy 是一款现代化的、功能强大的 Web 服务器和反向代理,主要特点是 自动化 HTTPS(支持 Let's Encrypt 自动申请和续期 SSL/TLS 证书)。Caddy 是一个易于配置且功能丰富的 Web 服务器,它能够处理多种 Web 服务,包括静态文件托管、反向代理、负载均衡、API 网关等。

Caddy 与 Nginx Proxy Manager 的对比

Caddy 和 Nginx Proxy Manager(NPM)都是常见的反向代理和 Web 服务器工具,它们可以帮助用户将多个 Web 应用通过域名和 SSL 配置起来。以下是它们的一些对比:

特性CaddyNginx Proxy Manager
安装复杂度极其简单,支持自动 HTTPS 和零配置 SSL 证书安装复杂度较高,需要配置 Nginx、SSL 证书和反向代理规则
自动 SSL 证书自动与 Let's Encrypt 集成,支持自动申请和续期支持自动申请和续期证书,但配置更复杂
配置文件简单的 Caddyfile 配置文件,易于理解和编辑基于 Nginx 配置文件,配置较为复杂
代理支持反向代理,负载均衡,路由和 URL 重写等支持反向代理,且拥有图形化界面管理
性能优秀,尤其是在多域名和 HTTPS 处理上性能也不错,广泛用于高流量生产环境
扩展性基于 Go 语言的插件扩展,功能非常强大基于 Nginx 的模块化架构,功能灵活
使用场景适合个人网站、开发者和小型公司,自动化程度高适合需要图形化界面的用户,企业级 Web 应用

安装

docker-compose 安装

docker-compose.yml 文件

version: '3'

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"  # HTTP
      - "443:443"  # HTTPS
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile  # 挂载 Caddyfile
      - ./site:/srv # 将静态网站目录挂载到容器中的 /srv 目录
      - caddy_data:/data  # 用于存储 Caddy 生成的 SSL 证书
      - caddy_config:/config  # 用于存储 Caddy 配置

volumes:
  caddy_data:
  caddy_config:

配置

docker 中挂载了Caddyfile,所有配置都是基于此文件,与docker-compose.yml同级创建一个Caddyfile

  1. 配置静态站点

docker中已挂载 site 目录,所以将静态网站按照目录放置与site下并添加配置,其中www就是静态网站目录,此配置将访问www下的index.html。

yourdomain.com {
    root * /srv/www
    file_server
}
  1. 配置方向代理

由于caddy使用docker部署,如果其他项目也使用docker部署,可能不在同一个网络,所以ip地址建议填写宿主机内网ip。

yourdomain.com {
    reverse_proxy localhost:8080
    file_server  # 启用静态文件服务(如果你有静态资源
}
  1. 多个域名

直接添加不同的块

yourdomain.com {
    reverse_proxy localhost:8080
    file_server  # 启用静态文件服务(如果你有静态资源
}

yourdomain1.com {
    reverse_proxy localhost:8081
    file_server  # 启用静态文件服务(如果你有静态资源
}
  1. 负载均衡
yourdomain.com {
    reverse_proxy /api/* localhost:8081 localhost:8082
}
  1. 路径重写
yourdomain.com {
    rewrite /oldpath /newpath
    reverse_proxy localhost:8080
}