技术文档收录
ASCII
Tcpdump
IPV4保留地址段
深入理解以太网网线原理 - 三帛的世界
Linux
WireGuard 一键安装脚本 | 秋水逸冰
SSH Config 那些你所知道和不知道的事 | Deepzz's Blog
Linux 让终端走代理的几种方法
ubuntu 20.04 server 版设置静态 IP 地址 - 链滴
Linux 挂载 Windows 共享磁盘的方法 - 技术学堂
将 SMB/CIFS 网络硬盘永久的挂载到 Ubuntu 上 - 简书
linux 获取当前脚本的绝对路径 | aimuke
[Linux] Linux 使用 / dev/urandom 生成随机数 - piaohua's blog
Linux 生成随机数的多种方法 | Just Do It
Linux 的 Centos7 版本下忘记 root 或者普通用户密码怎么办?
Git 强制拉取覆盖本地
SSH 安全加固指南 - FreeBuf 网络安全行业门户
Linux 系统安全强化指南 - FreeBuf 网络安全行业门户
Linux 入侵排查 - FreeBuf 网络安全行业门户
sshd_config 配置详解 - 简书
SSH 权限详解 - SegmentFault 思否
CentOS 安装 node.js 环境 - SegmentFault 思否
如何在 CentOS 7 上安装 Node.js 和 npm | myfreax
几款 ping tcping 工具总结
OpenVpn 搭建教程 | Jesse's home
openvpn 一键安装脚本 - 那片云
OpenVPN 解决 每小时断线一次 - 爱开源
OpenVPN 路由设置 – 凤曦的小窝
OpenVPN 设置非全局代理 - 镜子的记录簿
TinyProxy 使用帮助 - 简书
Ubuntu 下使用 TinyProxy 搭建代理 HTTP 服务器_Linux_运维开发网_运维开发技术经验分享
Linux 软件包管理工具 Snap 常用命令 - 简书
linux systemd 参数详解
Systemd 入门教程:命令篇 - 阮一峰的网络日志
记一次 Linux 木马清除过程
rtty:在任何地方通过 Web 访问您的终端
02 . Ansible 高级用法 (运维开发篇)
终于搞懂了服务器为啥产生大量的 TIME_WAIT!
巧妙的 Linux 命令,再来 6 个!
77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
运维工程师必备:请收好 Linux 网络命令集锦
一份阿里员工的 Java 问题排查工具单
肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收
作业调度算法(FCFS,SJF,优先级调度,时间片轮转,多级反馈队列) | The Blog Of WaiterXiaoYY
看了这篇还不会 Linux 性能分析和优化,你来打我
2019 运维技能风向标
更安全的 rm 命令,保护重要数据
求你了,别再纠结线程池大小了!
Linux sudo 详解 | 失落的乐章
重启大法好!线上常见问题排查手册
sudo 使用 - 笨鸟教程的博客 | BY BenderFly
shell 在手分析服务器日志不愁? - SegmentFault 思否
sudo 与 visudo 的超细用法说明_陈发哥 007 的技术博客_51CTO 博客
ESXI 下无损扩展 Linux 硬盘空间 | Naonao Blog
Linux 学习记录:su 和 sudo | Juntao Tan 的个人博客
使用者身份切换 | Linux 系统教程(笔记)
你会使用 Linux 编辑器 vim 吗?
在 Windows、Linux 和 Mac 上查看 Wi-Fi 密码
linux 隐藏你的 crontab 后门 - 简书
Linux 定时任务详解 - Tr0y's Blog
linux 的 TCP 连接数量最大不能超过 65535 个吗,那服务器是如何应对百万千万的并发的?_一口 Linux 的博客 - CSDN 博客_tcp 连接数多少正常
万字长文 + 28 张图,一次性说清楚 TCP,运维必藏
为什么 p2p 模式的 tunnel 底层通常用 udp 而不是 tcp?
记一次服务器被入侵挖矿 - tlanyan
shell 判断一个变量是否为空方法总结 - 腾讯云开发者社区 - 腾讯云
系统安装包管理工具 | Escape
编译代码时动态地链接库 - 51CTO.COM
甲骨文 Oracle Cloud 添加新端口开放的方法 - WirelessLink 社区
腾讯云 Ubuntu 添加 swap 分区的方法_弓弧名家_玄真君的博客 - CSDN 博客
Oracle 开放全部端口并关闭防火墙 - 清~ 幽殇
谁再说不熟悉 Linux 命令, 就把这个给他扔过去!
即插即用,运维工程师必会正则表达式大全
Shell脚本编写及常见面试题
Samba 文件共享服务器
到底一台服务器上最多能创建多少个 TCP 连接 | plantegg
SSH 密钥登录 - SSH 教程 - 网道
在 Bash 中进行 encodeURIComponent/decodeURIComponent | Harttle Land
使用 Shell 脚本来处理 JSON - Tom CzHen's Blog
Docker
「Docker」 - 保存镜像 - 知乎
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
私有镜像仓库选型:Harbor VS Quay - 乐金明的博客 | Robin Blog
exec 与 entrypoint 使用脚本 | Mr.Cheng
Dockerfile 中的 CMD 与 ENTRYPOINT
使用 Docker 配置 MySQL 主从数据库 - 墨天轮
Alpine vs Distroless vs Busybox – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
再见,Docker!
docker save 与 docker export 的区别 - jingsam
如何优雅的关闭容器
docker 储存之 tmpfs 、bind-mounts、volume | 陌小路的个人博客
Dockerfile 中 VOLUME 与 docker -v 的区别是什么 - 开发技术 - 亿速云
理解 docker 容器的退出码 | Vermouth | 博客 | docker | k8s | python | go | 开发
【Docker 那些事儿】容器监控系统,来自 Docker 的暴击_飞向星的客机的博客 - CSDN 博客
【云原生】Docker 镜像详细讲解_微枫 Micromaple 的博客 - CSDN 博客_registry-mirrors
【云原生】Helm 架构和基础语法详解
CMD 和 Entrypoint 命令使用变量的用法
实时查看容器日志 - 苏洋博客
Traefik 2 使用指南,愉悦的开发体验 - 苏洋博客
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
【云原生】镜像构建实战操作(Dockerfile)
Docker Compose 中的 links 和 depends_on 的区别 - 编程知识 - 白鹭情
Python
Pipenv:新一代Python项目环境与依赖管理工具 - 知乎
Python list 列表实现栈和队列
Python 各种排序 | Lesley's blog
Python 中使用 dateutil 模块解析时间 - SegmentFault 思否
一个小破网站,居然比 Python 官网还牛逼
Python 打包 exe 的王炸 - Nuitka
Django - - 基础 - - Django ORM 常用查询语法及进阶
[Python] 小知識:== 和 is 的差異 - Clay-Technology World
Window
批处理中分割字符串 | 网络进行时
Windows 批处理基础命令学习 - 简书
在Windows上设置WireGuard
Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
windows 重启 rdpclip.exe 的脚本
中间件
Nginx 中的 Rewrite 的重定向配置与实践
RabbitMQ 的监控
RabbitMq 最全的性能调优笔记 - SegmentFault 思否
为什么不建议生产用 Redis 主从模式?
高性能消息中间件——NATS
详解:Nginx 反代实现 Kibana 登录认证功能
分布式系统关注点:仅需这一篇,吃透 “负载均衡” 妥妥的
仅需这一篇,妥妥的吃透” 负载均衡”
基于 nginx 实现上游服务器动态自动上下线——不需 reload
Nginx 学习书单整理
最常见的日志收集架构(ELK Stack)
分布式之 elk 日志架构的演进
CAT 3.0 开源发布,支持多语言客户端及多项性能提升
Kafka 如何做到 1 秒处理 1500 万条消息?
Grafana 与 Kibana
ELK 日志系统之通用应用程序日志接入方案
ELK 简易 Nginx 日志系统搭建: ElasticSearch+Kibana+Filebeat
记一次 Redis 连接池问题引发的 RST
把 Redis 当作队列来用,你好大的胆子……
Redis 最佳实践:业务层面和运维层面优化
Redis 为什么变慢了?常见延迟问题定位与分析
好饭不怕晚,扒一下 Redis 配置文件的底 Ku
rabbitmq 集群搭建以及万级并发下的性能调优
别再问我 Redis 内存满了该怎么办了
Nginx 状态监控及日志分析
uWSGI 的安装及配置详解
uwsgi 异常服务器内存 cpu 爆满优化思路
Uwsgi 内存占用过多 - 简书
Nginx 的 limit 模块
Nginx 内置模块简介
Redis 忽然变慢了如何排查并解决?_redis_码哥字节_InfoQ 写作社区
领导:谁再用 redis 过期监听实现关闭订单,立马滚蛋!
Nginx 限制 IP 访问频率以及白名单配置_问轩博客
Nginx $remote_addr 和 $proxy_add_x_forwarded_for 变量详解
Caddy 部署实践
一文搞定 Nginx 限流
数据库
SqlServer 将数据库中的表复制到另一个数据库_MsSql_脚本之家
SQL Server 数据库同步,订阅、发布、复制、跨服务器
sql server 无法删除本地发布 | 辉克's Blog
SQLite全文检索
SQL 重复记录查询的几种方法 - 简书
SQL SERVER 使用订阅发布同步数据库(转)
Mysql 查看用户连接数配置及每个 IP 的请求情况 - 墨天轮
优化 SQL 的 21 条方案
SQL Server 连接时好时坏的奇怪问题
MS SQL 执行大脚本文件时,提示 “内存不足” 的解决办法 - 阿里云开发者社区
防火墙-iptables
iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链
防火墙 iptables 企业防火墙之 iptables
Linux 防火墙 ufw 简介
在 Ubuntu 中用 UFW 配置防火墙
在 Ubuntu20.04 上怎样使用 UFW 配置防火墙 - 技术库存网
监控类
开箱即用的 Prometheus 告警规则集
prometheus☞搭建 | zyh
docker 部署 Prometheus 监控服务器及容器并发送告警 | chris'wang
PromQL 常用命令 | LRF 成长记
prometheus 中使用 python 手写 webhook 完成告警
持续集成CI/CD
GitHub Actions 的应用场景 | 记录干杯
GithubActions · Mr.li's Blog
工具类
GitHub 中的开源网络广告杀手,十分钟快速提升网络性能
SSH-Auditor:一款 SHH 弱密码探测工具
别再找了,Github 热门开源富文本编辑器,最实用的都在这里了 - srcmini
我最喜欢的 CLI 工具
推荐几款 Redis 可视化工具
内网代理工具与检测方法研究
环境篇:数据同步工具 DataX
全能系统监控工具 dstat
常用 Web 安全扫描工具合集
给你一款利器!轻松生成 Nginx 配置文件
教程类
Centos7 搭建神器 openvpn | 运维随笔
搭建 umami 收集个人网站统计数据 | Reorx’s Forge
openvpn安装教程
基于 gitea+drone 完成小团队的 CI/CD - 德国粗茶淡饭
将颜色应用于交替行或列
VMware Workstation 全系列合集 精简安装注册版 支持 SLIC2.6、MSDM、OSX 更新 16.2.3_虚拟机讨论区_安全区 卡饭论坛 - 互助分享 - 大气谦和!
在 OpenVPN 上启用 AD+Google Authenticator 认证 | 运维烂笔头
Github 进行 fork 后如何与原仓库同步:重新 fork 很省事,但不如反复练习版本合并 · Issue #67 · selfteaching/the-craft-of-selfteaching
卧槽,VPN 又断开了!!- 阿里云开发者社区
Grafana Loki 学习之踩坑记
zerotier 的 planet 服务器(根服务器)的搭建踩坑记。无需 zerotier 官网账号。
阿里云 qcow2 镜像转 vmdk,导入 ESXi - 唐际忠的博客
Caddy 入门 – 又见杜梨树
【Caddy2】最新 Caddy2 配置文件解析 - Billyme 的博客
Web 服务器 Caddy 2 | Haven200
手把手教你打造高效的 Kubernetes 命令行终端
Keras 作者:给软件开发者的 33 条黄金法则
超详细的网络抓包神器 Tcpdump 使用指南
使用 fail2ban 和 FirewallD 黑名单保护你的系统
linux 下 mysql 数据库单向同步配置方法分享 (Mysql)
MySQL 快速删除大量数据(千万级别)的几种实践方案
GitHub 上的优质 Linux 开源项目,真滴牛逼!
WireGuard 教程:使用 Netmaker 来管理 WireGuard 的配置 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Nebula Graph 的 Ansible 实践
改进你的 Ansible 剧本的 4 行代码
Caddy 2 快速简单安装配置教程 – 高玩梁的博客
切换至 Caddy2 | 某不科学的博客
Caddy2 简明教程 - bleem
树莓派安装 OpenWrt 突破校园网限制 | Asttear's Blog
OpenVPN 路由设置 – 凤曦的小窝
个性化编译 LEDE 固件
盘点各种 Windows/Office 激活工具
[VirtualBox] 1、NAT 模式下端口映射
VirtualBox 虚拟机安装 openwrt 供本机使用
NUC 折腾笔记 - 安装 ESXi 7 - 苏洋博客
锐捷、赛尔认证 MentoHUST - Ubuntu 中文
How Do I Use A Client Certificate And Private Key From The IOS Keychain? | OpenVPN
比特记事簿: 笔记: 使用电信 TR069 内网架设 WireGuard 隧道异地组网
利用 GitHub API 获取最新 Releases 的版本号 | 这是只兔子
docsify - 生成文档网站简单使用教程 - SegmentFault 思否
【干货】Chrome 插件 (扩展) 开发全攻略 - 好记的博客
一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
【计算机网络】了解内网、外网、宽带、带宽、流量、网速_墩墩分墩 - CSDN 博客
mac-ssh 配置 | Sail
如何科学管理你的密码
VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信 | Shao Guoliang 的博客
CentOS7 配置网卡为静态 IP,如果你还学不会那真的没有办法了!
laisky-blog: 近期折腾 tailscale 的一些心得
使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书 · Ruby China
acme 申请 Let’s Encrypt 泛域名 SSL 证书
从 nginx 迁移到 caddy
使用 Caddy 替代 Nginx,全站升级 https,配置更加简单 - Diamond-Blog
http.proxy - Caddy 中文文档
动手撸个 Caddy(二)| Caddy 命令行参数最全教程 | 飞雪无情的总结
Caddy | 学习笔记 - ijayer
Caddy 代理 SpringBoot Fatjar 应用上传静态资源
使用 graylog3.0 收集 open××× 日志进行审计_年轻人,少吐槽,多搬砖的技术博客_51CTO 博客
提高国内访问 github 速度的 9 种方法! - SegmentFault 思否
VM16 安装 macOS 全网最详细
2022 目前三种有效加速国内 Github
How to install MariaDB on Alpine Linux | LibreByte
局域网内电脑 - ipad 文件共享的三种方法 | 岚
多机共享键鼠软件横向测评 - 尚弟的小笔记
VLOG | ESXI 如何升级到最新版,无论是 6.5 还是 6.7 版本都可以顺滑升级。 – Vedio Talk - VLOG、科技、生活、乐分享
远程修改 ESXi 6.7 管理 IP 地址 - 腾讯云开发者社区 - 腾讯云
几乎不要钱自制远程 PLC 路由器方案
traefik 简易入门 | 个人服务器运维指南 | 山月行
更完善的 Docker + Traefik 使用方案 - 苏洋博客
MicroSD·TF 卡终极探秘 ·MLC 颗粒之谜 1 三星篇_microSD 存储卡_什么值得买
macOS 绕过公证和应用签名方法 - 走客
MiscSecNotes / 内网端口转发及穿透. md at master · JnuSimba/MiscSecNotes
我有特别的 DNS 配置和使用技巧 | Sukka's Blog
SEO:初学者完整指南
通过 OpenVPN 实现流量审计
OpenVPN-HOWTO
OpenVPN Server · Devops Roadmap
Linux 运维必备的 13 款实用工具, 拿好了~
linux 平台下 Tomcat 的安装与优化
Linux 运维跳槽必备的 40 道面试精华题
Bash 脚本进阶,经典用法及其案例 - alonghub - 博客园
推荐几个非常不错的富文本编辑器 - 走看看
在 JS 文件中加载 JS 文件的方法 - 月光博客
#JavaScript 根据需要动态加载脚本并设置自定义参数
笔记本电脑 BIOS 修改及刷写教程
跨平台加密 DNS 和广告过滤 personalDNSfilter · LinuxTOY
AdGuard Home 安装及使用指北
通过 Amazon S3 协议挂载 OSS
记一次云主机如何挂载对象存储
本文档发布于https://mrdoc.fun
-
+
首页
Web 服务器 Caddy 2 | Haven200
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.shixuen.com](https://www.shixuen.com/zh-CN/linux/services_web_caddy_v2.html) [![](https://www.shixuen.com/zh-CN/uploads/title/services_web_caddy_v2_title.jpg)](https://www.shixuen.com/zh-CN/uploads/title/services_web_caddy_v2_title.jpg "Stop, COVID-19") [Stop, COVID-19](https://www.shixuen.com/zh-CN/uploads/title/services_web_caddy_v2_title.jpg "Stop, COVID-19") 因 COVID-19 的原因,终于有了空余时间来升级 [Caddy](https://caddyserver.com/)。[Caddy V2](https://caddyserver.com/) 完全被重构了,与 [Caddy v1](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy.html) 区别非常大,说是两款软件也不为过,所以 [Caddy V2](https://caddyserver.com/)不兼容 [Caddy V1](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy.html) 的插件和配置文件。与其按照官网的步骤去手动升级配置文件,还不如按 [Caddy V2](https://caddyserver.com/)的格式重新写来得方便。 我们需要从 [Caddy 下载页面](https://caddyserver.com/download)下载 [Caddy V2](https://caddyserver.com/),并将下载的可执行文件放在我们系统的 `PATH` 中。 可以在 [Caddy 下载页面](https://caddyserver.com/download)获取不同系统或 CPU 架构的可执行文件。同 [Caddy v1](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy.html) 时一样,此页面可以让我们自定义带有不同插件的 [Caddy V2](https://caddyserver.com/)。 [](#a-debian-ubuntu-raspbian "A. Debian,Ubuntu,Raspbian")A. Debian,Ubuntu,Raspbian ---------------------------------------------------------------------------------- 我们可以使用 `apt-get` 命令来安装 [Caddy](https://caddyserver.com/),然后下载 [caddy.service](https://github.com/caddyserver/dist/raw/master/init/caddy.service)文件,使用 `systemd` 来启动 [Caddy](https://caddyserver.com/)。 ``` sudo apt-get install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/gpg/gpg.155B6D79CA56EA34.key' | sudo apt-key add - curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/setup/config.deb.txt?distro=debian&version=any-version' | sudo tee -a /etc/apt/sources.list.d/caddy-stable.list sudo apt-get update sudo apt-get install caddy ``` 也可以自 [Caddy 下载页面](https://caddyserver.com/download)手动下载包含第三方插件的可执行文件,然后将它放在 `PATH` 下(如 `/usr/local/bin/`),方便我们运行。 ``` :~$ curl -o ~/Downloads/caddy "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fmholt%2Fcaddy-webdav&idempotency=79680512439698" :~$ sudo mv ~/Downloads/caddy /usr/local/bin :~$ chmod +x /usr/local/bin/caddy ``` [](#b-docker "B. Docker")B. Docker ---------------------------------- 按照下面的步骤来安装 [caddy](https://caddyserver.com/)服务。 * **要求**: * `caddy` 可执行文件已经下载完成 * `systemctl --version` 版本高于 232 * `sudo` 权限 将我们下载的 [caddy](https://caddyserver.com/)可执行文件放在 `$PATH` 下,并确认可以被执行。 ``` :~$ sudo mv caddy /usr/local/bin && sudo chmod +x /usr/local/bin/caddy :~$ caddy version v2.3.0 h1:fnrqJLa3G5vfxcxmOH/+kJOcunPLhSBnjgIvjXV/QTA= ``` 创建名为 `caddy` 的用户组 ``` :~$ sudo groupadd --system caddy ``` 创建名为 `caddy` 的用户,并且带有一个可以写入的用户目录。 ``` sudo useradd --system \ --gid caddy \ --create-home \ --home-dir /var/lib/caddy \ --shell /usr/sbin/nologin \ --comment "Caddy web server" \ caddy ``` **注意**: 如果使用了 [caddy](https://caddyserver.com/)的配置文件,**必须**确保此文件是可以被用户 `caddy` 可读的。 下一步,创建 `systemd` 服务的配置文件。 [Github-Caddy.service](https://github.com/caddyserver/dist/raw/master/init/caddy.service) ``` :~$ sudo cat > /lib/systemd/system/caddy.service << EOF # caddy.service # # For using Caddy with a config file. # # Make sure the ExecStart and ExecReload commands are correct # for your installation. # # See https://caddyserver.com/docs/install for instructions. # # WARNING: This service does not use the --resume flag, so if you # use the API to make changes, they will be overwritten by the # Caddyfile next time the service is restarted. If you intend to # use Caddy's API to configure it, add the --resume flag to the # caddy run command or use the caddy-api.service file instead. [Unit] Description=Caddy Documentation=https://caddyserver.com/docs/ After=network.target network-online.target Requires=network-online.target [Service] User=caddy Group=caddy ExecStart=/usr/local/bin/caddy run --environ --config /etc/caddy/Caddyfile ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile TimeoutStopSec=5s LimitNOFILE=1048576 LimitNPROC=512 PrivateTmp=true ProtectSystem=full AmbientCapabilities=CAP_NET_BIND_SERVICE [Install] WantedBy=multi-user.target EOF :~$ sudo systemctl daemon-reload ``` 最后,我们就可以使用下面的命令来运行 `caddy` 了。 ``` :~$ sudo systemctl start caddy ``` 此时,[Caddy](https://caddyserver.com/)的日志被重定向到了 `journalctl` 中,使用下面命令来查看运行日志 ``` :~$ sudo journalctl -u caddy --no-pager | less ``` [](#php "PHP")PHP ----------------- ``` { http_port 80 https_port 443 servers :443 { protocol { experimental_http3 } } servers :80 { protocol { allow_h2c } } } h5ai.shixuen.com { root * /var/www/media tls haven200@haven200.com file_server php_fastcgi unix//run/php/php7.4-fpm.sock @redirected { not path /_h5ai/* path */ } rewrite @redirected /_h5ai/public/index.php ``` ### [](#php-fastcgi "php_fastcgi")php_fastcgi 此指令将指定的请求发送给 PHP FastCGI 服务,如 `php-fpm`。 ``` php_fastcgi 127.0.0.1:9000 php_fastcgi /blog/* 127.0.0.1:9000 php_fastcgi unix//run/php/php7.4-fpm.sock ``` [](#webdav "WebDav")WebDav -------------------------- ``` { http_port 80 https_port 443 servers :443 { protocol { experimental_http3 } } servers :80 { protocol { allow_h2c } } } webdav.shixuen.com { root * /var/www/webdav route { webdav /* { root /var/www/webdav } file_server } basicauth { test JDJhJDE0JEloaFFCbzBMZG94d1J6ZUVaRWE2ZS5xUkQ2WmM0Y0VlV2lpbmxNRVhESVVvSkZZSTU2TTZL } } ``` 此功能需要第三方插件 `http.handlers.webdav` 支持。且此插件**只提供**了 `webdav` 最基本的读取功能,**不支持**写入。 ``` :~$ caddy list-modules | grep webdav http.handlers.webdav :~$ ``` [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 是一种方便人类阅读的格式。因为它易写、易理解,所以多数人们都喜欢用它来配置 [Caddy](https://caddyserver.com/)。 [](#概念 "概念")概念 -------------- [Caddy-Docs-Concepts](https://caddyserver.com/docs/caddyfile/concepts) ### [](#结构 "结构")结构 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 文件的结构如下图: [![](https://www.shixuen.com/zh-CN/uploads/images/services_web_caddy_v2_01.png)](https://www.shixuen.com/zh-CN/uploads/images/services_web_caddy_v2_01.png "Caddyfile's structure") [Caddyfile's structure](https://www.shixuen.com/zh-CN/uploads/images/services_web_caddy_v2_01.png "Caddyfile's structure") 重点: * ** 全局选项 (global options block)** 必须在文件的最顶端即开头处,此为可选,即配置文件中可以没有它。 * 如果 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 中**不包含**全局选项 (Global options),那么它的第一行(非注释行)**必须**是网站地址,即网站的域名。 * 所有指令 (directives) 和匹配器 (matchers) **必须**处于站点配置里,即 `{ }` 里。 * 如果 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 中**仅**配置了一个网站,那么它的 `{ }` 是可以省略的。 [](#全局选项-global-options "全局选项(Global Options)")全局选项 (Global Options) -------------------------------------------------------------------- [Caddy-Docs-Global Options](https://caddyserver.com/docs/caddyfile/options) [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 可让您指定全局应用的选项。 一些选项作为默认值,而其他选项则可以定义 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 适配器的行为。 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 的最顶部可以是全局选项块。 ``` { http_port 80 https_port 443 servers :443 { protocol { experimental_http3 } } servers :80 { protocol { allow_h2c } } } ``` 在 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 中,全局选项**只能**有一个**且必须**位于文件的开始处。 * http_port: 指定服务器的 HTTP 端口。仅限内部使用,并不会改变客户端的 HTTP 端口。默认为 80。 * https_port: 指定服务器的 HTTPS 端口。仅限服务器内部使用,并不会改变客户端的 HTTPS 端口。默认为 443。 * server: 自定义跨多个站点的 HTTP 服务端的设置,因为这个功能无法在站点块中正确配置。 * protocol * allow_h2c: 启用 H2C(“明文 HTTP / 2” 或 “ H2 over TCP”)支持,如果客户端支持,它将通过 TCP 协议来传输明文 HTTP/2。 此设置仅适用于未加密的 HTTP 协议。 * experimental_http3: 启用 HTTP/3 实验性支持。 注意,HTTP/3 暂时并不是一个完整的规范,并且客户端的支持也非常有限。将来该选项会被舍弃。 [](#请求匹配器-request-matchers "请求匹配器(Request Matchers)")请求匹配器 (Request Matchers) ----------------------------------------------------------------------------- 请求匹配器可按特定条件筛选 (或分类) 请求。 在 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 中,紧随指令之后的匹配 (matcher) 标记可以限制该指令的范围。 匹配器标记可以是以下形式之一: 1. 通配符 (Wildcard matchers): * 匹配所有请求 (默认). 2. 路径 (Path matchers): /path 以 `/` 开头来匹配请求的路径。 3. 名称 (Named matchers): @name 以 `@`开头来定义一个名称匹配器。 ### [](#通配符-wildcard-matchers "通配符(Wildcard matchers)")通配符 (Wildcard matchers) 通配符 `*` 来匹配所有请求,且仅当需要匹配标识时时才使用。 ``` root * /var/www/mysite root /foo/* /var/www/a ``` ### [](#路径-path-matchers "路径(Path matchers)")路径 (Path matchers) 由于按路径匹配非常常见,因此可以内联单个路径匹配器,如下所示: ``` redir /old.html /new.html ``` 路径匹配的标识**必须**以正斜杠 `/` 开头。 默认情况下路径匹配是路径完全匹配;进行前缀匹配必须附加 `*`。注意,`/foo*` 将匹配 `/foo` 和 `/foo/` 以及 `/foobar`;实际上我们可能需要的是 `/foo/*`。 ### [](#名称匹配-named-matchers "名称匹配(Named matchers)")名称匹配 (Named matchers) 所有不是路径或通配符的匹配器**必须**命名为名称匹配器。 定义具有唯一名称的匹配器可使您更灵活,允许您将任何可用的匹配器组合到一个集合中: ``` @name { ... } @name ... ``` 例子: ``` @websockets { header Connection *Upgrade* header Upgrade websocket } reverse_proxy @websockets localhost:6001 ``` 此代理**仅**代理名为 “Connection” 的字段(值包含单词 “Upgrade”)和名为 “Upgrade” 的字段(值为 “websocket”)的请求。 与指令一样,名称匹配器**只能**在使用它们的站点块内部进行定义。 名称匹配器定义了一个匹配器集。匹配集里的单个匹配器之间执行 AND 操作,即所有的都必须匹配到。例如,如果匹配集合中同时有指令 (header) 和路径匹配器,则两者都必须匹配。 ### [](#标准匹配器-standard-matchers "标准匹配器(Standard matchers)")标准匹配器 (Standard matchers) * [expression](https://caddyserver.com/docs/caddyfile/matchers#expression) * [file](https://caddyserver.com/docs/caddyfile/matchers#file) * [header](https://caddyserver.com/docs/caddyfile/matchers#header) * [header_regexp](https://caddyserver.com/docs/caddyfile/matchers#header-regexp) * [host](https://caddyserver.com/docs/caddyfile/matchers#host) * [method](https://caddyserver.com/docs/caddyfile/matchers#method) * [not](https://caddyserver.com/docs/caddyfile/matchers#not) * [path](https://caddyserver.com/docs/caddyfile/matchers#path) * [path_regexp](https://caddyserver.com/docs/caddyfile/matchers#path-regexp) * [protocol](https://caddyserver.com/docs/caddyfile/matchers#protocol) * [query](https://caddyserver.com/docs/caddyfile/matchers#query) * [remote_ip](https://caddyserver.com/docs/caddyfile/matchers#remote-ip) ``` header <field> [<value>] ``` 对请求里 `header` 参数进行匹配。 * `<field>` 需要检查的 HTTP 头部字段的名字。 * 如果它的前缀为`!`,则表示 HTTP 头部**不允许**包含此字段。 * `<value>` 为该字段需要匹配的值。 * 如果它的前缀为 `*`,则表示进行前缀模糊匹配。 * 如果它的后缀为 `*`,则表示进行后缀模糊匹配。 * 如果被 `*` 包围,则表示进行字符串模糊匹配。 * 其它情况,则进行精准匹配。 同一个 `header` 下的字段之间进行 ** 与 (AND)** 操作,多个 `header` 之间进行`或(or)` 操作。 ##### [](#例1 "例1")例 1 对 HTTP 头部的 `Connection`**与** `server` 字段进行匹配: * `Connection` 字段值需包含 `Upgrade` * `server` 字段的值必须为 `Caddy` 最后匹配结果进行`与(and)` 操作。 ``` @foo { header { Connection *Upgrade* server Caddy } } ``` ##### [](#例2 "例2")例 2 HTTP 头部 `Foo` 字段的值是否为 `bar`**或**`baz` ``` @foo { header Foo bar header Foo baz } ``` ##### [](#例3 "例3")例 3 HTTP 头部**不能包含**名为 `Foo` 的字段。 ``` @not_foo { header !Foo } ``` #### [](#method "method")method 对 HTTP 的请求方式进行匹配,如 POST / GET /DELETE。请求方式**必须**为大写,如 `POST`。可以同时匹配多个请求方式。 匹配多个请求方式时,这些请求方式之间进行`或(or)` 操作。 ``` method GET method PUT DELETE ``` #### [](#not "not")not ``` not <any other matcher> not { <any other matcher> } ``` 将匹配的结果进行`非`操作。 ##### [](#例1-1 "例1")例 1 匹配不包含以 `/css/` **或** `/js/` 开头的请求路径。 这里的`或` 是 `path` 匹配器里的,而非 `not` 匹配器 ##### [](#例2-1 "例2")例 2 对 HTTP 请求进行匹配: * 不以 `/api/` 开头的路径,**或** * 请求方式不为 `POST` ``` not path /api/* not method POST ``` ##### [](#例3-1 "例3")例 3 同时对 HTTP 请求的多个内容进行匹配: * 请求路径不以 `/api/` 开头的,**和** * 请求方法不为 `POST` 的 ``` not { path /api/* method POST } ``` #### [](#path "path")path 对 HTTP 请求的 `URI` 进行匹配,一般进行精准匹配,使用 `*` 时可以进行模糊匹配: * `*` 在后面,进行后缀模糊匹配,如 `/prefix/*` * `*` 在前面,则进行前缀模糊匹配,如 `*.suffix` * `*` 在两边,则进行子字符串精确匹配,如 `*/contains/*` * `*` 在中间,则两边精确匹配中间模糊匹配,如 `/accounts/*/info` 多个路径匹配器之间进行`或(or)` 操作。 [](#指令 "指令")指令 -------------- 下面列表的指令为 [Caddy](https://caddyserver.com/)的自有指令,可以用在 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 中。 ### [](#指令执行优先级 "指令执行优先级")指令执行优先级 HTTP 处理链被许多指令操控着。这些指令执行的优先级非常重要,因此 [Caddy](https://caddyserver.com/)在其内部为这些指令定义了一套默认的优先级: ``` map root header request_body redir rewrite uri try_files basicauth request_header encode templates handle handle_path route push respond metrics reverse_proxy php_fastcgi file_server acme_server ``` 我们可以使用 `route` 指令或在全局选项中使用 `order` 来重新定义指令执行时的优先级。 ### [](#log "log")log 允许和设置 HTTP 请求的访问日志。 `log` 指令在 [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) 站点块里进行使用,而非其它地方。 ``` log { output <writer_module> ... format <encoder_module> ... level <level> } ``` * `output`: 设置日志记录的位置。默认: stderr * `stderr`: 控制台的标准错误通道(默认选项)。 * `stdout`: 控制台的标准输出通道。 * `discard`: 无日志输出。 * `file`: 输出至指定的文本文件。为了防止硬盘空间耗尽默认对日志文件进行轮换。 * `net`: 网络套接接口。 * `format`: 对日志进行编码或格式化。默认: 如果检测到 stdout 是终端则为 console 格式,否则为 json 格式。 * `console`: 对每条日志按 console 格式进行编码以使其易于人类阅读,同时也保留下了某些结构。 * `json`: 对每条日志按 JSON 结构进行格式化。 * `single_field`: 仅在日志条目中写入单个字段。对于其中一个字段已经包含我们所需的信息时很有用。 * `filter`: 定义一个日志编码格式,允许按字段进行过滤。 * `delete`: 在对日志进行编码时删除指定字段。 * `ip_mask`: 在字段中将 IP 地址模糊化处理。 * `level`: 设置日志的等级。 默认等级:INFO #### [](#例子 "例子")例子 ``` example.com { root /var/www/ ... log { format single_field common_log } } example.com { log { output file /var/log/caddy.log { roll_size 100mb roll_keep 5 roll_keep_for 720h } format filter { wrap console fields { request>headers>Authorization delete } } } } ``` ### [](#basicauth "Basicauth")Basicauth [basicauth](https://caddyserver.com/docs/caddyfile/directives/basicauth), Enables HTTP Basic Authentication, which can be used to protect directories and files with a username and hashed password. **Note that basic auth is not secure over plain HTTP.** Caddy configuration **does not accept** plaintext passwords; we **MUST** hash them before putting them into the configuration. The caddy hash-password command can help with this. ``` :~$ caddy hash-password Enter password: test Confirm password: test JDJhJDE0JEloaFFCbzBMZG94d1J6ZUVaRWE2ZS5xUkQ2WmM0Y0VlV2lpbmxNRVhESVVvSkZZSTU2TTZL ``` Example: ``` haven200.com { ... basicauth /secret/* { test JDJhJDE0JEloaFFCbzBMZG94d1J6ZUVaRWE2ZS5xUkQ2WmM0Y0VlV2lpbmxNRVhESVVvSkZZSTU2TTZL } } ``` ### [](#encode "encode")encode Encodes responses using the configured encoding(s). A typical use for encoding is compression. ``` haven200.com { ... encode zstd gzip } ``` ### [](#file-server "file_server")file_server A static file server. It works by appending the request’s URI path to the site’s root path. By default, it enforces canonical URIs; if necessary, requests to directories will be redirected to have a trailing forward slash, and requests to files will be redirected to strip the trailing slash. Most often, the file_server directive is paired with the root directive to set file root for the whole site. ``` file_server [<matcher>] [browse] { root <path> hide <files...> index <filenames...> browse [<template_file>] } ``` * `browse` enables file listings for requests to directories that do not have an index file. * `root` sets the path to the site root for just this file server instance, overriding any other. Default: `{http.vars.root}` or the current working directory. Note: This subdirective **only** changes the root for this directive. For other directives (like try_files or templates) to know the same site root, use the root directive, not this subdirective. * `hide` is a list of files or folders to hide; if requested, the file server will pretend they do not exist. Accepts placeholders and glob patterns. Note that these are _file system paths_, NOT request paths. * `index` is a list of filenames to look for as index files. Default: `index.html` `index.txt` * `<template_file>` is an optional custom template file to use for directory listings. #### [](#example-one "Example One")Example One The file_server directive is usually paired with the root directive to set the root path from which to serve files: ``` haven200.com { root * /var/www/ file_server } ``` #### [](#example-two "Example Two")Example Two A static file server out of the `/var/www` directory With file listings enabled, and hide all `.git` folders and their contents ``` haven200.com { root * /var/www/ file_server browse { hide .git } } ``` Manipulates HTTP header fields on the response. It can set, add, and delete header values, or perform replacements using regular expressions. By default, header operations are performed immediately unless any of the headers are being deleted, in which case the header operations are automatically deferred until the time they are being written to the client. ``` header [<matcher>] [[+|-|?]<field> [<value>|<find>] [<replace>]] { <field> <find> <replace> [+]<field> <value> -<field> ?<field> <default_value> [defer] } ``` * `<field>` is the name of the header field. By default, will overwrite any existing field of the same name. Prefix with `+` to add the field instead of replace, or prefix with `-` to remove the field. * `<value>` is the header field value, if adding or setting a field. * `<default_value>` is the header field value that will be set only if the header does not already exist. * `<find>` is the substring or regular expression to search for. * `<replace>` is the replacement value; required if performing a search-and-replace. * `defer` will force the header operations to be deferred until the response is written out to the client. This is automatically enabled if any of the header fields are being deleted. #### [](#example "Example")Example ``` header Custom-Header "My value" header -Hidden header Location http:// https:// header { Strict-Transport-Security max-age=31536000 X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy no-referrer-when-downgrade } header ?Cache-Control "max-age=3600" reverse_proxy upstream:443 ``` ### [](#root "root")root Sets the `root` path of the site, used by various matchers and directives that access the file system. If unset, the default site root is the current working directory. Specifically, this directive sets the `{http.vars.root}` placeholder. This directive does not automatically enable serving static files, so it is often used in conjunction with the [file_server directive][toc_haven200_file_server] or the [php_fastcgi directive][toc_haven200_php_fastcgi]. ``` root * /var/www/ root /foo/* /var/www/foo ``` ### [](#php-fastcgi-1 "php_fastcgi")php_fastcgi An opinionated directive that proxies requests to a PHP FastCGI server such as php-fpm. Caddy’s reverse_proxy is capable of serving any FastCGI application, but this directive is tailored specifically for PHP apps. This directive is actually just a convenient way to use a longer, more common configuration (below). ``` php_fastcgi [<matcher>] <php-fpm_gateways...> { root <path> split <substrings...> env [<key> <value>] index <filename> resolve_root_symlink dial_timeout <duration> read_timeout <duration> write_timeout <duration> <any other reverse_proxy subdirectives...> } ``` * `<php-fpm_gateways...>` are the addresses of the FastCGI servers. * `root` sets the root folder to the site. Default: `root` directive. * `split` sets the substrings for splitting the URI into two parts. The first matching substring will be used to split the “path info” from the path. The first piece is suffixed with the matching substring and will be assumed as the actual resource (CGI script) name. The second piece will be set to PATH_INFO for the CGI script to use. Default: `.php` * `env` sets an extra environment variable to the given value. Can be specified more than once for multiple environment variables. * `index` specifies the filename to treat as the directory index file. This affects the file matcher in the expanded form. Default: `index.php` * `resolve_root_symlink` enables resolving the root directory to its actual value by evaluating a symbolic link, if one exists. * `dial_timeout` is how long to wait when connecting to the upstream socket. Accepts duration values. Default: no timeout. * `read_timeout` is how long to wait when reading from the FastCGI server. Accepts duration values. Default: no timeout. * `write_timeout` is how long to wait when sending to the FastCGI server. Accepts duration values. Default: no timeout. #### [](#expanded-form "Expanded form")Expanded form The `php_fastcgi` directive is the same as the following configuration: ``` route { @canonicalPath { file { try_files {path}/index.php } not path */ } redir @canonicalPath {path}/ 308 @indexFiles { file { try_files {path} {path}/index.php index.php split_path .php } } rewrite @indexFiles {http.matchers.file.relative} @phpFiles { path *.php } reverse_proxy @phpFiles <php-fpm_gateway> { transport fastcgi { split .php } } } ``` Most modern PHP apps work well with this preset. If yours does not, feel free to borrow from this and customize it as needed instead of using the `php_fastcgi` shortcut. #### [](#examples "Examples")Examples ``` php_fastcgi 127.0.0.1:9000 php_fastcgi /blog/* 127.0.0.1:9000 php_fastcgi unix//run/php/php7.4-fpm.sock ``` ### [](#rewrite "rewrite")rewrite Rewrites the request internally. A rewrite changes some or all of the request URI. The `rewrite` directive implies the intent to accept the request, but with modifications. It is mutually exclusive to other rewrite directives in the same block, so it is safe to define rewrites that would otherwise cascade into each other; only the first matching rewrite will be executed. Because rewrite essentially performs an internal redirect, the [Caddyfile](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy_v2.html#caddyfile-docs) adapter will not fold any subsequent, adjacent handlers into the same route if their matchers happen to be exactly the same. This allows the matchers of the next handlers to be deferred until after the rewrite. In other words, a matcher that matches a request before the rewrite might not match the same request after the rewrite. If you want your rewrite to share a route with other handlers, use the [route](https://caddyserver.com/docs/caddyfile/directives/route) or [handle](https://caddyserver.com/docs/caddyfile/directives/handle) directives. ``` rewrite [<matcher>] <to> ``` * is the URI to set on the request. Only designated parts will be replaced. The URI path is any substring that comes before `?`. If `?` is omitted, then the whole token is considered to be the path. #### [](#examples-1 "Examples")Examples ``` rewrite * /foo.html rewrite /api/* ?a=b rewrite /api/* ?{query}&a=b ``` 引用: * [caddy v1](https://www.shixuen.com/zh-CN/linux/zh-CN/linux/services_web_caddy.html) * [Caddy-website](https://caddyserver.com/) * [Caddy-docs](https://caddyserver.com/docs)
Jonny
Sept. 23, 2022, 7:23 p.m.
507
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
如遇文档失效,可评论告知,便后续更新!
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期