Laravel 11 要求 PHP ≥ 8.2 及 OpenSSL、PDO、Mbstring 等扩展,而 Kamatera 上 Rocky Linux 9 默认 PHP 为 8.1.30,需通过启用 Remi 仓库安装独立 PHP 8.2 运行时及对应扩展包,并配置 Nginx + PHP-FPM(监听 127.0.0.1:9000)、开启 SELinux 布尔值 httpd_can_network_connect 才能成功部署。

Laravel 11 要求 PHP ≥ 8.2、OpenSSL、PDO、Mbstring、Tokenizer、XML、Ctype、JSON、BCMath、PCRE 等扩展,而 Kamatera 上的 Rocky Linux 9 默认仓库中 PHP 版本为 8.1(php-8.1.30),不满足 Laravel 11 最低要求。必须手动升级 PHP 至 8.2+,否则 composer create-project laravel/laravel 会直接失败并报错:Your requirements could not be resolved to an installable set of packages.
确认当前 PHP 版本并验证缺失扩展
登录 Kamatera 实例后先执行:
php -v php -m | grep -E 'openssl|pdo|mbstring|tokenizer|xml|ctype|json|bcmath|pcre'
你会看到:PHP 8.1.30(Rocky 9.4 默认值),且 opcache、curl 等常用扩展默认未启用;zip 和 fileinfo 通常也缺失 —— 这些都是 Laravel 11 的硬性依赖。
-
dnf list installed php*可确认当前安装的 PHP 包名(如php-cli-8.1.30-1.el9_4) - 不要用
dnf swap尝试覆盖系统 PHP:Rocky 9 的php:remi-82模块与 baseos 冲突,直接启用会触发Module defaults not available - 正确路径是启用
remi仓库并安装独立 PHP 8.2 运行时,不触碰系统默认 PHP
启用 remi 仓库并安装 PHP 8.2 + 扩展
Rocky Linux 9 使用 dnf module 管理多版本 PHP,但 remi-8.2 不在默认模块流中,需手动导入:
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm dnf module reset php dnf module enable php:remi-8.2 dnf install -y php php-cli php-pdo php-mysqlnd php-mbstring php-tokenizer php-xml php-ctype php-json php-bcmath php-pcre php-zip php-fileinfo php-opcache php-curl
关键点:
- 执行完后运行
php -v应显示PHP 8.2.x(如8.2.24),不是 8.1 -
php --ini会显示配置加载路径为/etc/php.d/,扩展已自动启用 - 若仍提示
zip或fileinfo不可用,检查是否漏装对应包:php-zip和php-fileinfo是独立子包,不能省略 - 别改
/etc/php.ini中的date.timezone—— Laravel 11 会因时区未设而报DateTimeZone::__construct(): Unknown or bad timezone
安装 Composer 并创建 Laravel 11 项目
Rocky 9 自带 php-cli,但默认无 curl 和 unzip,需先补全:
dnf install -y curl unzip
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php然后拉取 Laravel 11:
cd /var/www composer create-project laravel/laravel example-app --version=11.*
注意:
- 不要用
root用户直接运行composer(权限过高易导致缓存目录属主混乱);建议新建用户:useradd -m -s /bin/bash laravel,再su - laravel执行 -
--version=11.*必须显式指定,否则composer可能因平台约束 fallback 到 Laravel 10 - 若卡在
Installing dependencies,大概率是php-zip或php-fileinfo缺失,检查php -m输出
配置 Nginx + PHP-FPM 并启动服务
Rocky 9 默认未安装 Nginx,PHP-FPM 也需手动启用:
dnf install -y nginx systemctl enable nginx php-fpm systemctl start nginx php-fpm
编辑站点配置(如 /etc/nginx/conf.d/laravel.conf):
server {
listen 80;
server_name _;
root /var/www/example-app/public;
index index.php;
<pre class="brush:php;toolbar:false;">location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}}
关键细节:
-
fastcgi_pass 127.0.0.1:9000:Rocky 9 的php-fpm默认监听 TCP 端口而非 socket,改用unix:/run/php-fpm/www.sock需同步修改/etc/php-fpm.d/www.conf中的listen行 - 务必运行
chown -R laravel:nginx /var/www/example-app,否则 Nginx 无法读取.env或写入storage/ -
setsebool -P httpd_can_network_connect 1是必须的:SELinux 默认阻止 Nginx 连 PHP-FPM,否则 502 错误且日志里只有connect() failed (13: Permission denied)
Kamatera 的 Rocky Linux 9 实例默认开启 SELinux 且策略严格,httpd_can_network_connect 这个布尔值不打开,Nginx 和 PHP-FPM 之间的通信就会静默失败 —— 这是最容易被跳过的一步,也是生产环境部署 Laravel 时最常卡住的地方。


















