Blog

开始用 caddy 了

2026-05-09

#nginx
#caddy

这段时间 apt update 一直有一个 nginx 的 ppa 报 403 1,查了一下才发现 oerdnj 维护得心累了就删了

nginx 那些魔法一样的配置我一直都没太搞懂,我自己手上的这份大概是刚开始用 lnmp.org 时自动生成的(也可能是对照着 apache 配置改的,前 LLM 时代的东西记不清了),之后就在原始版本的基础上修修补补。反正这次都要换,干脆全换了的想法就自然冒出来了

这几年我已经把全部纯前端网站和低请求量 API 都搬到 serverless 上了,nginx 剩下工作只有反代 js 或者 go 的服务以及提供较大容量的静态资产文件访问,所以迁移也不会很复杂,跟 LLM 愉快聊天再自己翻翻文档补充就转换好了,下面放出混合了各种配置的样例;

CADDYFILE
# 我为了方便编辑 markdown 把全部 \t 换成四空格了

{
    auto_https off
    admin off
}

https://somepath.nest.moe, https://somepath2.nest.moe {
    # 我用 Cloudflare 反代,所以要放证书,前面关自动 https 也是这原因
    tls /abcdefg.crt /abcdefg.key

    log {
        output file /logs/abcdefg.log
    }

    # 删掉两个会暴露 caddy 的 header,虽然暴露了也没什么大不了的,但我不喜欢
    header {
        -Via
        -Server
        X-Frame-Options DENY
        X-Content-Type-Options nosniff
        X-Xss-Protection 1
    }

    # 用 route 主要是为了强制顺序检查
    ## 通过这里可以看出官方 twitter monitor 后端其实是一大堆细碎的服务组装起来的,跟开源版丢一起不同
    route {
        handle /static/* {
            root * /tmv3/apps/backend

            header {
                Cache-Control "public, max-age=31536000, immutable"
            }

            file_server
        }

        @twmedia {
            path /media /media/*
        }

        handle @twmedia {
            uri strip_prefix /media
            reverse_proxy 127.0.0.1:11111
        }

        @twitterVideo {
            path_regexp twitter ^/(amplify_video|ext_tw_video)/(.*)$
        }

        redir @twitterVideo /media/{re.twitter.1}/{re.twitter.2} 307

        # 唉,v4 做到一半胎死腹中……
        @wspush {
            path /online/api/v4/push/*
            header Connection *Upgrade*
            header Upgrade    websocket
        }

        handle @wspush {
            uri replace /online/api/v4/push /api
            reverse_proxy 127.0.0.1:22222
        }

        handle /online/api/v4/* {
            reverse_proxy 127.0.0.1:33333
        }

        handle {
            reverse_proxy 127.0.0.1:44444
        }
    }
}

https://anothersite.nest.moe {
    root * /var/www/notfun

    # 这是另一个下载站的
    @apks path *.apks
    header @apks Content-Type application/vnd.android.package-archive

    php_fastcgi unix//run/php/php8.4-fpm.sock {
        index index.php
        env PHP_ADMIN_VALUE "open_basedir=/var/www/notfun:/tmp/"
    }

    file_server

    @hidden {
        path /hidden /hidden/*
    }

    handle @hidden {
        basicauth * {
            user password # 这里需要自己去转换密码,读不了 .htpasses
        }
    }
}

Caddy 的自动续签证书我用不上,因为 Cloudflare 跟 CDN 通信用的都是很多很多年有效期自签证书 XD

默认配置很好,很多魔法配置都可以丢了,不会响应没配置的请求,以前用 nginx 默认会响应纯 ip 的请求,然后还会带上 Cloudflare 签的证书 2,导致 ip 暴露了相当长时间,直到我另外加了一块直接返回 444

目测法盯了一段时间的 top,内存占用比 nginx 高,但又不差这点,就这样吧

注释

  1. Err:6 https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu noble InRelease 403 Forbidden [IP: REDACTED 443]
  2. 没限制 ip 是我的问题,但默认配置漏响应不能全怪我吧

评论区