如何在 Fedora 34 / CentOS 8 上安装和配置 Caddy Web 服务器使用 PHP

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=apacheandgroup=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.phphtml文件夹中创建一个文件。

$ 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'"
}

上面的代码启用/实现了以下功能。

  1. 为站点及其所有子域启用 HSTS 支持。
  2. 启用 XSS 过滤。
  3. 防止内容/MIME 嗅探。
  4. 它可以防止您的网站被加载到 IFRAME 中。
  5. 它会阻止您的网站被包含在 FLOC 跟踪试验中。
  6. 添加关于用户代理如何处理不安全 URL 的内容安全策略。
  7. 实施引荐来源网址策略,以便在协议相同的情况下仅发送引荐来源网址用于跨域请求。
  8. 功能策略提供了一种启用和禁用某些浏览器功能的机制。

接下来,将文件导入您想要的任何站点块中。

example.com {
	...
	import /etc/caddy/caddy_security.conf
}

重新启动服务器以实施更改。

结论

关于在基于 Fedora 34 / CentOS 8 的服务器上安装和配置 Caddy Web 服务器的教程到此结束。如果您有任何问题,请将其发布在下面的评论中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值