根本原因是centos stream 9默认环境缺失php扩展(如mbstring、xml、zip、gd、bcmath)、composer内存限制过低且网络源不稳定、selinux策略阻止storage目录写入,三者叠加导致laravel 10安装失败。

UpCloud 上 CentOS Stream 9 安装 Laravel 10 失败,根本原因不是 Laravel 本身不兼容,而是默认系统环境缺失关键依赖、PHP 配置未调优、SELinux 或权限策略过于严格——这三者叠加后,composer create-project 很容易卡在 autoload 生成、扩展加载或写入 storage 目录阶段。
PHP 版本与扩展缺失是头号拦路虎
CentOS Stream 9 默认仓库的 PHP 是 8.1.x,但 Laravel 10 明确要求 PHP ≥ 8.1.0(且推荐 8.2+),表面满足,实则陷阱在于:系统包管理器安装的 PHP 缺少大量运行时必需扩展,且部分扩展名与 Ubuntu/Debian 不同。
-
php-mbstring、php-xml、php-zip、php-gd、php-bcmath、php-opcache必须全部安装;仅php-common和php-cli远不够 - 特别注意:
php-fpm不是必须项(命令行安装 Laravel 不依赖它),但若后续用 Nginx 托管,php-fpm和php-opcache建议一并启用 - 验证方式:运行
php -m | grep -E "(mbstring|xml|zip|gd|bcmath)",缺哪个补哪个,例如:sudo dnf install php-mbstring php-xml php-zip php-gd php-bcmath
Composer 安装失败常因内存限制或网络源失效
UpCloud 默认 VPS 内存小(如 1GB),composer create-project laravel/laravel myapp 在解压和 autoload 生成阶段极易触发 Allowed memory size exhausted;同时 CentOS Stream 9 的默认 Packagist 源走国际链路,UpCloud 芬兰/德国节点访问不稳定。
- 临时提内存:用
php -d memory_limit=-1 /usr/bin/composer create-project laravel/laravel myapp --prefer-dist - 换国内镜像(必须在 root 或当前用户下执行):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 若仍超时,加
--no-interaction --quiet减少交互开销,或先git clone https://github.com/laravel/laravel.git myapp再cd myapp && composer install --no-dev --prefer-dist
权限与 SELinux 导致 artisan 命令报错或日志写入失败
CentOS Stream 9 默认启用 SELinux,且 UpCloud 镜像中 /var/www 或用户主目录下的项目往往被标记为 user_home_t 或 default_t,而 PHP-FPM/Nginx 进程无法写入 storage 和 bootstrap/cache,表现为 Permission denied 错误,即使 chmod 777 也无效。
- 先确认 SELinux 状态:
sestatus;若为enforcing,临时设为 permissive:sudo setenforce 0(仅用于验证是否为根源) - 正确做法是打标签:
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/myapp/storage(/.*)?",然后sudo restorecon -Rv /path/to/myapp/storage - 同时确保 Web 服务器用户(如
nginx或apache)对storage和bootstrap/cache有所有权:sudo chown -R nginx:nginx /path/to/myapp/storage /path/to/myapp/bootstrap/cache - 别用
chmod 777—— SELinux 下无效,且破坏最小权限原则
APP_KEY 未生成或 .env 权限错误引发 Encrypter 异常
新项目首次运行 php artisan serve 或访问首页,报 The only supported ciphers are AES-128-CBC and AES-256-CBC...,说明 .env 文件中的 APP_KEY 为空或格式非法,而 Laravel 10 默认不再自动生成密钥。
- 必须手动执行:
php artisan key:generate(确保当前目录是项目根目录,且php命令能调用到已装扩展的 PHP) - 检查
.env文件权限:ls -l .env;若属主不是当前用户或权限为600以外(如444),artisan 无法写入;建议设为644:chmod 644 .env - 若
key:generate报错 “No application encryption key has been specified”,先确认config/app.php中'cipher' => 'AES-256-CBC'未被注释或改错
UpCloud + CentOS Stream 9 的组合看似干净,实则对 Laravel 10 的“默认友好”假设非常苛刻:它既不像 Ubuntu 那样预装一堆扩展,也不像 Alpine 那样轻量易控。真正卡点往往不在 Laravel 代码层,而在 php.ini 的 extension_dir 路径、SELinux 上下文、Composer 的 process-timeout 设置,以及 vendor/autoload.php 是否真被写入了可执行字节码——这些细节一旦漏掉一个,就可能让整个流程停在黑屏或 500 错误上。











