反向代理快速入门
本指南将向您展示如何快速启动一个生产就绪的反向代理,无论是否使用 HTTPS。
先决条件
- 基本的终端/命令行技能
caddy
在您的 PATH 中- 一个正在运行的后端进程以代理到
本教程假设您有一个后端 HTTP 服务在 127.0.0.1:9000
上运行。这些命令适用于 Linux,但相同的原理也适用于其他操作系统。
您可以使用或不使用配置文件来运行一个简单的反向代理。
命令行
要从您的机器上的端口 2080 启动一个明文 HTTP 代理到端口 9000
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。caddy reverse-proxy
命令如果省略 --from
标志,将默认使用 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://127.0.0.1
您可以使用 --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://127.0.0.1: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://127.0.0.1:9000 \
--change-host-header
默认情况下,Caddy 会将所有 HTTP 标头原封不动地传递,包括 Host
,并且 Caddy 会从 Host 标头中推导出 TLS ServerName。--change-host-header
将 Host 标头重置为后端的 Host 标头,以便 TLS 握手能够成功完成。在上面的示例中,它将从 example.com
更改为 localhost:9000
(并且 localhost
将在 TLS 握手过程中使用)。