Grav

来自 ArchWiki

来自Wikipedia

Grav 是一个用 PHP 编程语言编写的,基于 Symfony Web 应用程序框架的自由软件、自托管内容管理系统 (CMS)。它为后端和前端都使用扁平文件数据库。
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 代码:uWSGIFPMFPM 正如其名称所示,专门用于 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 个)服务,并且感觉这是资源浪费,您可以考虑使用 皇帝模式

FPM

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

您必须稍微调整其配置。

php-fpm.ini

最好使用 FPM 自己的 php.ini 版本运行它。这样可以避免使用 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 创建一个所谓的池文件。它负责为 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 stapling 未配置。

您可能需要调整的事项(非详尽列表)

  • 您的服务器名称(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 服务器

遗憾的是,上游 Grav 没有为 Apache HTTP 服务器 提供示例配置文件。至少本 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 网站上广泛的文档

骨架

名为 Grav 的大片空白区域很可能让您感到有些畏惧。在这种情况下,您可能希望使用许多骨架之一作为起点。骨架是 Grav 本身、一些插件、一个主题和一些示例内容的预制捆绑包,可为您提供一些可供使用的内容。骨架应该代替裸 Grav 安装进行安装。遗憾的是,这使得无法将骨架与 gravAUR 软件包一起使用。

稍作调整,您就可以将任意骨架的内容导入到您现有的 Grav 安装中。

警告: 以下过程将覆盖您当前的内容。如果您想退后一步,请备份目录 /var/lib/grav/user/etc/webapps/grav/config

  1. 下载所需的骨架。
  2. 提取 user 目录
    # bsdtar -xf grav-skeleton-blahblah.zip user
  3. /var/lib/grav/user 中的目录 pagespluginsthemes 替换为从提取的 user 目录中对应的目录。
  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. /etc/webapps/grav/config 中的配置文件 site.yaml system.yaml 替换为从提取的 user/config 中对应的文件。
  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 的 更新文档 中所述或通过管理插件升级。最好的情况是这根本不起作用,最坏的情况是它会毁坏您的安装。

与升级 Grav 本身不同,升级插件和主题必须使用 gpm update 或通过管理插件完成。

也不建议直接从 Grav 的 GitHub 项目站点下载 Grav 版本作为 ZIP 存档,并在文件系统中复制内容。只有当您确切知道自己在做什么时才这样做。