Caddy Web服务器初体验:简洁高效的现代选择

Caddy简介

Caddy是一款使用Go语言编写的开源Web服务器和反向代理服务器,旨在提供易于使用且高效的性能。它支持HTTP/HTTPS协议,并可作为反向代理服务器、负载均衡器和WebSocket支持等。Caddy的灵活性和模块化架构使其适合容器化环境和微服务架构。

Caddy的主要特点

  1. 默认启用HTTPS:Caddy集成了Let's Encrypt,可以自动申请、更新和管理SSL证书,无需额外操作。
  2. 配置简洁:Caddy的配置文件(Caddyfile)简洁易读,降低了新手的学习成本。
  3. 动态配置管理:通过REST API,可以在运行时更改Caddy的配置,无需重新启动服务器。
  4. 现代化特性:支持Prometheus metrics,使用结构化的JSON作为访问日志。

Caddy与Nginx的对比

特性 Caddy Nginx
配置方式 Caddyfile, JSON, REST API Nginx配置文件(nginx.conf)
自动HTTPS支持 是,默认启用自动TLS证书管理 否,需手动配置SSL证书
适用范围 7层(应用层),反向代理和Web服务,内置负载均衡 支持4层(传输层)和7层(应用层)反向代理、负载均衡等
扩展性 插件化架构,支持扩展 模块化架构,支持静态编译的模块
性能 较高(适合轻量应用) 非常高(适合高并发应用)
配置简洁性 Caddyfile格式简洁,易于上手 配置相对复杂,灵活但不够直观
系统资源占用 较低 较低,适合高并发处理
编写语言 Go语言 C语言
Access日志格式 结构化,默认JSON格式,支持自定义 非结构化,默认标准日志格式,支持自定义

Caddy的基本用法

安装方式

  1. 二进制安装:下载Caddy的二进制文件并移动到PATH下即可使用。
  2. Docker Compose安装:使用Docker容器快速部署Caddy。

Docker Compose配置示例:

yml 复制代码
version: "3.8"
services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    environment:
      - ACME_AGREE=true

volumes:
  caddy_data:
  caddy_config:

配置方式

  1. Caddyfile配置:简洁易读的配置文件。
  2. JSON配置:适合高级使用场景和动态配置。
  3. REST API配置:动态管理和变更配置。

Caddyfile示例:

caddyfile 复制代码
example.com {
    reverse_proxy 127.0.0.1:3000
    log {
        output file /var/log/caddy/access.log {
            mode 644
        }
        format json
    }
}

JSON配置示例:

json 复制代码
{
  "apps": {
    "http": {
      "servers": {
        "example": {
          "listen": [":80"],
          "routes": [
            {
              "match": [
                {
                  "host": ["example.com"]
                }
              ],
              "handle": [
                {
                  "handler": "static_response",
                  "body": "Hello, world!"
                }
              ]
            }
          ]
        }
      }
    }
  }
}

常见配置示例

  1. 直接回复:

    caddyfile 复制代码
    localhost:2017 {
        respond "Hello, world!"
    }
  2. 配置静态文件:

    caddyfile 复制代码
    localhost:2016 {
        root * /var/www/mysite
        file_server {
            browse
            hide .git
            precompressed zstd br gzip
        }
    }
  3. 配置反向代理:

    caddyfile 复制代码
    example.com {
        reverse_proxy localhost:8000
    }
  4. 配置负载均衡:

    caddyfile 复制代码
    example.com {
        reverse_proxy / backend1.example.com backend2.example.com
    }

Caddy的持久化存储

  1. 配置文件:自定义配置文件需要放置在合理的位置。
  2. 数据目录:用于存储TLS证书和其他关键数据。
  3. 配置目录:保存最后一次有效的配置。

在使用Docker容器时,需要挂载这些目录以确保数据持久化。

yml 复制代码
volumes:
  - ./Caddyfile:/etc/caddy/Caddyfile
  - caddy_data:/data
  - caddy_config:/config
相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
晨米酱3 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端