如何在 Fedora 34/CentOS 8 上使用 PHP 安装和配置 Caddy Web 服务器
在此页
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Caddy
- 第 3 步 - Caddy 配置基础知识
- 为基本 HTML 网站配置 Caddy
- 在 Caddy 中配置多个站点
- 配置 PHP 站点
- 配置反向代理
- 启用 HTTP 身份验证
- 加强网站安全并启用 HSTS
Caddy 是一个用 Go 语言编写的开源 Web 服务器。它提供 HTTP/3 支持、TLS v1.3、使用 Lets Encrypt 的自动 SSL 配置、反向代理,并支持多个插件以扩展其功能。它的优点是无论您需要托管多少个站点,所有配置都可以从单个文件中获取。
本教程将介绍在基于 Fedora 34 和 CentOS 8 的服务器上安装和配置 Caddy 和 PHP。我们将介绍如何托管单个站点和多个站点以及如何使用反向代理以及其他一些安全功能。
先决条件
-
Fedora 34 or CentOS 8 based server
-
A non-root user with sudo privileges
-
A domain name pointing to the server IP address
-
SELinux is disabled.
$ sudo setenforce 0
-
Make sure everything is updated.
$ 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 步 - 安装 Caddy
第一步是安装服务器。 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 配置基础
Caddy 使用 JSON 作为存储或写入配置的主要格式。它是最灵活的配置编写方式,支持所有 Caddys 功能。但是,如果您不知道如何编写 JSON 文件,Caddy 以 Caddyfile 的形式提供了一种更简单的方法。
Fedora/CentOS 软件包在
/etc/caddy/Caddyfile
中包含一个 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 }
按 Ctrl + X 关闭编辑器,并在提示保存文件时按 Y。
让我们浏览一下文件中的所有指令。
encode gzip
指令告诉 Caddy 使用 Gzip 压缩来压缩文件。log
指令将站点的访问日志输出到/var/log/caddy/example.access.log
文件。默认情况下,Caddy 会在日志文件达到 100 MB 时轮换日志文件。轮换文件在 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,例如用于获取 Lets 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
和group=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 设置,请在
html
文件夹中创建文件test.php
。$ sudo nano /var/www/example.com/html/test.php
向其中添加以下内容并按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
<?php phpinfo();
在您的 Web 浏览器中启动
http://example.com/test.php
,您应该会看到以下内容。配置反向代理
Caddy 也可以用作反向代理服务器。要设置它,请使用以下代码。
example1.com { ... reverse_proxy localhost:8000 { header_up Host {http.reverse_proxy.header.X-Forwarded-Host} } }
第 4 步 - Caddy 全局选项
Caddyfile 允许您设置一些全局适用的选项,即它们将适用于您的所有站点。定义全局选项是有益的,这样您就不必在每个服务器块中重新声明它们。
您应该在 Caddyfile 的最顶部包含全局选项。您可以全局设置很多选项。我们将只讨论一些重要的。对于其余部分,您应该参考 Caddys 文档。
以下是您可以在 Caddyfile 中使用的一些默认选项。
{ #TLS Options email servers :443 { protocol { experimental_http3 } max_header_size 5mb } servers :80 { protocol { allow_h2c } max_header_size 5mb } }
在上面的代码中,
email
指定了用于向 Lets 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 服务器的教程到此结束。如果您有任何问题,请在下面的评论中发表。