Caddy 自动HTTPS 反向代理、重定向、静态页面 - docker版

简介

Caddy 是一个通用的、易于使用的 Web 服务器,具有以下特点:

快速: Caddy 使用 Go 语言编写,以高性能著称。
安全: Caddy 支持 HTTPS、自动证书生成、HTTP/2 等安全功能。
易用: Caddy 的配置文件简单易懂,易于配置。
功能丰富: Caddy 支持多种功能,包括反向代理、负载均衡、缓存、日志记录等。
Caddy 可以用于各种场景,包括:

托管静态网站
托管 Web 应用
作为反向代理
作为负载均衡器
Caddy 可以运行在各种操作系统上,包括 Linux、Windows、macOS 等。

Caddy 与 Nginx 对比

特性CaddyNginx
语言GoC
性能接近 Nginx较高
内存占用较低较低
安全性支持 HTTPS、自动证书生成、HTTP/2支持 HTTPS、HTTP/2
易用性配置文件简单易懂配置文件语法复杂
功能支持反向代理、负载均衡、缓存、日志记录等支持反向代理、负载均衡、缓存、日志记录等
插件支持支持
社区活跃度较高较高

Caddy 的优势:

快速:Caddy 使用 Go 语言编写,以高性能著称。
安全:Caddy 支持 HTTPS、自动证书生成、HTTP/2 等安全功能。
易用:Caddy 的配置文件简单易懂,易于配置。
社区活跃:Caddy 社区活跃,可以获得及时帮助。
Nginx 的优势:

性能:Nginx 性能较高,在高负载情况下表现稳定。
功能丰富:Nginx 支持多种功能,可以满足复杂的需求。
社区活跃:Nginx 社区活跃,可以获得及时帮助。
Caddy 的劣势:

性能:Caddy 的性能略逊于 Nginx。
功能:Caddy 的功能略少于 Nginx。
Nginx 的劣势:

易用性:Nginx 的配置文件语法复杂,学习曲线较陡。
总结:

Caddy 和 Nginx 都是优秀的 Web 服务器。Caddy 的优势在于快速、安全、易用,适合中小网站和对性能要求不高的场景。Nginx 的优势在于性能高、功能丰富,适合大型网站和对性能要求高的场景。

选择 Caddy 还是 Nginx 取决于你的具体需求:

如果你的网站对性能要求不高,并且希望快速、安全、易于部署,那么 Caddy 是一个不错的选择。
如果你的网站对性能要求高,并且需要丰富的功能,那么 Nginx 是一个不错的选择。

使用 - docker版本

由于是使用docker进行操作的,所以需要提前安装好docker。

下面我会从简单到困难的顺序进行操作。

hello world

hello world这个例子是从caddy的docker hub官网拿的。我的docker版本是25,我当前所在目录为/home/web/test

拉取镜像

docker pull caddy

在这里插入图片描述
第一步:创建index.html
创建index.html并写入内容hello world

echo "hello world" > index.html

在这里插入图片描述

第二步:启动容器

docker run -d --name=caddy -p 80:80 \
    -v $PWD/index.html:/usr/share/caddy/index.html \
    -v caddy_data:/data \
    caddy

在这里插入图片描述
第三步:测试

本地测试:curl http://localhost/,出现hello world表示成功。
在这里插入图片描述浏览器测试:浏览器窗口输入服务器IP
在这里插入图片描述测试成功。

配置IP访问的静态页面

配置IP访问的静态页面和上面hello world差不多。区别就是Caddyfile文件是使用自定义的,hello world是使用默认的Caddyfile。index.html文件就是静态页面。

由于上面已经启动了caddy容器,如果需要继续下去的话可以删除容器。

docker rm -f caddy

第一步:创建Caddyfile

vim Caddyfile

输入上面的命令之后,会进入vim编辑页面,按i键进入编辑模式,粘贴以下内容

http:// {
    root * /usr/share/caddy
    encode gzip
    file_server
}

在这里插入图片描述按Esc键后输入:wq回车保存退出。
在这里插入图片描述
第二步:编写静态页面内容

为了和hello world区分开来,改一下静态页面的内容。
改成如下所示:
在这里插入图片描述

第三步:运行容器

下面我把caddy中的data目录挂载到主机的/data/caddy/data方便以后有需求要下载证书文件。

docker run -d --name=caddy -p 80:80 -p 443:443 -p 443:443/udp -v $PWD/Caddyfile:/etc/caddy/Caddyfile -v $PWD/index.html:/usr/share/caddy/index.html -v /data/caddy/data:/data  --restart=always caddy:latest

在这里插入图片描述第四步:测试

浏览器输入服务器IP。
在这里插入图片描述

配置带域名的静态页面

上面的还是通过IP的方式去访问静态页的。如何通过域名的方式去访问静态页呢?
只需在Caddyfile配置就行。

注意:小伙伴需要做测试学习,最好找一个国外的服务器,现在国内的服务器做域名解析需要备案才能使用。

下面是阿里云的通知:
在这里插入图片描述

第一步:修改Caddyfile
Caddyfile里面填写自己的域名,位置我有注释。

# Caddyfile 配置文件

# 全局配置

http:// {
  # 根目录,指向所有静态文件的根目录
  # 这里设置为 `/usr/share/caddy`
  root * /usr/share/caddy

  # 启用 gzip 压缩
  encode gzip

  # 启用文件服务器功能
  file_server
}

# 虚拟主机配置
# 下面的域名填写自己解析的域名 - 注意
caddy.xxxxx.fun {
  root * /usr/share/caddy
  # 启用 gzip 压缩
  encode gzip
  # 启用文件服务器功能
  file_server
}

为了区分我再次修改静态页面的内容
在这里插入图片描述

修改好之后直接重启caddy即可。
第二步:重启caddy

docker restart caddy

第三步:测试
在浏览器输入域名,回车。
在这里插入图片描述并且可以看到caddy为我们自动申请了证书。

在这里插入图片描述

配置带域名的反向代理

为了测试,我在服务器上启动了一个服务,http://localhost:19850/端口为19850,现在我需要使用caddy去反向代理到19850这个服务。
在这里插入图片描述

第一步:修改Caddyfile

配置中需要填写自己的服务器IP

# Caddyfile 配置文件

# 虚拟主机配置
# 下面的域名修改为自己的 - 注意
caddy.xxxxxxx.fun {
  # 反向代理配置
  # 将所有请求转发到 服务器IP:19850 地址 - 注意
  reverse_proxy 服务器IP:19850
  # 启用 gzip 压缩
  encode gzip
}

第二步:重启caddy

docker restart caddy

第三步:测试

可以看到通过caddy的反代,成功访问19850端口的服务。
在这里插入图片描述

配置带域名的重定向

第一步:修改Caddyfile

重定向到百度。

# Caddyfile 配置文件

# 虚拟主机配置

caddy.xxxx.fun {
  # 重定向所有请求到 https://baidu.com
  # 将请求的 URI 路径附加到 https://baidu.com 之后,并将其作为新的目标 URL 进行重定向
  redir https://baidu.com{uri}
}

重定向所有请求: 将所有请求重定向到 https://baidu.com。
{uri} 表示请求的 URI 路径。例如,如果请求的 URL 是 https://caddy.xxxx.fun/hello/world,那么 {uri} 的值为 /hello/world。
重定向后的 URL 将是 https://baidu.com{uri}。例如,如果请求的 URL 是 https://caddy.xxxx.fun/hello/world,那么重定向后的 URL 将是 https://baidu.com/hello/world。

第二步:重启caddy
第三步:测试

在这里插入图片描述

踩坑

80、443端口未开放导致证书申请失败

查看日志日过证书申请失败的话。

当Caddy在Docker容器中运行时,它尝试通过标准的HTTP和HTTPS端口(即80和443端口)来验证域名所有权。如果Docker容器的80端口和443端口没有正确暴露给外部访问,Caddy在尝试验证域名时会失败,导致证书申请失败。

<think>嗯,用户想了解如何配置反向代理。我需要先确定他们对反向代理的基本概念是否清楚,可能需要先简单解释一下什么是反向代理,然后再进入配置步骤。不过用户可能已经有一定了解,所以直接进入步骤可能更合适。 首先,反向代理的常见用途是什么?比如负载均衡、SSL终止、缓存静态内容或者隐藏后端服务器。用户可能有不同的使用场景,比如部署Web应用,提高安全性,或者优化性能。需要考虑到不同的情况,给出通用的步骤,但也要提到可能的变数。 接下来,配置反向代理通常涉及哪些软件?最常见的是Nginx和Apache,可能还需要提一下其他工具,比如Caddy,但重点放在Nginx和Apache上,因为它们是使用最广泛的。用户可能对其中一个更熟悉,所以分开讲解比较合适。 然后,具体步骤。比如安装服务器软件,修改配置文件,设置代理参数,测试配置,重启服务。每个步骤需要详细说明,但又要简洁,避免让用户感到冗杂。例如,Nginx的配置需要编辑sites-available里的文件,设置server块,配置location和proxy_pass。Apache则需要启用代理模块,在VirtualHost里使用ProxyPass指令。 还要注意SSL配置,因为现在很多网站都要求HTTPS。可能需要提到申请SSL证书,比如Let's Encrypt,然后配置监听443端口,并设置SSL相关参数。这部分可以作为可选步骤,但建议用户实施以增强安全性。 另外,常见的配置参数有哪些?比如proxy_set_header传递主机头,或者缓冲设置,这些对于后端应用正确接收请求很重要。用户可能需要了解这些参数的作用,以避免出现比如后端获取不到真实IP的问题。 最后,测试和故障排查。比如检查配置文件语法,重启服务,查看日志。用户可能会遇到配置错误,如何定位问题?比如Nginx的nginx -t,或者查看error.log。这些步骤能帮助用户自行解决问题。 可能需要提醒用户根据实际环境调整,比如后端服务器的IP和端口,域名替换等。还有防火墙设置,比如开放80和443端口,确保流量不被拦截。 总结一下,结构应该是:介绍反向代理的作用,然后分Nginx和Apache的配置步骤,包括SSL配置,常见参数说明,最后测试和排查方法。确保用中文,步骤清晰,代码示例正确,符合LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,但这个问题可能不太涉及数学公式,所以可能不需要太多LaTeX,但如果有变量或路径,可能需要用代码块或者引号标注。</think>配置反向代理的步骤如下,以常见服务器软件Nginx和Apache为例: ### 一、反向代理的作用 1. 隐藏后端服务器信息 2. 实现负载均衡 3. 提供SSL终端 4. 缓存静态资源 5. 实现路径重写 ### 二、Nginx配置示例 ```nginx server { listen 80; server_name example.com; # 基础代理配置 location / { proxy_pass http://backend_server:8080; # 后端服务器地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 可选SSL配置 listen 443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/privkey.pem; } ``` ### 三、Apache配置步骤 1. 启用代理模块 ```bash sudo a2enmod proxy proxy_http ``` 2. 修改虚拟主机配置 ```apache <VirtualHost *:80> ServerName example.com ProxyPass "/" "http://backend_server:8080/" ProxyPassReverse "/" "http://backend_server:8080/" # 请求头传递 RequestHeader set X-Forwarded-Proto "http" </VirtualHost> ``` ### 四、关键配置参数说明 | 参数 | 作用 | |----------------------|-----------------------------| | `proxy_pass` | 指定后端服务器地址 | | `proxy_set_header` | 传递客户端原始请求头信息 | | `proxy_buffering` | 控制响应缓冲(默认on) | | `proxy_redirect` | 重写后端返回的重定向地址 | ### 五、配置验证流程 1. 检查语法 ```bash # Nginx sudo nginx -t # Apache sudo apachectl configtest ``` 2. 重载服务 ```bash # Nginx sudo systemctl reload nginx # Apache sudo systemctl reload apache2 ``` 3. 测试访问 ```bash curl -I http://example.com ``` ### 六、高级配置建议 1. 负载均衡:通过`upstream`模块配置多台后端服务器 2. 缓存策略:对静态资源设置`proxy_cache` 3. 安全加固:配置`proxy_hide_header`隐藏敏感头信息 4. 超时控制:设置`proxy_connect_timeout`等参数 ### 七、故障排查要点 1. 检查防火墙是否开放端口 2. 查看服务器错误日志 ```bash # Nginx tail -f /var/log/nginx/error.log # Apache tail -f /var/log/apache2/error.log ``` 3. 验证DNS解析是否正确 4. 测试后端服务是否独立可达 实际配置时需替换: - `example.com` ➔ 您的域名 - `backend_server:8080` ➔ 真实后端地址 - 证书路径 ➔ 实际证书存放位置 建议首次配置后使用`curl -v`命令验证请求头传递和响应是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值