Caddy小巧而多用的Web服务器

Caddy是使用Go编写的功能强大、可扩展的Web服务器,其功能包括但不限于Web服务器、反向代理、文件服务器等功能,而且可以轻松实现HTTPS配置,并自动更新证书。

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示例

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

基本命令

  1. caddy run 运行caddy,如果当前目录存在名为Caddyfile的文件则按其配置运行,也可用--config参数指定其他位置Caddyfile的文件:caddy run --config /path/to/Caddyfile

  2. caddy start 其他服务器,与run的区别在于,start是在后台运行。可使用stop停止服务器:caddy stop
  3. 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-fpmsudo 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
        }
}

参考

  1. Caddy快速入门
  2. PHP: 配置 - Manual
  3. How to Install and Configure Caddy Web Server with PHP and MariaDB on Ubuntu 20.04