跳至内容

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

要开放处理网页的 httphttps 服务,请运行

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 证书。然后,您可以在浏览器中查看您刚刚设置的网站

Caddy serving our demo website

它应该有一个 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 serving our PHP file

结论

Caddy 的基本安装和配置非常简单。再也不用花费数小时配置 Apache 的日子已经一去不复返了。是的,Nginx 肯定是一个改进,但它仍然缺少 Caddy 内置的现代但至关重要的功能,例如 Let's Encrypt 和 Kubernetes ingress 支持,而这些功能在 Nginx(和 Apache)上您必须单独添加。

自 2019 年以来,我一直使用 Caddy 作为我的首选 Web 服务器,它实在太棒了。事实上,每当我处理 Apache、Nginx 或 IIS 时,感觉就像乘坐时光机回到了 2010 年或更早。

作者:Neel Chauhan

贡献者:Steven Spencer, Ganna Zhyrnova