反向代理快速入门
本指南将向你展示如何快速启动一个可用于生产环境的反向代理(可选择是否启用 HTTPS)。
先决条件:
- 基本的终端 / 命令行操作能力
- 已将
caddy放在你的 PATH 中 - 一个可供代理的后端运行进程
本教程假设你有一个在 127.0.0.1:9000 上运行的后端 HTTP 服务。以下命令适用于 Linux,但相同原理也适用于其他操作系统。
你可以在不使用配置文件的情况下快速运行一个简单的反向代理,或者使用配置文件以获得更多灵活性和控制。
命令行
要在本机上从端口 2080 启动一个到 9000 端口的明文 HTTP 代理:
caddy reverse-proxy --from :2080 --to :9000
然后尝试一下:
curl -v 127.0.0.1:2080
reverse-proxy 命令 用于快速且简便地设置反向代理。(如果你的需求很简单,也可以在生产环境中使用它。)
Caddyfile
在当前工作目录下,创建一个名为 Caddyfile 的文件,内容如下:
:2080
reverse_proxy :9000
该配置文件大致等同于上文的 caddy reverse-proxy 命令。
然后,在相同目录下运行:
caddy run
然后测试你的代理:
curl -v 127.0.0.1:2080
如果你更改了 Caddyfile,请确保 重新加载 Caddy。
这只是一个简单示例。你可以通过 reverse_proxy 指令 做更多事情。
从客户端到代理的 HTTPS
如果 Caddy 知道主机名(域名),它将自动且默认地为你的代理提供 HTTPS。如果你省略了 --from 标志,caddy reverse-proxy 命令会默认使用 localhost,或者你也可以在 Caddyfile 的第一行替换为代理的域名。
- 如果你使用
localhost或任何以.localhost结尾的域名,Caddy 将使用可自动续期的自签名证书。首次这样做时,Caddy 在尝试将其 CA 的根证书安装到你的信任存储时,可能会要求你输入密码。 - 如果你使用其他任何域名,Caddy 将尝试获取一个公开信任的证书;请确保你的 DNS 记录指向你的机器,并且端口 80 和 443 对外开放并指向 Caddy。
如果你没有指定端口,Caddy 在使用 HTTPS 时默认使用 443。此时你还需要有权限绑定低位端口。在 Linux 上有几种办法可行:
- 以 root 身份运行(例如
sudo -E)。 - 或运行
sudo setcap cap_net_bind_service=+ep $(which caddy),为 Caddy 授予该特定能力。
下面是最基本的提供 HTTPS 的 caddy reverse-proxy 命令:
caddy reverse-proxy --to :9000
然后尝试:
curl -v https://localhost
你可以使用 --from 标志自定义主机名:
caddy reverse-proxy --from example.com --to :9000
如果你没有权限绑定低位端口,你可以从更高的端口代理:
caddy reverse-proxy --from example.com:8443 --to :9000
如果你使用 Caddyfile,只需将第一行改为你的域名,例如:
example.com
reverse_proxy :9000
从代理到后端的 HTTPS
如果后端支持 TLS,Caddy 也可以在自身与后端之间使用 HTTPS 进行代理。只需在后端地址中使用 https://:
caddy reverse-proxy --from :2080 --to https://localhost:9000
这要求后端的证书被运行 Caddy 的系统信任。(Caddy 不会信任自签名证书,除非显式配置这样做。)
当然,你也可以在两端都使用 HTTPS:
caddy reverse-proxy --from example.com --to https://example.com:9000
这将在客户端到代理端、以及代理到后端之间都提供 HTTPS。
如果你要代理到的主机名与代理所使用的主机名不同,则需要使用 --change-host-header 标志:
caddy reverse-proxy \
--from example.com \
--to https://localhost:9000 \
--change-host-header
默认情况下,Caddy 会原样转发所有 HTTP 头,包括 Host,并且 Caddy 会从 Host 头推导 TLS 的 ServerName。--change-host-header 会将 Host 头重置为后端的 Host,以便 TLS 握手能够成功完成。在上例中,Host 会从 example.com 改为 localhost:9000(并且在 TLS 握手中使用 localhost)。