反向代理

一个系统可能有一堆服务器,一台服务器上可能运行着一堆服务。反代是一种中间件,将不同请求转发到不同服务上,兼顾了加密,负载均衡等。more

Nginx 是老牌反代大哥,具有成熟的社区和强大的性能。而 caddy 等新起之秀主要聚焦于易用性,例如配置项更简洁、自动签证书和 https 重定向等。

caddy

caddy 是一个更年轻的工具,提供非常简单的语法和自动 https(自动签证书)。

能有多简单呢,例如我需要部署一个静态站点(用于 vps 伪装),只需要在 /etc/caddy/Caddyfile 中写入:

text
<域名> {
  root * <(静态) 资源路径>
  file_server
}

然后启动 caddy 服务即可。

这个配置文件可以将 http 自动重定向到 https,并且不用自己签证书。

如果要用自己的证书就加一句 tls <crt> <key> 即可。

而我在 nginx 上得自己用 acme.sh 签证书,然后写一大坨的配置文件,还得去看看 nginx 命令行用法,signal 有哪些,才能把我的网站搞好。

反代也很简单,只需将 file_server 换成 reverse_proxy :8000(端口号)。

caddy 最大的问题是性能较差,因此不适合在高并发环境下使用。这里性能差的一个较大来源是 go 运行时的负担。

dir server

有时候我们可能会想要把一个目录给 share 出去,可以在网页上探索这个目录并且下载文件。一般的做法是 python -m http.server,不过如果需要 https 的话可能就比较麻烦。而 caddy 支持一个配置把 folder share 出去:

handle_path /share/* {
  root * /var/share
  file_server browse
}

这样访问 /share/ 就是展示文件夹下内容,/share/some_file 就是下载文件。caddy 的 browse 界面还挺好看的。

注意最好别 share /root 等地方的内容:caddy 运行默认没有 root 权限,访问会 403。

日志

caddy 默认将日志输出 stderr,可以用 journalctl 查看。但也可以将其输出至文件,或者按域名分流日志等。

json
{
  log default {
    output file <file_path>
  }
}

更具体的应用请参考文档:log 参数 | 全局 log default。

观察日志可以了解到一些 caddy 的机制:

其他资料

Nginx

虽然 Nginx 的配置一直比较劝退,但是在当前 AI 时代倒也没有那么困难,不要抱有排斥心理()。

缺点

Several features that are free (in caddy) which cost money in nginx. :(

nginx 的 quic 还是 module。 NGINX now officially supports HTTP/3 with QUIC. It is available as part of NGINX 1.25.1 mainline version for open source users and NGINX Plus R30 for enterprise customers.

配置

原理

Nginx 采用 Master-Worker 模型,唯一的 Master 线程控制所有 Worker 线程对数据进行处理。每个 Worker 内部都有一个基于 event loop 的 async runtime,可以对大量连接进行处理。

Angie

Nginx 的 fork,支持 HTTP/3 和自动 acme 更新 证书。

遇到的问题

caddy 无法建立连接

我想开一个 file server,静态文件没有任何问题(就是我的 blog)。然而 caddy 开了以后一访问就是 js 执行错误。我也用 nginx 试了一下,是可用的。

手动 caddy run 却是好的,可能是 service 出了问题。

ERR_ADDRESS_UNREACHABLE

用 caddy 和 nginx 都试了一遍,浏览器访问 ERR_ADDRESS_UNREACHABLE,本地访问 403,说明不是防火墙的问题。nginx 有报错 13: Permission denied,然后搜一下发现需要 chmod +x <root>。加了以后还是没用,原来 root 的全路径都需要 chmod +x。。问题解决。

external

  1. reddit: Caddy vs Nginx: How Do These Web Servers / Reverse Proxies Compare?
  2. Why Caddy 2 over NGINX
  3. NGINX and the "Power of Two Choices" Load-Balancing Algorithm