文档
a project

反向代理快速入门

本指南将向您展示如何快速启动并运行生产就绪的、带或不带 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 将尝试获取公 trust 的证书;请确保您的 DNS 记录指向您的机器,并且端口 80 和 443 对公众开放并定向到 Caddy。

如果您未指定端口,则 Caddy 默认为 HTTPS 使用 443 端口。 在这种情况下,您还需要绑定到低端口的权限。 以下是在 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://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 标头重置为后端的标头,以便 TLS 握手可以成功完成。 在上面的示例中,它将从 example.com 更改为 localhost:9000(并且 localhost 将在 TLS 握手中使用)。