Craft CMS 是一个开源的内容管理系统,用于创建网站。它是一个安全且可扩展的 CMS,拥有丰富的插件生态系统和高质量的自由及付费插件。它具有直观、用户友好的控制面板,用于内容创建和管理任务。它基于 Yii PHP 框架构建,使用 Twig 模板引擎驱动其模板系统。它可以同时使用 MySQL 和 PostgreSQL 数据库进行存储,并使用 Redis 数据库进行缓存和会话存储。

在本教程中,你将学习如何在 Rocky Linux 9 服务器上安装 Craft CMS。你还将学习如何启用 Redis 与之配合使用,以及如何备份和还原使用 Craft CMS 创建的站点。

前提条件

  • 一台运行 Rocky Linux 9 的服务器,至少 1 GB 内存。
  • 一个具有 sudo 权限的非 root 用户。
  • 一个完全限定域名(FQDN),如 craftcms.example.com,指向你的服务器。
  • 一个 SMTP 账户,如 Amazon SES 或 Mailgun 等邮件服务。
  • 系统已更新所有软件包。
$ sudo dnf update

安装本教程和 Craft CMS 运行所需的一些基础包。

$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y

第一步 - 配置防火墙

第一步是配置防火墙。Rocky Linux 使用 Firewalld 防火墙。检查防火墙状态。

$ sudo firewall-cmd --state
running

防火墙使用不同的区域,public 区域是默认使用的区域。列出防火墙上所有活动的服务和端口。

$ sudo firewall-cmd --permanent --list-services

应该显示以下输出。

cockpit dhcpv6-client ssh

允许 HTTP 和 HTTPS 端口。

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

重新检查防火墙状态。

$ sudo firewall-cmd --permanent --list-services
cockpit dhcpv6-client http https ssh

重新加载防火墙以使更改生效。

$ sudo firewall-cmd --reload

第二步 - 安装 Nginx

Rocky Linux 9 自带较旧版本的 Nginx。你需要使用官方 Nginx 仓库来安装最新版本。

创建并打开文件 /etc/yum.repos.d/nginx.repo 进行编辑。

$ sudo nano /etc/yum.repos.d/nginx.repo

粘贴以下代码。

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

完成后,按 Ctrl + X 保存文件,并在提示时输入 Y

安装 Nginx。

$ sudo dnf install nginx -y

验证安装。

$ nginx -v
nginx version: nginx/1.24.0

启用并启动 Nginx 服务。

$ sudo systemctl enable nginx --now

检查服务状态。

$ sudo systemctl status nginx

第三步 - 安装 PHP 及扩展

Rocky Linux 9 默认附带 PHP 8.1。为了始终使用最新版本的 PHP 或安装多个 PHP 版本,我们需要使用 REMI 仓库。

首先安装 EPEL 仓库。

$ sudo dnf install epel-release -y

安装 Remi 仓库。

$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

查看可用的 PHP 版本。

$ dnf module list php -y

默认版本为 8.1。在撰写本教程时,Craft CMS 兼容 PHP 8.2。因此,启用 Remi 的 PHP 8.2 仓库。

$ sudo dnf module reset php -y
$ sudo dnf module enable php:remi-8.2

安装 PHP 及 Craft CMS 所需的扩展。

$ sudo dnf install php php-cli php-common php-json php-gmp php-fpm php-xmlrpc php-bcmath php-imagick php-curl php-zip php-gd php-mysql php-xml php-mbstring php-xmlrpc php-intl php-pgsql

检查已安装的 PHP 版本。

$ php --version
PHP 8.2.13 (cli) (built: Nov 21 2023 09:55:59) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.13, Copyright (c), by Zend Technologies

启用并启动 PHP-FPM 服务。

$ sudo systemctl enable php-fpm --now

检查 PHP 服务状态。

$ sudo systemctl status php-fpm

第四步 - 配置 PHP-FPM

打开 php.ini 文件进行编辑。

$ sudo nano /etc/php.ini

要设置文件上传大小,更改 upload_max_filesizepost_max_size 变量的值。这个值决定了你可以上传到 Craft CMS 的文件大小。这里我们设置为 128 MB。

$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 128M/' /etc/php.ini
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 128M/' /etc/php.ini

根据服务器资源和需求配置 PHP 的内存限制。

$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php.ini

打开文件 /etc/php-fpm.d/www.conf

$ sudo nano /etc/php-fpm.d/www.conf

我们需要将 PHP 进程的 Unix 用户/组设置为 nginx。找到文件中的 user=www-datagroup=www-data 行,将它们更改为 nginx

user = nginx
group = nginx

找到 listen.owner = nobodylisten.group = nobodylisten.mode = 0660 行,取消注释并修改如下。

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

保存文件。重启 PHP-FPM 进程。确保在重启 PHP 服务之前已安装 Nginx,否则会因找不到 nginx 组而失败。

$ sudo systemctl restart php-fpm

将 PHP 会话目录的组更改为 Nginx。

$ sudo chgrp -R nginx /var/lib/php/session

第五步 - 安装 Composer

Composer 是 PHP 的依赖管理器。它也是 Laravel PHP 框架的依赖管理器,而 Craft CMS 正是基于 Laravel 构建的。

下载 Composer 安装脚本。

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

验证下载的安装程序。

$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified

运行安装脚本下载最新版本的 Composer。

$ php composer-setup.php

删除安装脚本。

$ php -r "unlink('composer-setup.php');"

将下载的二进制文件移动到 /usr/local/bin 目录。

$ sudo mv composer.phar /usr/local/bin/composer

确认安装。

$ composer --version
Composer version 2.6.5 2023-10-06 10:11:52

第六步 - 安装和配置 PostgreSQL

Rocky Linux 9 默认附带 PostgreSQL 13。我们将使用官方仓库的 PostgreSQL 16。

安装 PostgreSQL RPM 仓库。

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

禁用内置的 PostgreSQL 模块。

$ sudo dnf -qy module disable postgresql

安装 PostgreSQL。

$ sudo dnf install -y postgresql16-server postgresql16-contrib

验证版本。

$ psql --version
psql (PostgreSQL) 16.1

初始化 PostgreSQL 数据库。

$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OK

启用并启动 PostgreSQL 服务。

$ sudo systemctl enable postgresql-16
$ sudo systemctl start postgresql-16

启动 PostgreSQL shell。

$ sudo -i -u postgres psql

创建 Craft CMS 数据库。

postgres=# CREATE DATABASE craftcms;

创建 Craft CMS 用户并设置一个强密码。

postgres-# CREATE USER craftuser WITH PASSWORD 'Your_Password';

将数据库所有者更改为 Craft CMS 用户。

postgres-# ALTER DATABASE craftcms OWNER TO craftuser;

授予 Craft CMS 用户对数据库的所有权限。

postgres-# GRANT ALL PRIVILEGES ON DATABASE craftcms TO craftuser;

退出 shell。

postgres-# \q

第七步 - 安装和配置 Redis

Rocky Linux 9 默认附带 Redis 6.2。我们将使用 Remi 仓库安装 Redis 7.2。

列出所有可用的 Redis 模块。

$ sudo dnf module list redis

启用最新的 Redis 7.2 模块。

$ sudo dnf module enable -y redis:remi-7.2

安装 Redis。

$ sudo dnf install redis

验证版本。

$ redis-server --version
Redis server v=7.2.3 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=7bd3173e4e30c3e4

启用并启动 Redis 服务。

$ sudo systemctl enable redis
$ sudo systemctl start redis

下一步是为 Redis 服务器添加身份验证。由于 Redis v6.0,添加身份验证的最佳方式是使用 ACL(访问控制列表)。打开 /etc/redis/redis.conf 文件进行编辑。

$ sudo nano /etc/redis/redis.conf

找到 # aclfile /etc/redis/users.acl 行并取消注释(删除前面的 # 号)。

aclfile /etc/redis/users.acl

保存文件。创建并打开 /etc/redis/users.acl 文件进行编辑。

$ sudo nano /etc/redis/users.acl

添加以下内容。

user navjot on +@all ~* >yourpassword

保存文件。重启 Redis 服务器。

$ sudo systemctl restart redis

打开 Redis shell 验证。

$ redis-cli
127.0.0.1:6379> PING
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH navjot yourpassword
OK
127.0.0.1:6379> PING
OK
127.0.0.1:6379> exit

你还需要安装 PHP Redis 扩展。

$ sudo dnf install php-redis

第八步 - 安装 Craft CMS

在安装 Craft CMS 之前,你可以使用以下命令检查服务器是否满足运行 Craft CMS 的所有要求。

$ curl -Lsf https://raw.githubusercontent.com/craftcms/server-check/HEAD/check.sh | bash

创建 Web 根目录。

$ sudo mkdir /var/www/html/craftcms -p

将当前登录用户设置为该目录的所有者。

$ sudo chown -R $USER:$USER /var/www/html/craftcms

切换到该目录。

$ cd /var/www/html/craftcms

使用 Composer 下载并安装 Craft CMS。命令末尾的点(.)表示在当前目录中执行安装。

$ composer create-project craftcms/craft .

安装过程中,系统会要求你输入有关数据库、管理员账户、站点 URL 和语言的信息。

让 Redis 与 Craft CMS 配合使用

安装 yiisoft/yii2-redis 包。

$ composer require --prefer-dist yiisoft/yii2-redis:"~2.0.0"

打开 /var/www/html/craftcms/config/app.php 文件进行编辑。

$ nano config/app.php

将其修改为以下内容。

use craft\helpers\App;

return [
    'id' => App::env('CRAFT_APP_ID') ?: 'CraftCMS',
    'components' => [
        'cache' => function() {
            $config = [
                'class' => yii\redis\Cache::class,
                'keyPrefix' => Craft::$app->id,
                'defaultDuration' => Craft::$app->config->general->cacheDuration,
                'redis' => [
                    'hostname' => App::env('REDIS_HOSTNAME') ?: 'localhost',
                    'port' => 6379,
                    'username' => App::env('REDIS_USERNAME') ?: null,
                    'password' => App::env('REDIS_PASSWORD') ?: null,
                ],
            ];
            return Craft::createObject($config);
        },
    ],
];

保存文件。这会将 Redis 启用为 Craft CMS 的缓存存储。你还可以使用 Redis 存储 PHP 会话数据、作业队列和作为互斥驱动。可以在 Craft CMS 文档中找到相应的配置。

你还需要将 Redis 配置添加到 .env 文件中。

$ nano .env

在文件末尾添加以下代码。

REDIS_HOSTNAME=localhost
REDIS_USERNAME=navjot
REDIS_PASSWORD=yourpassword

完成后,将目录的组更改为 nginx。这样当前登录用户和 Nginx 都可以访问 Craft CMS。

$ sudo chgrp -R nginx /var/www/html/craftcms
$ sudo chmod -R g+w /var/www/html/craftcms

第九步 - 安装 SSL

我们需要安装 Certbot 来生成 SSL 证书。我们将使用 Snapd 包安装器。由于 Rocky Linux 不自带它,需要安装 Snapd 安装器。它需要 EPEL 仓库才能工作,但我们在第三步中已经安装了它。

$ sudo dnf install -y snapd
$ sudo systemctl enable snapd --now

安装 Snap core 包并确保你的 Snapd 版本是最新的。

$ sudo snap install core && sudo snap refresh core

创建 Snapd 工作所需的链接。

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

安装 Certbot。

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

验证 Certbot 是否正常运行。

$ certbot --version
certbot 2.7.4

运行以下命令生成 SSL 证书。

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m your-email@example.com -d craftcms.example.com

证书将下载到服务器上的 /etc/letsencrypt/live/craftcms.example.com 目录。

生成 Diffie-Hellman 组证书。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

检查 Certbot 续期调度器服务。

$ sudo systemctl list-timers

运行一次续期测试以确保 SSL 续期正常工作。

$ sudo certbot renew --dry-run

第十步 - 配置 SELinux

更改 Craft CMS 的文件安全上下文。

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/craftcms(/.*)?"
$ sudo restorecon -Rv /var/www/html/craftcms/

应用策略以允许 Nginx 连接到 PostgreSQL。

$ sudo setsebool -P httpd_can_network_connect_db 1

应用策略以允许连接到外部主机。

$ sudo setsebool -P httpd_can_network_connect 1

你还需要创建一个 SELinux 模块。创建文件 my-phpfpm.te

$ cd ~
$ nano my-phpfpm.te

粘贴以下代码。

module my-phpfpm 1.0;

require {
        type unconfined_service_t;
        type httpd_t;
        type httpd_sys_content_t;
        class dir write;
        class unix_stream_socket connectto;
}

#============= httpd_t ==============

allow httpd_t httpd_sys_content_t:dir write;
allow httpd_t unconfined_service_t:unix_stream_socket connectto;

保存文件。将策略模块转换为策略包。

$ sudo checkmodule -M -m -o my-phpfpm.mod my-phpfpm.te
$ sudo semodule_package -o my-phpfpm.pp -m my-phpfpm.mod
$ sudo semodule -i my-phpfpm.pp

第十一步 - 配置 Nginx

打开文件 /etc/nginx/nginx.conf 进行编辑。

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 行之前添加以下内容。

server_names_hash_bucket_size 64;

创建并打开文件 /etc/nginx/conf.d/craftcms.conf 进行编辑。

$ sudo nano /etc/nginx/conf.d/craftcms.conf

粘贴以下代码。将 craftcms.example.com 替换为你的域名。确保 client_max_body_size 的值设置为 128MB,与之前配置 PHP 时设置的值一致。

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name craftcms.example.com;
    root /var/www/html/craftcms/web;

    index index.php;
    client_max_body_size 128M;

    access_log  /var/log/nginx/craftcms.access.log;
    error_log   /var/log/nginx/craftcms.error.log;

    ssl_certificate      /etc/letsencrypt/live/craftcms.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/craftcms.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/craftcms.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        try_files $uri/index.html $uri $uri/ /index.php?$query_string;
    }

    location ~ [^/]\.php(/|$) {
        try_files $uri $uri/ /index.php?$query_string;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_keep_conn on;
        include fastcgi_params;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTP_PROXY "";
    }
}

server {
    listen 80;
    listen [::]:80;
    server_name  craftcms.example.com;
    return 301   https://$host$request_uri;
}

验证 Nginx 配置。

$ sudo nginx -t
$ sudo systemctl restart nginx

第十二步 - 访问 Craft CMS

在浏览器中打开 https://craftcms.example.com,你将看到 Craft CMS 首页。

Rocky Linux 9安装Craft CMS内容管理系统教程

访问管理页面,访问 https://craftcms.example.com/admin,你将看到登录页面。

Rocky Linux 9安装Craft CMS内容管理系统教程

输入管理员凭据并点击 Sign in 登录。你将看到管理面板。

Rocky Linux 9安装Craft CMS内容管理系统教程

你现在可以开始使用 Craft CMS 构建你的网站了。

第十三步 - 备份和还原 Craft CMS

你可以从管理面板内备份 Craft CMS 数据库,访问 管理面板 >> 实用工具 >> 数据库备份

Rocky Linux 9安装Craft CMS内容管理系统教程

点击 Backup 按钮下载数据库备份。你也可以使用终端创建备份。

$ cd /var/www/html/craftcms
$ php craft db/backup ~/
Backing up the database ... done

要备份文件,复制并保存整个 /var/www/html/craftcms 文件夹。

$ cd /var/www/html
$ tar -zcf ~/craftcms.tar.gz craftcms

要在新服务器上还原,将文件解压到 /var/www/html 文件夹。

$ tar -xzf craftcms.tar.gz -C /var/www/html/

第十四步 - 更新 Craft CMS

更新 Craft CMS 有两种方式。一种是从管理面板内更新。当有可用更新时,你会收到通知,点击通知即可升级。Craft CMS 会在执行更新前自动备份数据库。

你也可以通过终端更新。检查所有可用的更新。

$ cd /var/www/html/craftcms/
$ php craft update

如果有可用更新,运行以下命令应用更新。

$ php craft update all

总结

本教程到此结束。你学习了如何在 Rocky Linux 9 服务器上安装 Craft CMS,配置 Nginx 反向代理、PostgreSQL 数据库、Redis 缓存,以及如何进行 SSL 加密、SELinux 配置、备份还原和版本更新。