反向代理快速入门
本指南将向你展示如何快速启动并运行可用于生产的反向代理。
先决条件:
- 基本的终端/命令行技能
- 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握手成功。