Laravel 11 在 Hetzner 的 Debian 12 上能跑,但必须用 PHP 8.2+、禁用 opcache.save_comments=1、手动补全 mbstring 等扩展,否则 composer create-project 会卡在 autoload 或报 Class 'Mbstring' not found。

直接说结论:Laravel 11 在 Hetzner 的 Debian 12 上能跑,但必须用 PHP 8.2+、禁用 `opcache.save_comments=1`、手动补全 `mbstring` 等扩展,否则 composer create-project 会卡在 autoload 或直接报 Class 'Mbstring' not found。
PHP 8.2 是硬门槛,Debian 12 默认不带
Debian 12 默认源只提供 PHP 8.1(apt list php* 可确认),而 Laravel 11 明确要求 PHP ≥ 8.2。不能凑合用 8.1 —— 安装过程会通过,但运行时 php artisan serve 启动失败,报 Unsupported operand types: string + int 类似错误,根源是 PHP 8.1 缺少 Laravel 11 所需的类型推导能力。
正确做法是添加 Ondřej Surý 的 PHP 源:
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common sudo curl -sSL https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /usr/share/keyrings/sury-php-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/sury-php-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list sudo apt update
然后安装 PHP 8.2 及必需扩展:
sudo apt install php8.2-cli php8.2-fpm php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-opcache php8.2-curl php8.2-gd php8.2-zip php8.2-sqlite3- 别漏
php8.2-sqlite3:哪怕你用 MySQL,Laravel 的测试和部分 Artisan 命令(如php artisan tinker)依赖 SQLite 驱动,否则报Driver [sqlite] not supported
composer create-project 必须加版本约束
不指定版本时,composer create-project laravel/laravel myapp 在 Hetzner 的网络环境下大概率超时或拉到损坏包 —— 因为默认走 packagist.org,而 Hetzner 德国机房对某些 CDN 节点解析不稳定。
推荐命令:
composer create-project laravel/laravel myapp "11.*" --prefer-dist --no-interaction
关键点:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
"11.*":显式锁主版本,避免 Composer 自作主张选 12.x(尚未发布)或回退到 10.x -
--prefer-dist:跳过 git clone,直接下 zip 包,快且稳定 -
--no-interaction:防止交互式提问卡住(Hetzner VPS 无 TTY 时常见)
装完立刻验证:cd myapp && php artisan --version 应输出 Laravel Framework 11.x.x。
opcache.save_comments=0 不是可选项
Laravel 11 大量使用 PHP 8.2 的 Attributes(比如 #[Route]),而 Debian 12 的 php8.2-opcache 包默认开启 opcache.save_comments=1。这会导致 PHP 解析 Attributes 失败,Artisan 命令执行时静默崩溃,日志里只有 Segmentation fault,毫无提示。
修复方式(改 CLI 和 FPM 两处):
- CLI:
sudo nano /etc/php/8.2/cli/php.ini→ 找到opcache.save_comments行,设为0 - FPM:
sudo nano /etc/php/8.2/fpm/php.ini→ 同样设为0 - 重启:
sudo systemctl restart php8.2-fpm
不改这个,php artisan key:generate 都会失败,.env 文件写不进密钥。
Nginx 配置要绕开 /public 目录权限陷阱
Hetzner 的 Debian 12 默认用 www-data 运行 Nginx,但项目目录属主通常是 root 或你的普通用户。如果直接把 root 设为 /var/www/myapp/public,Nginx 会因权限不足读不到 index.php,返回 403。
安全做法是:
- 把项目移到
/var/www/myapp(非 root 用户也可操作) - 运行:
sudo chown -R www-data:www-data /var/www/myapp - Nginx 配置中
root指向/var/www/myapp/public,但必须加这一行:include /etc/nginx/snippets/fastcgi-php.conf;(不是fastcgi-php.conf的路径拼错)
最容易被忽略的是:Laravel 11 的 public/index.php 开头有 #!/usr/bin/env php,如果服务器没开 script 权限,Nginx 会把它当静态文件返回源码 —— 检查方法是直接访问 http://your-ip/index.php,如果看到满屏 PHP 代码,就说明 fastcgi 没生效。

















