用 Caddy2 搭建的 https 服务器

1,524 阅读1分钟

Caddy2 搭建web服务器

这里是用docker compose搭建caddy2,因此首先你要有docker的环境,并且会用dockerdocker compose

使用docker compose快速搭建

首先你要有docker的环境

ducker hub中搜索到caddy的官方镜像

👉 hub.docker.com/_/caddy?tab…

里面有docker compose的一个示例,如下:

version: "3.7"

services:
  caddy:
    image: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile
      - $PWD/site:/srv
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:

现在还不能直接docker compose up -d运行。

➡️ 首先在当前目录新建一个Caddyfile文件。Caddyfile是caddy的配置文件,这是它的文档👉 Caddyfile Tutorial — Caddy Documentation (caddyserver.com)

因为caddy的镜像中并没有/etc/caddy/Caddyfile这个文件,

docker会新建并挂载一个/etc/caddy/Caddyfile目录,但这是一个文件

➡️ 在Caddyfile中写入想让caddy做的事情,Caddyfile让我想到了Dockerfile,但Caddyfile很简单,比如写下(这里显式指定80端口是为了关闭caddy的自动https,目前不需要https)

localhost:80 # 为了关闭tls
respond "Hello World!"

➡️ 敲下docker compose up -d运行起来就行了。

输入curl localhost

你在命令行会看到输出Hello World

想让caddy做什么?

想让caddy干什么,写到Caddyfile里面就行了,Caddyfile很简单

举几个例子

👉 静态文件服务器

:80 # 是为了关闭默认的tls,请改为你自己的域名,比如 "example.com:80"

root * /srv/www
file_server

注意这个/srv是挂载在宿主机当前目录的/site下,所以我的静态文件放在$PWD/site/www/下面

👉 反向代理

:80

file_server
reverse_proxy 127.0.0.1:9005

关于revsere_proxy的请求匹配 ➡️ Request matchers (Caddyfile) — Caddy Documentation (caddyserver.com)

👉 路由转发

:80

route /api/* {
    uri replace /api/ 127.0.0.1:/api/v1/
    reverse_proxy 127.0.0.1:4000
}

route详细用法 ➡️ route (Caddyfile directive) — Caddy Documentation (caddyserver.com)

uri 的操作 ➡️ uri (Caddyfile directive) — Caddy Documentation (caddyserver.com)

👉 配置 https/tls/ssl

Caddy官网都说了它可以自动https(automatic HTTPS),这是它的一个很大的优势(相比于Nginx)

example.com # 你的域名,会自动将http请求重定向为https

tls youremail@example.com # 写下你的邮箱,会自动去 "let's encrypt" 申请ssl证书

respond "Hello World"

这样的话curl https://example.com,就会输出hello world。启动后前几次请求可能会失败,我推测是因为正在申请ssl证书。

当然也可以使用自己手动申请的ssl证书,只需要改动tls指令,很简单。

tls /path/example.pem /path/example.key # 前者为ssl证书路径,后者为公钥路径

注意证书和密钥要放在$PWD/site/目录或者其子目录下,因为这挂载在容器里面,容器可以访问。