Caddy是使用Go编写的功能强大、可扩展的Web服务器,其功能包括但不限于Web服务器、反向代理、文件服务器等功能,而且可以轻松实现HTTPS配置,并自动更新证书。
Caddy安装
Caddy安装极为方便,可以使用apt、docker或直接下载可执行程序等多种方式安装。
从Github发布页下载对应的文件,解压后即可运行caddy。更多方式安装。
Caddy使用
Caddyfile
Caddyfile是一种简洁、方便的Caddy配置文件格式,caddy
可以自动读取当前目录下名为Caddyfile
的文件,并按其配置运行服务。这是一个用于WordPress的Caddyfile示例,可自动为WordPress站点配置HTTPS。
example.com
root * /var/www/wordpress
php_fastcgi unix//run/php/php-version-fpm.sock
file_server
Caddyfile文件可以转换为JSON文件:
caddy adapt # 转换同目录下的Caddyfile为json格式,文件名为Caddyfile
caddy adapt --config /path/to/Caddyfile # 转换指定的Caddfile,文件名可随意
Caddyfile的一些小问题
路径匹配问题:/
与/*
,前者仅匹配/
不会匹配/foo
,ref: https://github.com/caddyserver/caddy/issues/3728#issuecomment-693519586
基本命令
-
caddy run
运行caddy,如果当前目录存在名为Caddyfile
的文件则按其配置运行,也可用--config
参数指定其他位置Caddyfile的文件:caddy run --config /path/to/Caddyfile
。 caddy start
其他服务器,与run的区别在于,start是在后台运行。可使用stop停止服务器:caddy stop
。caddy file-server
运行一个文件服务器。
运行一个简单的文件服务器
caddy file-server
命令可以运行一个文件服务器,在2015端口启动一个文件服务器:
caddy file-server --listen :2015 --root ~/data/ --browse
--listen
指定端口,默认80;
--root
指定根目录,默认当前目录;
--browse
以目录的形式显示文件,如果不存在index文件使用该参数避免显示空白;
这些参数都可以写进Caddyfile里,在当前目录创建Caddyfile,caddy run
:
localhost :2015
root * /home/data
file_server browse
反向代理
使用下面命令可以将2016端口转向本机9000端口:
caddy reverse-proxy --from :2016 --to 127.0.0.1:9000
--from
:指定代理端口,模式使用80或443;
--to
:代理到的目表地址
等效的Caddyfile:
:2016
reverse_proxy 127.0.0.1:9000
使用HTTPS
Caddy默认使用HTTPS加密,主机名使用域名时使用Let‘s Encrypt的证书加密,若使用localhost
,120.0.0.1
自签名证书,如,按如下内容编辑Caddyfile,启动caddy后,访问该域名就自动使用HTTPS:
example.com
respond "Hello, privacy!"
下面命令也是一样效果
# 开启使用HTTPS的文件服务
caddy file-server --domain example.com
# 使用HTTPS反向代理9000端口服务
caddy reverse-proxy --from example.com --to localhost:9000
如不使用HTTPS可指定HTTP,如
http://example.com
respond "Hello, privacy!"
tls关键字可以用于配置加密证书位置等信息
tls [internal|<email>] | [<cert_file> <key_file>] {
protocols <min> [<max>]
ciphers <cipher_suites...>
curves <curves...>
alpn <values...>
load <paths...>
ca <ca_dir_url>
ca_root <pem_file>
dns <provider_name> [<params...>]
on_demand
client_auth {
mode [request|require|verify_if_given|require_and_verify]
trusted_ca_cert <base64_der>
trusted_ca_cert_file <filename>
trusted_leaf_cert <base64_der>
trusted_leaf_cert_file <filename>
}
}
php_fastcgi
Caddy也可将请求代理到PHP FastCGI服务器,如php-fpm。
PHP配置
php配置/etc/php-fpm.d/www.conf
,这里web目录的所属用户及用户组为test
,所以配置文件中相应字段按如下配置:
user = test
group = test
; 下面两项默认是注释掉的,经测试不作修改也是可以的的
listen.owner = test
listen.group = test
设置好后,重启php-fpm
:sudo systemctl restart php-fpm.service
。
在CentOS中,如果正确配置了www.conf
后访问php出现Access denied
问题,getenforce
命令检查SElinux设置,如果返回Enforcing
,则问题可能出在SELinux设置上。临时修改SELinux类型:sudo setenforce 0
,刷新网页即可看到php正常工作的页面。
$ getenforce # 查看当前SELinux类型
Enforcing
$ sudo setenforce 0 # 临时设置SELinux类型
$ getenforce
Permissive
上面对SELinux的设置重启后将失效,如需要永久生效可修改/etc/selinux/config
文件中SELINUX
的值。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
Caddyfile配置
参考配置:
mydomain.com {
root * /home/vgos/MKOnlineMusicPlayer
file_server
php_fastcgi unix//run/php-fpm/www.sock
log {
output file /var/log/caddy/example.com.access.log {
roll_size 3MiB
roll_keep 5
roll_keep_for 48h
}
format console
}
# 自定义证书位置,非必须
tls /path/for/fullchain.pem /path/for/key.pem
}
:80 {
# 设置站点子目录
redir /f /f/
handle_path /f/* {
root * /home/ubuntu/caddy
file_server browse
}
redir /p /p/
handle_path /p/* {
root * /home/ubuntu/docs
file_server
}
# handle_path 等价于 handle 加 uri strip_prefix.
redir /g /g/
handle /g/* {
uri strip_prefix /g/
root * /home/ubuntu/docs
file_server
}
}
参考