laravel 10 在 ubuntu 20.04 上运行必须使用 php ≥ 8.1,需通过 ondřej surý 的 ppa 添加源并安装 php8.1-fpm 及必要扩展,禁用 php7.4 模块、启用 php8.1-fpm,再用 composer create-project laravel/laravel:^10.0 创建项目,且必须执行 php artisan key:generate 和 php artisan storage:link,并确保 apache documentroot 指向 public/ 目录。

Laravel 10 在 Ubuntu 20.04 上能跑,但必须用 PHP 8.1+,且不能依赖系统默认的 PHP 7.4 —— UpCloud 的 Ubuntu 20.04 镜像默认只带 PHP 7.4,直接 apt install php 会失败或装错版本。
确认并切换到 PHP 8.1(不是 8.0 或 7.4)
Laravel 10 明确要求 PHP >= 8.1.0,php -v 输出低于这个版本就无法启动 artisan,甚至 composer install 都会报错 “requirement not met”。UpCloud 默认镜像不包含 PHP 8.1,必须手动添加第三方源:
- 运行
sudo apt install software-properties-common -y - 添加 Ondřej Surý 的 PHP PPA:
sudo add-apt-repository ppa:ondrej/php -y - 更新源:
sudo apt update - 安装 PHP 8.1 及必需扩展:
sudo apt install php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip php8.1-bcmath php8.1-opcache -y - 禁用旧版 PHP 模块(如果已启用):
sudo a2dismod php7.4;启用新版:sudo a2enmod proxy_fcgi setenvif和sudo a2enconf php8.1-fpm - 重启 Apache:
sudo systemctl restart apache2
用 Composer 安装 Laravel 10 要指定版本
直接运行 composer create-project laravel/laravel 默认拉取的是最新稳定版(目前是 Laravel 11),而 Laravel 11 要求 PHP 8.2+,在 Ubuntu 20.04 + PHP 8.1 环境下会失败。必须显式指定 Laravel 10:
- 确保
composer已全局可用(which composer应返回路径);若未安装,用官方方式:curl -sS https://getcomposer.org/installer | php && sudo mv composer.phar /usr/local/bin/composer - 创建项目时加版本约束:
composer create-project laravel/laravel:^10.0 myapp - 进入目录后立即生成密钥:
cd myapp && php artisan key:generate(否则访问会报Application key not set) - 注意:不要跳过
php artisan storage:link,否则上传文件、日志写入、缓存路径都会出问题
Apache 配置必须指向 public/ 目录
UpCloud 是 VPS,没有控制面板,所有 Web 配置靠手动改 Apache 虚拟主机。把整个 Laravel 项目根目录直接设为 DocumentRoot 是常见错误,会导致 .env 泄露、app/ 目录可被直接访问:
- 编辑站点配置:
sudo nano /etc/apache2/sites-available/myapp.conf - 关键段落必须类似这样(尤其注意
DocumentRoot和<directory></directory>路径):<virtualhost> ServerName example.com DocumentRoot /var/www/myapp/public <directory> AllowOverride All Require all granted </directory> ErrorLog ${APACHE_LOG_DIR}/myapp_error.log CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined </virtualhost> - 启用站点:
sudo a2ensite myapp.conf,禁用默认站:sudo a2dissite 000-default.conf - 重载 Apache:
sudo systemctl reload apache2
权限和 SELinux / AppArmor 不冲突
Ubuntu 20.04 默认启用 AppArmor,它有时会静默阻止 PHP 写入 storage/ 和 bootstrap/cache/。现象是页面空白、500 错误、日志里没记录,php -t 测试却正常:
- 先检查 AppArmor 状态:
sudo aa-status,看是否有apache2相关配置处于 enforce 模式 - 临时测试是否是它导致的问题:
sudo systemctl stop apparmor,再刷新页面;如果恢复,说明需要调策略 - 更稳妥的做法是给目录正确属主,而非盲目
chmod 777:sudo chown -R $USER:www-data /var/www/myapp,然后sudo chmod -R 775 /var/www/myapp/storage /var/www/myapp/bootstrap/cache - 别忘了设置
APP_ENV=production和APP_DEBUG=false在.env里,否则调试信息会暴露路径和数据库结构
最易被忽略的是:Laravel 10 的 config/app.php 中 'cipher' => 'AES-256-CBC' 是硬编码的,但如果你从旧项目复制了 APP_KEY,而该 key 是用 Laravel 9 生成的(使用不同随机数生成器),可能导致加密解密失败,表现为 session 丢失、队列失败、缓存无法反序列化——务必用 php artisan key:generate 重新生成,不要复用。











