Laravel 10+ 要求 PHP ≥ 8.1 并启用 openssl、pdo、mbstring、tokenizer、xml、ctype、json、fileinfo 等扩展;须用非 root 用户安装并正确设置 storage 和 bootstrap/cache 权限;Web 服务器必须指向 public 目录;安装后立即执行 php artisan key:generate 并确保 .env 权限为 644。

确认 PHP 版本和扩展是否满足 Laravel 要求
Laravel 10+ 要求 PHP ≥ 8.1,且必须启用 openssl、pdo、mbstring、tokenizer、xml、ctype、json 等扩展。缺一个,composer create-project 就会卡在依赖解析或直接报错。
- 运行
php -v检查版本;若低于 8.1,别硬装,先升级 PHP(如 Ubuntu 22.04 默认是 8.1,但 CentOS 7 默认是 7.2) - 用
php -m | grep -E 'openssl|pdo|mbstring'快速筛查关键扩展,缺失的用sudo apt install php-mbstring php-xml php-bcmath(Debian/Ubuntu)或sudo yum install php-mbstring php-xml php-bcmath(RHEL/CentOS 8+)补全 -
fileinfo扩展容易被忽略——Laravel 的文件上传、Mime 类型检测依赖它,没启会导致Class 'Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser' not found这类看似无关的错误
用 Composer 安装时权限和用户问题最常导致失败
直接用 root 跑 composer create-project 看似省事,但后续 storage 和 bootstrap/cache 目录权限混乱,Web 服务器(如 Nginx)写不进日志或缓存,500 错误无声无息。
- 始终用非 root 用户操作:新建专用用户(如
laravel-user),加到www-data(Debian/Ubuntu)或nginx(CentOS/RHEL)组 - 安装命令后立刻修正权限:
sudo chown -R laravel-user:www-data ./myapp,再sudo chmod -R 775 storage bootstrap/cache - 别信 “chmod 777” 一时爽——Nginx 进程若以
www-data身份运行,而目录属主是root,775 也写不进去;属主必须是 Web 服务器用户或其同组成员
Apache/Nginx 配置漏掉 public 目录是 403/404 根源
Laravel 的入口必须指向 public/ 子目录,不是项目根目录。配错就只能看到“Directory listing forbidden”或空白页,连 Laravel 的错误页面都出不来。
- Apache:确保
DocumentRoot指向/var/www/myapp/public,且对应<directory></directory>块中含AllowOverride All(否则.htaccess不生效) - Nginx:
root指令必须设为/var/www/myapp/public,不是/var/www/myapp;同时检查是否遗漏try_files $uri $uri/ /index.php?$query_string; - 常见低级错误:改了配置但没重载服务——
sudo systemctl reload apache2或sudo systemctl reload nginx缺一不可
APP_KEY 未生成或 .env 权限过高引发解密失败
新安装后访问首页报 The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths.,基本就是 APP_KEY 没生成,或 .env 文件被设成 600 但 Web 服务器用户无读取权。
- 安装完立即跑:
php artisan key:generate——这步不能跳,否则所有加密功能(session、cookie、signed URL)全崩 -
.env文件权限建议 644(rw-r--r--),属主为 Web 用户或其同组成员;设成 600 且属主不是 Web 用户时,Nginx 读不到,APP_KEY变空字符串 - 如果已部署上线,
.env绝对不能提交到 Git,也不能放在 Web 可访问路径下——哪怕权限设对,暴露了数据库密码也是事故
环境变量加载顺序、OPcache 缓存旧配置、SELinux 在 CentOS 上拦截 Web 进程读取 .env ——这些点一旦触发,现象和原因完全脱钩,得一个个排除。动手前先看 storage/logs/laravel.log 里第一条报错,比瞎猜快得多。










