Caddy Web 服务器
简介¶
Caddy 是一款专为现代 Web 应用设计的 Web 服务器。Caddy 配置简单,并且支持自动化的 Let's Encrypt,因此您的网站默认是安全的。它是作者首选的 Web 服务器。
以下是 Caddy 功能的简要概述
- 基本的 Web 服务器
- 用于将流量导向多个站点的反向代理
- 支持多种工作负载的模块,包括 TCP、SSH 等
- 内置负载均衡器,用于管理到多个网站的流量
- 内置、自动化的 Let's Encrypt 支持
- 可通过 API 以编程方式重新配置服务器
- PHP FastCGI 支持
- 以及 IPv6
先决条件和假设¶
您将需要
- 一台已连接互联网的 Rocky Linux 机器或服务器。
- 基本了解命令行。
- 能够以 root 用户身份或使用
sudo
运行命令。 - 您选择的文本编辑器,可以是图形界面或命令行。在本教程中,作者使用的是
vim
。 - 一个指向您服务器公共 IP 地址的域名或其他主机名。
安装 Caddy¶
首先,请确保您的机器已更新到最新版本
sudo dnf update
然后,安装 epel-release
软件仓库
sudo dnf install -y epel-release
如果您运行的是 Rocky Linux 10,请启用 Copr 仓库
sudo dnf copr enable @caddy/caddy
接下来,安装 caddy
Web 服务器
sudo dnf install -y caddy
配置防火墙¶
如果您尝试从另一台计算机访问您机器的 IP 地址或域名上的网页,很可能什么也看不到。如果您启用了防火墙,情况就是如此。
要开放必要的端口以实际“看到”您的网页,您将使用 Rocky Linux 内置的防火墙 firewalld
。执行此操作的 firewalld
命令是 firewall-cmd
。
要开放处理网页的 http
和 https
服务,请运行
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
分解一下
--permanent
标志告诉防火墙在每次防火墙重启和服务器重启时都应用此配置。--zone=public
告诉防火墙允许任何人传入此端口的连接。- 最后,
--add-service=http
和--add-service=https
告诉firewalld
将所有 HTTP 和 HTTPS 流量传递到服务器。
在强制执行之前,这些配置不会生效。要做到这一点,请告诉 firewalld
重新加载其配置
sudo firewall-cmd --reload
注意
现在,非常小的可能性是这不起作用。在极少数情况下,让 firewalld
按照您的意愿执行,即老办法:关闭再打开。
systemctl restart firewalld
要确保允许这些端口,请运行 firewall-cmd --list-all
。配置正确的防火墙看起来会像这样
public (active)
target: default
icmp-block-inversion: no
interfaces: enp9s0
sources:
services: cockpit dhcpv6-client ssh http https
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
从防火墙的角度来看,这应该就够了。
配置 Caddy¶
与 Apache 和 Nginx 等传统 Web 服务器不同,Caddy 的配置文件格式显著更简单。再也不用花费时间配置 Web 服务器的线程模型或 SSL 证书等细节了,除非您想这样做。
要编辑 Caddy 配置文件
sudo vim /etc/caddy/Caddyfile
一个最小的静态 Web 服务器配置可能如下所示
example.com {
root * /usr/share/caddy/example.com
file_server
}
将“example.com”替换为指向您服务器的主机名。
您还必须在 Caddy 的“root”目录中添加一个网站。为了简单起见,添加一个单页静态网站
mkdir -p /usr/share/caddy/example.com
echo "<h1>Hi!</h1>" >> /usr/share/caddy/example.com/index.html
之后,启用 Caddy 的 systemd 服务
sudo systemctl enable --now caddy
在一分钟内,Caddy 将从 Let's Encrypt 获取 SSL 证书。然后,您可以在浏览器中查看您刚刚设置的网站
它应该有一个 SSL 挂锁,在所有现代浏览器中都能正常显示,而且不仅如此,在 Qualys SSL Server Test 上还能获得 A+ 评分。
可选:PHP FastCGI¶
如前所述,Caddy 支持 PHP 的 FastCGI 支持。好消息是,与 Apache 和 Nginx 不同,Caddy 会自动处理 PHP 文件扩展名。
要安装 PHP,首先添加 Remi 仓库(注意:如果您运行的是 Rocky Linux 8.x 或 9.x,请在下面的“release-”后面替换 8 或 9)
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm
接下来,我们需要安装 PHP(注意:如果您使用其他版本的 PHP,请将 php83 替换为您想要的版本)
sudo dnf install -y php85-php-fpm
如果您需要额外的 PHP 模块(例如 GD),请将其添加到上述命令中。
然后,我们需要配置 PHP 以监听 TCP 套接字
sudo vim /etc/opt/remi/php85/php-fpm.d/www.conf
接下来,找到这一行
listen = /var/opt/remi/php85/run/php-fpm/www.sock
将其替换为
listen = 127.0.0.1:9000
现在我们可以启用并启动 php-fpm
sudo systemctl enable --now php85-php-fpm
然后保存并退出 www.conf
文件,并打开 Caddyfile
sudo vim /etc/caddy/Caddyfile
导航到我们之前创建的服务器块
example.com {
root * /usr/share/caddy/example.com
file_server
}
在“file_server”行之后添加以下行
php_fastcgi 127.0.0.1:9000
您的 PHP 启用服务器块将如下所示
example.com {
root * /usr/share/caddy/example.com
file_server
php_fastcgi 127.0.0.1:9000
}
然后保存并退出 Caddyfile,并重启 Caddy
sudo systemctl restart caddy
要测试 PHP 是否正常工作,让我们添加一个简单的 PHP 文件
echo "<?php phpinfo(); ?>" >> /usr/share/caddy/rockyexample.duckdns.org/phpinfo.php
在浏览器中打开您创建的文件,您应该会看到 PHP 信息
结论¶
Caddy 的基本安装和配置非常简单。再也不用花费数小时配置 Apache 的日子已经一去不复返了。是的,Nginx 肯定是一个改进,但它仍然缺少 Caddy 内置的现代但至关重要的功能,例如 Let's Encrypt 和 Kubernetes ingress 支持,而这些功能在 Nginx(和 Apache)上您必须单独添加。
自 2019 年以来,我一直使用 Caddy 作为我的首选 Web 服务器,它实在太棒了。事实上,每当我处理 Apache、Nginx 或 IIS 时,感觉就像乘坐时光机回到了 2010 年或更早。
作者:Neel Chauhan
贡献者:Steven Spencer, Ganna Zhyrnova