caddy搭建反向代理

本指南将向您展示如何快速搭建一个生产级的反向代理,无论是否使用 HTTPS。

前提条件:

  • 基本的终端/命令行操作技能

  • caddy
     命令已在您的系统路径(PATH)中

  • 一个正在运行的后端服务,用于代理

本教程假设您有一个后端 HTTP 服务运行在 127.0.0.1:9000
。以下命令适用于 Linux 系统,但相同的原则也适用于其他操作系统。

您可以不使用配置文件来运行一个简单的反向代理,也可以使用配置文件以获得更多的灵活性和控制能力。

命令行

要启动一个从端口 2080 到端口 9000 的明文 HTTP 代理,请运行以下命令:

1
2
3
4
caddy reverse-proxy --from :2080 --to :9000
```

然后测试它:

curl -v 127.0.0.1:2080

1
2
3
4
5
6
7
  
reverse-proxy
 命令用于快速搭建反向代理。如果您的需求简单,也可以在生产环境中使用它。
## Caddyfile

在当前工作目录下,创建一个名为 Caddyfile
 的文件,内容如下:

:2080reverse_proxy :9000

1
2
3
4
5
  
这个配置文件大致相当于上面的 caddy reverse-proxy
 命令。

然后,在同一个目录下运行以下命令:

caddy run

1
2
  
接着测试您的代理:

curl -v 127.0.0.1:2080

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  
如果您修改了 Caddyfile,请确保重新加载 Caddy。

这只是一个简单的示例。您可以使用 reverse_proxy
 指令做更多的事情。
## 从客户端到代理的 HTTPS

如果 Caddy 知道主机名(域名),它会默认自动启用 HTTPS 来提供代理服务。caddy reverse-proxy
 命令在省略 --from
 标志时,默认会使用 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

1
2
  
然后测试它:

curl -v https://localhost

1
2
3
  
您可以使用 --from
 标志自定义主机名:

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

1
2
  
如果您没有权限绑定低端口,可以使用更高端口进行代理:

caddy reverse-proxy --from example.com:8443 --to :9000

1
2
  
如果您使用 Caddyfile,只需将第一行改为您的域名,例如:

example.comreverse_proxy :9000

1
2
3
4
## 从代理到后端的 HTTPS  

如果后端支持 TLS,Caddy 也可以使用 HTTPS 在自身与后端之间进行代理。只需在后端地址中使用 https://

caddy reverse-proxy --from :2080 --to https://localhost:9000

1
2
3
4
  
这要求后端的证书被 Caddy 所运行的系统所信任。(除非明确配置,否则 Caddy 不信任自签名证书。)

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

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

1
2
3
4
5
  
这将从客户端到代理以及从代理到后端都启用 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  
)。  
  
  

![江达小记](/images/wechatmpscan.png)