kamatera 的 ubuntu 22.04 上 laravel 11 易现 500/404,主因是三重默认配置冲突:systemd-resolved 导致 dns 超时、缺失 php8.2-mysql 等硬性扩展、laravel 11 中间件组未显式声明;须立即停用 systemd-resolved、安装完整 php8.2 扩展、补全 bootstrap/app.php 的 withmiddleware 配置,并严格按 ubuntu 22.04 路径(如 unix:/run/php/php8.2-fpm.sock)配置 nginx。

Laravel 11 在 Kamatera 的 Ubuntu 22.04 上能跑,但不能直接用 php artisan serve 对外提供服务——Kamatera 默认不开放非标准端口(如 8000),且 php artisan serve 是开发服务器,无反向代理、无 HTTPS、无进程守护,线上环境必须换掉。
为什么 Kamatera + Ubuntu 22.04 上 Laravel 11 容易 500 或 404?
不是代码问题,而是三个默认配置冲突叠加:
- Ubuntu 22.04 默认启用
systemd-resolved,导致 PHP 的gethostbyname()在容器或某些扩展里超时(尤其连接 MySQL 时) - Kamatera 新开的 Ubuntu 22.04 实例默认没装
php-mysql、php-curl、php-xml,而 Laravel 11 启动时就依赖这些扩展做服务提供者注册 - Laravel 11 的
bootstrap/app.php要求中间件组显式声明,但很多迁移脚本仍沿用旧版app/Http/Kernel.php,结果Route::middleware('web')找不到组,直接报Middleware group [web] does not exist
必须手动执行的三步初始化(绕过所有“一键部署”陷阱)
在 Kamatera 创建好 Ubuntu 22.04 实例后,SSH 登录,立即执行:
-
先关掉 systemd-resolved 并切回传统 DNS:
sudo systemctl stop systemd-resolvedsudo systemctl disable systemd-resolvedecho "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf -
装全 Laravel 11 硬性依赖(缺一不可):
sudo apt update && sudo apt install -y php8.2-cli php8.2-mysql php8.2-curl php8.2-xml php8.2-mbstring php8.2-zip php8.2-bcmath php8.2-opcache php8.2-fpm nginx mysql-server
注意:必须是php8.2开头的包名,Ubuntu 22.04 默认仓库不带php8.4,而 Laravel 11 明确禁用 8.4.x -
确认并修复 Laravel 11 的入口逻辑:
检查bootstrap/app.php是否包含完整的->withMiddleware()块:$middleware->web(); $middleware->api();
如果缺失,补上;如果用了append:,确保类路径正确(如\App\Http\Middleware\EnsureEmailIsVerified::class),然后运行composer dump-autoload
nginx 配置必须改这三处,否则 403 或 502
编辑 /etc/nginx/sites-available/laravel,关键项不能抄模板:
-
root必须指向/var/www/html/public(不是项目根目录) -
fastcgi_pass必须写成unix:/run/php/php8.2-fpm.sock(Ubuntu 22.04 下 socket 路径固定,不是php8.2-fpm.sock或php-fpm.sock) - 加一行
client_max_body_size 100M;,否则上传大文件直接 413
启用后别忘了:sudo ln -sf /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/,再 sudo nginx -t && sudo systemctl reload nginx。
MySQL 连接失败?大概率是默认 strict 模式 + Laravel 11 迁移默认 ->default(now())
->default(now())
Ubuntu 22.04 自带 MySQL 8.0,默认开启 STRICT_TRANS_TABLES。而 Laravel 11 新建迁移会自动给 created_at 加 ->default(now()),MySQL 8.0 虽支持,但如果你用的是 Kamatera 控制台一键部署的 MySQL(可能降级到 5.7),就会报:Invalid default value for 'created_at'
- 临时解法(仅开发):
sudo mysql -e "SET GLOBAL sql_mode='';" - 长期解法(推荐):进 MySQL 执行
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'STRICT_TRANS_TABLES',''));,再在/etc/mysql/mysql.conf.d/mysqld.cnf的[mysqld]下加一行:sql_mode = "NO_ENGINE_SUBSTITUTION" - 更稳妥:修改迁移文件,把
->default(now())换成->useCurrent()(Laravel 11 兼容)
Kamatera 的网络模型是纯公有云 NAT,没有内网穿透或自定义子网,所以别折腾 Docker Compose 的内部网络——直接用宿主机 LEMP 栈最稳。真正容易被忽略的点是:php8.2-fpm 的 www.conf 里 listen.owner 和 listen.group 必须设为 www-data,否则 nginx 和 php-fpm 权限不通,502 就静默发生。











