跳转至内容

Grav

来自 ArchWiki

来自 Wikipedia

Grav 是一款免费的、自托管的内容管理系统 (CMS),使用 PHP 编程语言编写,并基于 Symfony Web 应用框架。它使用扁平文件数据库来处理后端和前端。
Grav 的设计目标是易于上手和设置。Grav 的重点在于速度和简洁性,而不是牺牲复杂性而提供大量内置功能。

前提条件

Grav 本身对先决条件的要求并不高。当然,作为一个用 PHP 编写的 Web 应用程序,它需要 PHP。唯一必需的 PHP 模块是 php-gd。另外还需要其他一些模块,但它们已经是基本 PHP 安装的一部分。以下 PHP 模块是可选的,但强烈推荐以获得更好的性能

  • php-apcu 以提高缓存性能
  • php-yamlAUR 用于本地 YAML 处理,显著提高性能

虽然 Grav 可以自行提供内容,但本文档描述的是在前面放置一个功能齐全的 Web 服务器的设置。所以你需要

以下组合将涵盖

  • nginx → uWSGI (加上 uwsgi-plugin-php)
  • nginx → FPM,
  • Apache (使用 mod_proxy_uwsgi) → uWSGI (加上 uwsgi-plugin-php)
  • Apache (使用 mod_proxy_fcgi) → FPM

Grav 的安装符合 Arch Linux 的 Web 应用包指南。这意味着,除其他细节外,Grav 必须以其自己的系统用户 (grav) 运行。因此,不能再通过 php-apache 在 Apache 进程中直接执行 PHP 代码。

安装

安装 gravAUR 包。这将自动处理安装两个必需的依赖项 phpphp-gd。同时安装 php-apcuphp-yamlAUR - 最好作为依赖项(--asdeps)。注释掉 /etc/php/conf.d/yaml.ini 中唯一的一行。不要修改 /etc/php/conf.d/apcu.ini,即保持唯一的一行被注释掉。在其他地方(见下文)将负责为 Grav 启用这两个扩展。

应用服务器

有两种主要的应用程序服务器可用于处理 PHP 代码:uWSGIFPM。顾名思义,*FPM* 专门用于 PHP。Web 服务器和 *FPM* 之间使用的协议是 *fastcgi*。该工具多年来一直是 PHP 发行版的一部分,并且得到了积极维护。缺点是官方文档还有很大的改进空间。另一方面,*uWSGI* 可以通过语言特定的插件来处理用多种语言编写的代码。使用的协议是 *uwsgi*(小写)。该工具有详尽的文档 - 尽管文档数量庞大可能会令人困惑且难以驾驭。维护已显著放缓 - 这尤其适用于PHP 插件

uWSGI

警告 截至 2022-01-04,当 PHP 8.1 在 Arch Linux 的 Extra 仓库可用时,uWSGI 的 PHP 插件已损坏。(参见 FS#73470)截至该插件的 2.0.20-5 版本,目前可以工作,但请注意,关于该项目长期可行性的担忧

uWSGI 有其自己的文章。可以在那里找到大量有用的信息。安装 uwsgi 和插件 uwsgi-plugin-php - 最好作为依赖项,即使用 --asdeps。设置您的 Grav 应用程序只需要复制一个文件并定义一个 systemd 服务。

grav.ini

将 Grav 特定的 uWSGI 设置文件复制到适当的位置。

# cp /usr/share/webapps/grav/webserver-configs/uwsgi-grav.ini /etc/uwsgi/grav.ini

确保 grav.ini 由 root 用户拥有并且只能由 root 用户写入,即 -rw-r--r-- 1 root root ... grav.ini。此配置是可用的,但请随时根据您的喜好进行调整。例如,您可能希望将 php-set = date.timezone= 更改为您偏好的时区。

systemd 服务

uwsgi 包提供了一个模板单元文件(uwsgi@.service)。实例 ID(此处为 *grav*)用于查找正确的配置文件。因此,我们启动/启用 uwsgi@grav.service

如果您启动了不止几个(例如 2 个)此类服务,并认为这是对资源的浪费,您可以考虑使用皇帝模式 (emperor mode)

FPM

如果您选择使用 *FPM* 作为您的应用程序服务器,请安装 php-fpm - 最好作为依赖包(--asdeps)。

您需要稍微调整一下它的配置。

php-fpm.ini

最好使用其自己的 php.ini 版本运行 *FPM*。这样可以避免将仅供 *FPM* 使用的内容混入标准 INI 文件(/etc/php/php.ini)。在 /usr/share/webapps/grav/webserver-configs 中有一个功能性的 INI 文件副本。将其复制到 /etc/php

# cp /usr/share/webapps/grav/webserver-configs/php-fpm.ini /etc/php

确保它由 root 用户拥有并且只能由 root 用户写入。类似 -rw-r--r-- 1 root root ... php-fpm.ini。请随时根据需要自定义配置。

grav.conf

您必须为 *FPM* 创建一个所谓的*池文件* (pool file)。它负责为 Grav 应用程序生成一个专用的 *FPM* 进程。复制由 gravAUR 包提供的版本。

# cp /usr/share/webapps/grav/webserver-configs/php-fpm.d/grav.conf /etc/php/php-fpm.d

同样,请确保此池文件由 root 用户拥有并且只能由 root 用户写入(即 -rw-r--r-- 1 root root ... grav.conf)。您可以根据喜好调整一些设置(尤其是 pm...php_admin_value[date.timezone])。

提示 php-fpm 包自带了一个无用的池文件 www.conf。一个好的方法是将其重命名为 www.conf.package,并创建一个仅包含注释行(以分号开头的行)的 www.conf 文件。这样 www.conf 就不会执行任何操作。它也不会在安装新版本的 php-fpm 时被覆盖。相反,会创建一个文件 www.conf.pacnew。您可以将其与 www.conf.package 进行比较,以查看池文件中是否有任何重要的更改,您可能需要在 grav.conf 中重现。完成后不要忘记将 www.conf.pacnew 重命名为 www.conf.package

systemd 服务

*FPM* 作为 systemd 服务运行。您必须修改服务配置才能运行 Grav。最好通过 drop-in 文件来实现。

/etc/systemd/system/php-fpm.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/php-fpm --nodaemonize --fpm-config /etc/php/php-fpm.conf --php-ini /etc/php/php-fpm.ini
ReadWritePaths=/etc/webapps/grav/config
PrivateTmp=false

该 drop-in 文件有三个用途。

  • 它将 ExecStart 行替换为使用上一节中介绍的 php-fpm.ini 的启动命令。
  • 它明确启用对 /etc/webapps/grav/config 的读/写访问,否则该访问将被 /usr/lib/systemd/system/php-fpm.service 中的 ProtectSystem=full 阻止。
  • 它禁用 /usr/lib/systemd/system/php-fpm.service 中设置的 PrivateTmp 选项,因为这与 /etc/php/php-fpm.d/grav.conf 中的 php_admin_value[open_basedir] = …:/var/tmp/$pool:… 不兼容。

不要忘记启动/启用 php-fpm.service

Web 服务器

有大量的 Web 服务器可供选择。无论您最终选择哪个选项,都要牢记 Grav 应用程序需要以其自己的系统用户 *grav* 运行。因此,您可能需要将您的请求转发到上述某个应用程序服务器。

警告 /usr/share/webapps/grav/webserver-configs 中提供的某些 Web 服务器特定示例文件(nginx.conf 除外)可能已过时。

nginx

nginx 的配置超出了本文档的范围。有关更多信息,请参阅相关的文章gravAUR 包附带了一个示例配置文件 /usr/share/webapps/grav/webserver-configs/nginx.conf。该文件本身无法正常工作。将其用作您自己配置的起点。您很可能需要将其复制到 /etc/nginx/sites-available 并使用适当的名称,然后在 /etc/nginx/sites-enabled 中创建相应的符号链接。

示例文件假定您正在使用 SSL/TLS 和某种 ACME 客户端(例如 Certbot)来获取您的证书。OCSP 协议回退未配置。

您可能需要调整的事项(不详尽)

  • 您的服务器名称(server_name 子句 2x),即您的 Grav 安装可访问的 URL 的服务器部分。
  • 您用于 SSL / TLS 的证书和密钥的名称。
  • 是否以及在哪里写入访问日志。
  • Certbot(或任何其他 ACME 客户端)将用于放置域验证挑战的位置。
  • 您的 Grav 安装将可访问的路径。(URL 中服务器名称和端口部分右边的部分。)
  • 您正在使用的应用程序服务器(uWSGI 或 FPM),即 nginx 将如何以及在何处传递需要触发某些 PHP 代码的请求。

由于 nginx 原生支持 FastCGI 和 uwsgi 协议,因此无需安装任何额外的模块。

Grav 的文档也涵盖了使用 nginx 设置 Grav。但请注意,这些说明是针对 Ubuntu / Debian 的,并且没有提及 uWSGI。

Apache HTTP Server

不幸的是,上游 Grav 没有为 Apache HTTP Server 提供示例配置文件。至少在本 wiki 中有一个部分介绍了如何通过 FPM 和 mod_proxy_fcgi 集成 Apache 与 PHP。uWSGI 的文档包含一些关于如何通过 uWSGI 和 mod_proxy_uwsgi 集成 Apache 与 PHP 的信息。请注意,apache 包同时包含 mod_proxy_fcgi 和 mod_proxy_uwsgi 模块。它们需要按需加载。

插件

Grav 的许多强大功能来自于可以安装的大量插件。只需遵循 Grav 文档中关于如何安装插件的说明

注意 从命令行安装插件时,请确保以用户 grav 执行这些命令。例如:
# runuser -u grav -- bin/gpm install admin
否则,您迟早会遇到权限问题。

目前没有 grav-plugin-... 包允许通过 pacman(或某些 AUR 包装器)安装插件。这在可预见的将来可能不会改变。

内容

有关如何使用此 CMS 创建内容,请参阅 Grav 网站上详尽的文档

骨架 (Skeletons)

很可能,Grav 这个巨大的空白面板让你望而却步。在这种情况下,您可能希望使用许多骨架之一作为起点。骨架是 Grav 本身、一些插件、一个主题和一些示例内容的预制捆绑包,它们提供了一些东西供您玩耍。骨架应该被安装而不是裸安装 Grav。不幸的是,这使得无法将骨架与 gravAUR 包一起使用。

通过一些调整,您可以将任意骨架的内容导入到您现有的 Grav 安装中。

警告 以下过程将覆盖您当前的内容。如果您想回退,请备份 /var/lib/grav/user/etc/webapps/grav/config 目录。
  1. 下载所需的骨架。
  2. 提取 user 目录
    # bsdtar -xf grav-skeleton-blahblah.zip user
  3. 用提取的 user 目录中的相应目录替换 /var/lib/grav/user 中的 pagespluginsthemes 目录。
  4. 修复所有权和权限
    # chown -R grav:http /var/lib/grav/user/{pages,plugins,themes}
    # chmod -R 640 /var/lib/grav/user/{pages,plugins,themes}
    # find /var/lib/grav/user/{pages,plugins,themes} -type d -exec chmod 750 {} \;
  5. 用提取的 user/config 中的相应文件替换 /etc/webapps/grav/config 中的配置文件 site.yamlsystem.yaml
  6. 修复所有权和权限
    # chown grav:grav /etc/webapps/grav/config/{site,system}.yaml
    # chmod 644 /etc/webapps/grav/config/{site,system}.yaml

从 v1.6 迁移到 v1.7

注意 从旧版本的包(< 1.7)迁移的测试不充分(由于技术原因)。请帮助改进此部分。

从旧版本的包(< 1.7)迁移很可能需要手动干预。可能会发生错误。所以请在尝试从旧版本升级之前**备份您的数据**!这至少包括 /usr/share/webapps/grav/user 目录。

升级可能会立即失败,并出现大量错误消息,抱怨文件已存在于 /usr/share/webapps/grav/vendor 下。只需删除此目录。

自 1.6 版本(v1.6.28, 2020-11-18)的最后一个包以来,php 已从版本 7 升级到 8。这可能会导致某些插件无法正常工作。

Grav v1.7 在许多方面变得更加严格。有关详细信息,请参阅 Grav 的迁移指南

不要尝试调整您的设置以使用以前的系统用户 http。出于充分的理由,Arch Linux 的 Web 应用包指南规定要使用专用的系统用户(此处为 grav)来运行应用程序。

最好的迁移策略可能是备份 /usr/share/webapps/grav/user 目录,卸载 Grav 和所有依赖包,删除 Grav 安装的所有残留(包括 Web 服务器和应用程序服务器的所有 Grav 特定配置),更新您的系统(包括 PHP),然后从头开始安装 Grav。当一切设置完毕并且您的服务器成功显示 Grav 的默认页面后,您就可以开始恢复您之前的内容了。

升级

Grav 本身的升级必须完全通过 pacman(或某个 AUR 包装器)进行!

警告 不要尝试使用 gpm 升级 Grav 本身,如 Grav 的更新文档中所述,或通过 admin 插件。最乐观的情况是这根本无法工作,最坏的情况是它会弄坏您的安装。

与升级 Grav 本身不同,插件和主题的升级必须使用 gpm update 或通过 admin 插件进行。

也不推荐直接从 Grav 的 GitHub 项目站点下载 Grav 发行版的 ZIP 存档并四处复制文件。只有当您确切知道自己在做什么时才这样做。