v2中文文档
项目

反向代理快速入门

本指南将向你展示如何快速启动并运行可用于生产的反向代理。

先决条件:

  • 基本的终端/命令行技能
  • PATH变量支持caddy
  • 要代理到的正在运行的后端进程

本教程假设你有一个运行在127.0.0.1:9000的HTTP后端服务。以下命令以Linux为例,其它操作系统原理相同。 你可以不使用配置文件快速启动反向代理,也可以使用配置文件获得更高灵活性和可控性。

命令行

要在本机上启动一个明文HTTP代理(从2080端口到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会使用自动续期的自签证书。首次使用时可能需要输入密码,以便将其CA根证书安装到系统信任库。
  • 使用其它域名时,Caddy会尝试申请公共信任证书;请确保DNS记录指向当前机器,并且80/443端口对公网开放并转发到Caddy。

如果未显式指定端口,HTTPS默认使用443,这要求你有绑定低端口的权限。在Linux上常见方式:

  • 以root运行(例如sudo -E)。
  • 或运行sudo setcap cap_net_bind_service=+ep $(which caddy)为Caddy授予该能力。

最基础的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所在系统信任(默认不会信任自签证书,除非显式配置)。

当然,也可以两端都用HTTPS:

caddy reverse-proxy --from example.com --to https://example.com:9000

如果“代理来源主机名”与“代理目标主机名”不同,需要加--change-host-header

caddy reverse-proxy \
	--from example.com \
	--to https://localhost:9000 \
	--change-host-header

默认情况下,Caddy会原样透传HTTP请求头(包括Host),且TLS握手中的ServerName默认来自Host头。--change-host-header会把Host改为后端主机名,以便TLS握手成功。