Caddy V2 使用记录 作者: Hogwarts 发布于: 2023-07-30 更新于: 2024-02-25 分类: 默认分类 默认的CaddyV2是不带Webdav模块的,使用起来太不方便了,得先弄个带Webdav模块的Caddy。 #一、编译CaddyV2 ##1.1 Golang环境的安装 参考:`https://winamp.top/91.html` 官网:`https://go.dev/dl/` ##1.2 xcaddy 下载安装 下载地址:`https://github.com/caddyserver/xcaddy/releases` wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.5/xcaddy_0.3.5_linux_amd64.tar.gz tar -zxvf xcaddy_0.3.5_linux_amd64.tar.gz mv xcaddy /usr/local/bin/ xcaddy version ##1.3 源码编译 加了两个插件,可根据个人需求按例子添加。 需指定编译的caddy的版本号。 ###1.3.1 下载源码 git clone https://github.com/caddyserver/caddy.git cd caddy ###1.3.2 编译 xcaddy build v2.7.4 --output ./caddy_amd64_v2.7.4 \ --with github.com/kirsch33/realip \ --with github.com/mholt/caddy-webdav ###1.3.3 交叉编译 GOOS=linux GOARCH=arrch64 xcaddy build v2.7.4 --output ./caddy_arrch64_v2.7.4 \ --with github.com/kirsch33/realip \ --with github.com/mholt/caddy-webdav 其它系统环境可修改 GOOS 和 GOARCH 编译。 ##1.4 查看命令 mv caddy_amd64_v2.7.4 /usr/local/bin/caddy caddy version #版本查看 caddy list-modules #插件查看 #二、caddy 使用 caddy的官方文档看不大懂,不过对于熟悉 json 写法的同学很顺手,目前我还是侧重于 caddyfile 用法,但这并不是官方所推荐的。记录几个正常已运行的写法,日后再慢慢测试补充。 ##编辑 Caddyfile vim /etc/caddy/Caddyfile { admin off order webdav last #无webdav的省略此项 } :80 { # Set this path to your site's directory. root * /data/www/default encode gzip # Enable the static file server. file_server { index index.html } # Serve a PHP site through php-fpm: php_fastcgi unix//run/php-fpm/www.sock { split .php index index.php } log { output file /var/log/caddy/access.log } } import /etc/caddy/conf.d/*.conf 正常运行后在 `/etc/caddy/conf.d/*.conf` 下放入以下单独的 `conf` 即可。 可能还需建立文件目录 mkdir -p /data/www/default mkdir -p /var/log/caddy/ mkdir -p /etc/caddy/conf.d/ useradd -r -d /data/www -M -s /sbin/nologin caddy chown -R caddy.caddy /data/www/default chown -R caddy.caddy /var/log/caddy/ 以上配置抄自:[LCMP (Linux + Caddy + MariaDB + PHP)](https://teddysun.com/700.html "LCMP (Linux + Caddy + MariaDB + PHP)") ##2.1 目录浏览 yourdomain.com:80 { redir https://yourdomain.com{uri} } yourdomain.com:443 { log { output file /var/log/caddy/access.log } root * /data/www/html file_server browse tls /etc/caddy/fullchain.cer /etc/caddy/private.key } ##2.2 webdav yourdomain.com:80 { redir https://yourdomain.com{uri} } yourdomain.com:443 { encode gzip tls /etc/caddy/fullchain.cer /etc/caddy/private.key file_server route { basicauth { user yourpasswd #不支持明文密码。(hashed_password_base64) 密码生成命令:caddy hash-password --plaintext yourpasswd } webdav /* { root /webdavPath prefix / } } } 如果是主域名加路径模式则需加入`prefix`选项 webdav /webdav/* { root /mnt/M/share/ prefix /webdav } 参考:`https://www.mrdoc.fun/doc/478/` `https://github.com/mholt/caddy-webdav` > webdav后面代表匹配的路径,在访问/webdav/xxx这类子路径时生效,root代表文件系统路径,prefix前缀用于修正访问文件目录的路径,比如访问/webdav/img/1.png,如果没有设置prefix,默认就会去文件系统访问/mnt/M/share/webdav/img/1.png,加上prefix参数,系统就会知道访问路径开头的/webdav是需要去掉的。webdav不能像caddy1一样设置只读,所以只能通过配置要访问的文件对运行服务的caddy用户的读写权限实现。 当file_server和webdav同时使用时,需要加上 route,原因不太清楚。 **webdav的设置较为繁琐,需不断调试,设置不当可能无法连接;或basicauth不起作用。因需求不同,故配置不同。** ##2.3 路径反代 yourdomain.com:80 { redir https://yourdomain.com{uri} } yourdomain.com:443 { encode gzip log { output file /var/log/access.log } tls /etc/caddy/pfullchain.cer /etc/caddy/private.key root * /data/www/html/ file_server browse reverse_proxy /path 127.0.0.1:port #可以给xray-plugin header { Strict-Transport-Security "max-age=31536000; preload" X-Content-Type-Options nosniff X-Frame-Options SAMEORIGIN } } 仅简单记录这几个caddyfile的写法吧,还不能写在一块,写在一个caddyfile中会报错。按caddy官方说法需要像nginx的upstram那样设置route。边学习边补充吧。 ##2.4 前置反向代理 yourdomain.com:80 { redir https://yourdomain.com{uri} } yourdomain.com:443 { encode gzip zstd log { output file /var/log/access.log } tls /etc/caddy/fullchain.cer /etc/caddy/private.key reverse_proxy https:/yourdomain.com { transport http { tls tls_insecure_skip_verify } header_up Host yourdomain.com header_up X-Forwarded-Host yourdomain.com } } ##2.5 PHP写法 yourdomain.com:80 { redir https://yourdomain.com{uri} } yourdomain.com:443 { encode gzip zstd log { output file /var/log/access.log } tls /etc/caddy/fullchain.cer /etc/caddy/private.key root * /data/www/html/ file_server browse php_fastcgi unix//run/php/php8.2-fpm.sock { split .php index index.php } header { Strict-Transport-Security "max-age=31536000; preload" X-Content-Type-Options nosniff X-Frame-Options SAMEORIGIN } } ##2.6 本地端口反代 yourdomain.com:80 { redir https://yourdomain.com{uri} } yourdomain.com:443 { log { output file /var/log/access.log } encode gzip file_server tls /etc/caddy/fullchain.cer /etc/caddy/private.key reverse_proxy 127.0.0.1:port { header_up Host {upstream_hostport} } } ##2.7 日志 log { output file /var/log/caddy/ssl_access.log { roll_size 100mb roll_keep 3 roll_keep_for 7d } } 自行编译的 roll 模块报错,原因未明。 #三、开机启动和可能的错误 ##3.1 开机启动 vim /etc/systemd/system/caddy.service [Unit] Description=Caddy After=network-online.target [Service] User=caddy Type=simple CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile --adapter caddyfile Restart=on-abort [Install] WantedBy=default.target systemctl start caddy systemctl enable caddy systemctl status caddy --no-page -l ##3.2 运行当中的报错 ###3.2.1 报错一 Log报错:Caddyfile input is not formatted 运行:`caddy fmt --overwrite` 参考:`https://github.com/NixOS/nixpkgs/issues/216149` ###3.2.2 报错二 按教程` https://teddysun.com/700.html `像nginx那样弄一个 conf.d 将上述caddyfile改为conf文件放入后报错:`Error: adapting config using caddyfile: server block without any key is global configuration, and if used, it must be first` 解决:将order加入到caddyfile文件中。由于该指令不是 Caddy 的标准配置,因此您需要对该指令进行排序。 { admin off order webdav last #无webdav的省略此项 } ###3.2.3 报错三 `Error: loading initial config: loading new config: http app module: start: listening on:80: listen tcp:80: bind: permission denied` 运行:`setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy` #四、参考 [Caddy 2安装与配置](https://qoant.com/2021/02/vps-caddy2/ "Caddy 2安装与配置") [Caddy 2 简明教程](https://jivps.com/21.html "Caddy 2 简明教程") 标签: caddy, caddy2, caddyv2