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
相关推荐
还债大湿兄16 小时前
huggingface.co 下载有些要给权限的模型 小记录
开发语言·前端·javascript
叶落无痕5216 小时前
Electron应用自动化测试实例
前端·javascript·功能测试·测试工具·electron·单元测试
H@Z*rTE|i16 小时前
elementUi 当有弹窗的时候提示语被覆盖的问题
前端·javascript·elementui
阿奇__16 小时前
vue2+elementUI table多个字段排序
前端·javascript·elementui
行百里er16 小时前
一个还没写代码的开源项目,我先来“画个饼”:Spring Insight
后端·开源·github
hellokatewj17 小时前
React Hooks 全解:原理、API 与应用场景
前端·javascript·react.js
袋鱼不重17 小时前
保姆级教程:让 Cursor 编辑器突破地区限制,正常调用大模型(附配置 + 截图)
前端·后端·cursor
bieao17 小时前
Vite+Antd+Micro-app中iframe模式下样式闪烁的问题
前端
zhouzhouya17 小时前
码上星辰,人间烟火:我的2025
前端·程序员·代码规范
知行力17 小时前
【GitHub每日速递 20260108】告别云服务弊端,Memos隐私至上自托管笔记服务来袭!
笔记·github