Grav
- Grav 是一个用 PHP 编程语言编写的,基于 Symfony Web 应用程序框架的自由软件、自托管内容管理系统 (CMS)。它为后端和前端都使用扁平文件数据库。
- Grav 的设计目标是拥有浅显的学习曲线,并且易于设置。Grav 的重点是速度和简洁性,而不是以复杂性为代价的大量内置功能。
先决条件
Grav 自身所需的先决条件出奇地少。当然,作为一个用 PHP 编写的 Web 应用程序,它需要 PHP。唯一需要的 PHP 模块是 php-gd。还需要其他一些模块,但它们已经是基本的 PHP 安装的一部分。以下 PHP 模块是可选的,但强烈建议使用以获得更好的性能
虽然 Grav 可以自行提供内容,但本文描述的是一个前面带有功能完善的 Web 服务器的设置。因此,您需要
- Web 服务器:Apache HTTP 服务器 或 nginx 或其他
- 应用服务器:uWSGI(与 uwsgi-plugin-php 一起)或 FPM
以下组合将被涵盖
- 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 软件包。这将自动处理安装两个必需的依赖项 php 和 php-gd。另请安装 php-apcu 和 php-yamlAUR - 最好作为依赖项 (--asdeps
) 安装。注释掉 /etc/php/conf.d/yaml.ini
中的唯一一行。不要修改 /etc/php/conf.d/apcu.ini
,即保持唯一一行被注释掉。激活 Grav 的这两个扩展将在其他地方处理(见下文)。
应用服务器
有两种流行的应用服务器可以用于处理 PHP 代码:uWSGI 或 FPM。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 个)服务,并且感觉这是资源浪费,您可以考虑使用 皇帝模式。
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
。
- 下载所需的骨架。
- 提取
user
目录# bsdtar -xf grav-skeleton-blahblah.zip user
- 将
/var/lib/grav/user
中的目录pages
、plugins
和themes
替换为从提取的user
目录中对应的目录。 - 修复所有权和权限
# 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 {} \; - 将
/etc/webapps/grav/config
中的配置文件site.yaml
system.yaml
替换为从提取的user/config
中对应的文件。 - 修复所有权和权限
# 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 存档,并在文件系统中复制内容。只有当您确切知道自己在做什么时才这样做。