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_filesize 和 post_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-data 和 group=www-data 行,将它们更改为 nginx。
user = nginx group = nginx
找到 listen.owner = nobody、listen.group = nobody、listen.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 首页。

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

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

你现在可以开始使用 Craft CMS 构建你的网站了。
第十三步 - 备份和还原 Craft CMS
你可以从管理面板内备份 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 配置、备份还原和版本更新。