小驿搭建(五)——从Nginx到Caddy

9/15/2024 服务部署CaddyAcme

# HTTPS之路

HTTPS是现代网站必备的,通过SSL加密,可以保证网站的安全,防止数据被窃取和篡改。在Chrome等现代浏览器中,如果一个网站没有使用HTTPS,那么浏览器会提示用户该网站不安全。

此前,我使用Nginx作为服务反向代理的网关,但是Nginx的证书配置一直是个问题,加上现在SSL证书有效期越来越短,而证书申请(比如各种云、容器化的nginx+ACME.sh)越来越麻烦,经过一番折腾,我决定使用Caddy来代替Nginx,来减少证书配置的麻烦。

# 搭建Caddy服务器

Caddy是一个基于Go的Web服务器,它支持自动申请和续期SSL证书,并且配置简单,只需要一个配置文件即可。Caddy的配置文件使用Caddyfile格式,非常简单易懂。Caddy的官方文档也非常详细,可以参考官方文档 (opens new window)

搭建Caddy时,使用docker compose也非常方便,只需要按照官方文档在docker-compose.yml文件中配置一个Caddyfile的volume及静态文件服务的volume即可。以下是一个简单的docker-compose.yml文件示例:

version: '3'
services:
  caddy:
    image: caddy:2
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./static:/srv
    restart: unless-stopped

其中,Caddyfile是Caddy的配置文件,static是静态文件服务的目录。

# 配置Caddy

Caddy的配置文件Caddyfile非常简单,只需要指定网站的域名和对应的静态文件目录即可。以下是一个简单的Caddyfile示例:

example.com {
    root * /srv
    file_server

    reverse_proxy /api localhost:8080
}

其中,example.com是网站的域名,/srv是静态文件服务的目录。reverse_proxy是反向代理的配置,将/api路径的请求转发到本地的8080端口。借助各类LLM的提示,我们可以较为快速地完成Caddyfile的编写,降低负担。

# 自动申请和续期SSL证书

Caddy支持自动申请和续期SSL证书,但需要满足一些条件:

  • 服务器有公网IP
  • 对应的端口(80、443)能够访问
  • 服务器能够访问Let's Encrypt的API
  • 服务器能够访问域名对应的DNS解析记录

如果满足以上条件,只需要在Caddyfile中添加以下配置即可:

{
    # 自动从Let's Encrypt获取SSL证书(假设你的服务器有公网IP并且满足条件)
    email example@example.com
    acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

其中,email是你用于在Let's Encrypt注册证书的邮箱,acme_ca是Let's Encrypt的API地址。这里的staging是测试环境,下发的证书是无效(主要用于测试、防止正式环境被滥用或限流)的,正式环境请使用https://acme-v02.api.letsencrypt.org/directory。

# 总结

Caddy是一个非常好的Web服务器,它支持自动申请和续期SSL证书,并且配置简单,只需要一个配置文件即可。如果你正在使用Nginx作为Web服务器,并且遇到了证书配置的麻烦,那么Caddy是一个非常好的替代品。笔者通过Caddy,成功地将博客从Nginx迁移到了Caddy,并且享受到了自动申请和续期SSL证书的便利。