怎样在 CentOS 7 上安装和配置 Caddy

介绍

Caddy 是一个新兴的 Web 服务器程序,原生支持 HTTP/2 和自动 HTTPS。 考虑到易用性和安全性,Caddy 可用于通过单个配置文件快速部署启用 HTTPS 的站点。

先决条件

  • 一个全新的 Vultr CentOS 7 x64 服务器实例。 我们将使用 203.0.113.1 作为 example.
  • 一个 sudo 用户。
  • 服务器实例已使用 EPEL YUM 存储库更新到最新的稳定状态。
  • 一个域 example.com 已配置为指向 203.0.113.1 服务器实例。 在另一个 Vultr 教程中查看详细信息。

步骤 1:安装 Caddy 的最新稳定版本

在 Linux、Mac 或 BSD 操作系统上,使用以下命令安装 Caddy 的最新稳定系统特定版本:

curl https://getcaddy.com | bash

出现提示时,输入您的 sudo 密码完成安装。

Caddy 二进制文件将安装到 /usr/local/bin 目录。 使用以下命令确认:

which caddy

输出应该是:

/usr/local/bin/caddy

出于安全考虑, 绝不 以 root 身份运行 Caddy 二进制文件。 为了让 Caddy 能够以非 root 用户身份绑定到特权端口(例如 80、443),您需要运行 setcap 命令如下:

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

第 2 步:配置 Caddy

创建专用系统用户: caddy 和一组同名的 Caddy:

sudo useradd -r -d /var/www -M -s /sbin/nologin caddy

笔记: 用户 caddy 此处创建只能用于管理Caddy服务,不能用于登录。

创建主目录 /var/www 用于 Caddy Web 服务器和主目录 /var/www/example.com 为您的网站:

sudo mkdir -p /var/www/example.com
sudo chown -R caddy:caddy /var/www

创建一个目录来存储 SSL 证书:

sudo mkdir /etc/ssl/caddy
sudo chown -R caddy:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

创建一个专门的目录来存储 Caddy 配置文件 Caddyfile

sudo mkdir /etc/caddy
sudo chown -R root:caddy /etc/caddy

创建名为的 Caddy 配置文件 Caddyfile

sudo touch /etc/caddy/Caddyfile
sudo chown caddy:caddy /etc/caddy/Caddyfile
sudo chmod 444 /etc/caddy/Caddyfile
cat <<EOF | sudo tee -a /etc/caddy/Caddyfile
example.com {
    root /var/www/example.com
    gzip
    tls [email protected]
}
EOF

笔记: 这 Caddyfile 上面创建的文件只是运行静态网站的基本配置。 您可以了解有关怎样编写 Caddyfile 的更多信息 这里.

为了方便 Caddy 的操作,您可以设置一个 systemd Caddy 的单元文件,然后使用 systemd 管理球童。

使用 vi 创建 Caddy 的编辑器 systemd 单元文件:

sudo vi /etc/systemd/system/caddy.service

填充文件:

[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Restart=on-abnormal

; User and group the process will run as.
User=caddy
Group=caddy

; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy

; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID

; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s

; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Unmodified caddy is not expected to use more than that.
LimitNPROC=512

; Use private /tmp and /var/tmp, which are discarded after caddy stops.
PrivateTmp=true
; Use a minimal /dev
PrivateDevices=true
; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
ProtectHome=true
; Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
; … except /etc/ssl/caddy, because we want Letsencrypt-certificates there.
;   This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
ReadWriteDirectories=/etc/ssl/caddy

; The following additional security directives only work with systemd v229 or later.
; They further retrict privileges that can be gained by caddy. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
;CapabilityBoundingSet=CAP_NET_BIND_SERVICE
;AmbientCapabilities=CAP_NET_BIND_SERVICE
;NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Save 并退出:

:wq!

启动 Caddy 服务并使其在系统启动时自动启动:

sudo systemctl daemon-reload
sudo systemctl start caddy.service
sudo systemctl enable caddy.service

第三步:修改防火墙规则

为了允许访问者访问您的 Caddy 站点,您需要打开端口 80 和 443:

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

第 4 步:为您的站点创建一个测试页面

使用以下命令创建一个名为 index.html 在您的 Caddy 站点主目录中:

echo '<h1>Hello World!</h1>' | sudo tee /var/www/example.com/index.html

重启 Caddy 服务以加载新内容:

sudo systemctl restart caddy.service

最后,将您的网络浏览器指向 https://example.com 或者 https://example.com. 你应该看到消息 Hello World! 正如预期的那样。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com