反向代理快速入门
本指南将向你展示如何快速启动和运行一个生产就绪的反向代理,无论是否使用 HTTPS。
前置条件:
- 基本终端/命令行技能
caddy
已加入 PATH- 一个正在运行的后端进程用于代理
本教程假设你有一个后端 HTTP 服务运行在 127.0.0.1:9000
。这些命令适用于 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 默认使用 443 作为 HTTPS 端口。在这种情况下,你还需要有权限绑定到低端口。在 Linux 上有几种方法可以做到这一点:
- 以 root 身份运行(例如
sudo -E
)。 - 或者运行
sudo setcap cap_net_bind_service=+ep $(which caddy)
来给 Caddy 这个特定的权限。
这是最基本的 caddy reverse-proxy
命令,它给你提供 HTTPS:
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 头重置为后端的值,以便 TLS 握手可以成功完成。在上面的例子中,它会被从 example.com
更改为 localhost:9000
(并且在 TLS 握手中使用 localhost
)。