Caddy 是一个用 Go 语言编写的开源 Web 服务器。它提供 HTTP/3 支持、TLS v1.3、使用 Let's Encrypt 的自动 SSL 配置、反向代理,并支持多个插件来扩展其功能。无论您需要托管多少个站点,它的所有配置都可以从单个文件中提供的优势。
本教程将介绍在基于 Fedora 34 和 CentOS 8 的服务器上安装和配置 Caddy 和 PHP。我们将介绍如何托管单个和多个站点以及如何使用反向代理以及其他一些安全功能。
先决条件
-
基于 Fedora 34 或 CentOS 8 的服务器
-
具有 sudo 权限的非 root 用户
-
指向服务器IP地址的域名
-
SELinux 被禁用。
$ sudo setenforce 0
-
确保所有内容都已更新。
$ sudo dnf update
第 1 步 - 配置防火墙
第一步是配置防火墙以打开 HTTP 和 HTTPS 端口。Fedora 和 CentOS 预装了 Firewalld 防火墙。
检查防火墙是否正在运行。
$ sudo firewall-cmd --state
您应该得到以下输出。
running
检查当前允许的服务/端口。
$ sudo firewall-cmd --permanent --list-services
它应该显示以下输出。
dhcpv6-client mdns ssh
允许 HTTP 和 HTTPS 端口。
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
重新检查防火墙的状态。
$ sudo firewall-cmd --permanent --list-services
您应该会看到类似的输出。
dhcpv6-client http https mdns ssh
重新加载防火墙。
$ sudo systemctl reload firewalld
第 2 步 - 安装球童
第一步是安装服务器。Fedora 34 和 CentOS 8 的安装步骤相同。
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
您可以通过以下命令验证安装。
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
第 3 步 - 球童配置基础
Caddy 使用 JSON 作为存储或写入配置的主要格式。它是编写配置最灵活的方式,并且支持 Caddy 的所有功能。但如果您不知道如何编写 JSON 文件,Caddy 以 Caddyfile 的形式提供了一种更简单的方法。
Fedora/CentOS 软件包包括一个 Caddyfile,位于/etc/caddy/Caddyfile
. 它应该如下所示(忽略评论)
:80 {
root * /usr/share/caddy
file_server
}
启用并启动 caddy 守护进程。
$ sudo systemctl enable --now caddy
您可以打开网址http://youripaddress
查看。 您应该看到以下欢迎页面。
Caddy 提供了许多功能和配置,因此我们只会选择重要的功能和配置来服务我们的网站。默认配置通过 HTTP 提供服务,指定为:80
. 该root
指令告诉 Caddy 在目录中查找要提供的文件/usr/share/caddy
。
该file_server
指令告诉 Caddy 充当文件服务器,这意味着它将仅通过默认地址提供静态文件。
为基本 HTML 网站配置 Caddy
让我们创建一个基本的 caddy 配置文件来为静态网站提供服务。
创建一个目录来托管您的网站并存储您的日志文件。
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
将目录的所有权设置为 Caddy。
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
创建一个 HTML 文件进行测试并打开它进行编辑。
$ sudo nano /var/www/example.com/html/index.html
添加以下代码。
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>
按Ctrl + X关闭编辑器,并在提示保存文件时 按Y。
打开 Caddyfile 进行编辑。
$ sudo nano /etc/caddy/Caddyfile
将现有代码替换为以下代码。
example.com {
root * /var/www/example.com/html
file_server
encode gzip
log {
output file /var/log/caddy/example.access.log
}
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
}
header @static Cache-Control max-age=5184000
tls name@example.com
}
按Ctrl + X关闭编辑器,并在提示保存文件时 按Y。
让我们浏览一下文件中的所有指令。该encode gzip
指令告诉 Caddy 使用 Gzip 压缩来压缩文件。
该log
指令将站点的访问日志输出到/var/log/caddy/example.access.log
文件。默认情况下,当日志文件达到 100 MB 时,Caddy 会轮换日志文件。轮换文件在 90 天后或轮换日志超过 10 个时被删除。您可以通过以下方式更改默认参数。
log {
output file /var/log/caddy/example.access.log {
roll_size 10MB
roll_keep 5
roll_keep_for 240h
}
}
在上面的代码中,轮换的日志文件限制为 10 MB,并在 10 天(240 小时)后或当轮换日志超过 5 个时删除。
Caddy 将自动生成并安装 SSL 证书,无需任何干预。该tls
指令允许我们提供额外的选项来配置 HTTPS,例如用于获取 Let's Encrypt 报告的电子邮件地址。
该header
指令对所有静态文件(图像/javascript/CSS 文件)启用缓存控制。您可以添加更多文件扩展名或复制代码以为不同的文件格式设置不同的持续时间。您必须将值更改为static
不同的值,因为这是一个命名引用。
完成后,您可以使用以下命令验证您的配置。
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
我们必须使用该--adapter caddyfile
选项,因为默认情况下,该命令仅验证 JSON 配置。
如果您收到以下警告,您可以使用单个命令轻松修复它。
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
运行以下命令来修复错误。
$ caddy fmt --overwrite /etc/caddy/Caddyfile
上述命令格式化并覆盖 Caddyfile。
重新启动 Caddy 以启用配置。每次更改配置时都需要重新启动服务器。
$ sudo systemctl restart caddy
打开在您的浏览器中,您应该会看到以下页面,这意味着配置正在运行。
在 Caddy 中配置多个站点
您可以在单个 caddy 文件中配置多个站点。为此,请按以下方式为每个站点创建单独的块。
example1.com {
root * /var/www/example1.com/html
...
}
example2.com {
root * /var/www/example2.com/html
...
}
此方法适用于几个站点,但如果您托管多个站点,单个站点可能会变得非常大且难以维护。
创建目录`/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
现在您可以从文件/etc/caddty/caddyfile
顶部的目录中导入配置文件。
import caddyconf/*.conf
最后一步是为每个站点创建单独的配置文件。
配置 PHP 站点
到目前为止,我们只讨论了使用 Caddy 服务静态站点。您也可以使用 Caddy 轻松地为动态 PHP 站点提供服务。要启用 PHP 支持,请在您的站点块中添加以下代码。
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
您还需要安装 PHP。
$ sudo dnf install php-fpm php-cli php-gd
您可以安装所需的任何其他 PHP 模块。您还需要配置文件/etc/php-fpm.d/www.conf
。打开文件进行编辑。
$ sudo nano /etc/php-fpm.d/www.conf
我们需要将 Unix 用户/PHP 进程组设置为caddy。在文件中找到user=apache
andgroup=apache
行并将它们更改为 nginx。
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...
找到该行listen.acl_users = apache,nginx
并将其值更改为以下内容。
...
listen.acl_users = apache,nginx,caddy
...
通过按Ctrl + X并在出现提示时 输入Y来保存文件。
启动 PHP-fpm 进程。
$ sudo systemctl start php-fpm
要测试您的 PHP 设置,请test.php
在html
文件夹中创建一个文件。
$ sudo nano /var/www/example.com/html/test.php
向其中添加以下内容并按Ctrl + X并在出现提示时 输入Y保存文件。
<?php phpinfo();
在您的网络浏览器中启动http://example.com/test.php
,您应该会看到以下内容。
配置反向代理
Caddy 也可以用作反向代理服务器。要进行设置,请使用以下代码。
example1.com {
...
reverse_proxy localhost:8000 {
header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
}
}
第 4 步 - 球童全局选项
Caddyfile 允许您设置一些全局适用的选项,即它们将适用于您的所有站点。定义全局选项是有益的,这样您就不必在每个服务器块中重新声明它们。
您应该在 Caddyfile 的最顶部包含全局选项。您可以全局设置很多选项。我们只会介绍一些重要的。其余的,您应该参考 Caddy 的文档。
以下是您可以在 Caddyfile 中使用的一些默认选项。
{
#TLS Options
email name@example.com
servers :443 {
protocol {
experimental_http3
}
max_header_size 5mb
}
servers :80 {
protocol {
allow_h2c
}
max_header_size 5mb
}
}
在上面的代码中,email
指定了用于向 Let's Encrypt 授权注册 SSL 证书的电子邮件 ID。OCSP 装订通过自动向浏览器提供证书吊销信息来提高 HTTPS 站点的性能。该max_header_size
选项指定要解析的客户端 HTTP 请求标头的大小。
我们还为 HTTPS 站点启用了 HTTP/3 协议,并为 HTTP 站点启用了 HTTP/2 支持。这些是实验性功能,最终可能会被删除,所以在启用它们之前要小心。
第 5 步 - 增强安全性
启用 HTTP 身份验证
您可以为某些目录启用简单的 HTTP 身份验证。首先,您需要为其创建身份验证凭据。
Caddy 仅接受配置中的散列密码。因此,您需要先创建一个散列密码。运行以下命令来做到这一点。
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
准备好密码后,在 Caddyfile 中输入以下代码。
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
上面的命令将/secret
使用您刚刚创建的凭据保护目录。
强化站点安全并启用 HSTS
您可以添加其他安全配置来保护您的站点。为此,我们将创建另一个文件/etc/caddy/caddy_security.conf
。
$ sudo nano /etc/caddy/caddy_security.conf
将以下代码添加到其中。
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Xss-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Permissions-Policy "interest-cohort=()"
Content-Security-Policy "upgrade-insecure-requests"
Referrer-Policy "strict-origin-when-cross-origin"
Cache-Control "public, max-age=15, must-revalidate"
Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
}
上面的代码启用/实现了以下功能。
- 为站点及其所有子域启用 HSTS 支持。
- 启用 XSS 过滤。
- 防止内容/MIME 嗅探。
- 它可以防止您的网站被加载到 IFRAME 中。
- 它会阻止您的网站被包含在 FLOC 跟踪试验中。
- 添加关于用户代理如何处理不安全 URL 的内容安全策略。
- 实施引荐来源网址策略,以便在协议相同的情况下仅发送引荐来源网址用于跨域请求。
- 功能策略提供了一种启用和禁用某些浏览器功能的机制。
接下来,将文件导入您想要的任何站点块中。
example.com {
...
import /etc/caddy/caddy_security.conf
}
重新启动服务器以实施更改。
结论
关于在基于 Fedora 34 / CentOS 8 的服务器上安装和配置 Caddy Web 服务器的教程到此结束。如果您有任何问题,请将其发布在下面的评论中。