Laravel 10生产环境部署须用Nginx+PHP8.1+MySQL,禁用php artisan serve;需安装指定扩展、正确配置.env与Nginx root指向public、运行migrate --force及supervisor管理队列,并清空三重缓存。

直接上生产环境跑 Laravel 10,别碰 php artisan serve —— 它只适合本地调试,没 HTTPS、没进程管理、没静态文件处理,上线等于裸奔。
确认 PHP 8.1+ 和必要扩展已就位
Ubuntu 22.04 默认带 PHP 8.1,但 Laravel 10 明确要求 mbstring、xml、bcmath、ctype、json、openssl、pdo、tokenizer、xml、curl,少一个都报错 Class "Illuminate\Foundation\Application" not found 或直接 500。
- 先执行
sudo apt update && sudo apt install -y php8.1-cli php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-ctype php8.1-json php8.1-opcache php8.1-pdo php8.1-tokenizer php8.1-curl php8.1-zip - 检查是否启用:运行
php -m | grep -E "(mbstring|xml|bcmath)",输出应有对应模块名 - 如果用 MySQL,额外装
php8.1-mysql;用 PostgreSQL 就换php8.1-pgsql
用 Composer 创建项目时指定 Laravel 10.x 版本
不加约束直接 composer create-project laravel/laravel . 可能拉到 Laravel 11(如果 Composer 镜像已同步),而 Laravel 11 要求 PHP 8.2+,在 Ubuntu 22.04 默认 PHP 8.1 下会失败。
- 明确指定版本:
composer create-project laravel/laravel:^10.0 . - 创建完立刻改权限:
sudo chown -R $USER:www-data storage bootstrap/cache,再chmod -R 775 storage bootstrap/cache -
.env里至少配好APP_KEY(运行php artisan key:generate)、DB_CONNECTION、DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD
Nginx 配置必须指向 public/ 目录且禁用 script.php 访问
常见错误是 Nginx root 设成项目根目录,结果用户能直接访问 .env 或 config/database.php —— 这不是配置失误,是安全漏洞。
- root 必须设为
/var/www/your-laravel-app/public,不是项目根目录 - 在 server 块里加这两行,堵死敏感路径:
location ~ \.php$ { ... }块内加fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;;再加location ~ /\.(env|git|htaccess) { deny all; } - 务必测试重写规则:
location / { try_files $uri $uri/ /index.php?$query_string; }缺了这句,所有路由返回 404
部署后第一个要验证的不是首页,而是 artisan migrate 和 queue:work
很多团队卡在“页面能打开但登录报错”,其实是因为 migrate 没跑或 queue:work 没启,而 Laravel 10 默认把邮件验证、通知、事件广播全扔进队列。
- 手动跑迁移:
php artisan migrate --force(生产环境必须加--force) - 队列不能靠
php artisan queue:work前台运行 —— SSH 断开就停。要用supervisor管理:sudo apt install supervisor,然后写配置到/etc/supervisor/conf.d/laravel-worker.conf,最后sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl start laravel-worker:* - 缓存清不干净?连清三遍:
php artisan config:clear && php artisan cache:clear && php artisan view:clear
最常被跳过的一步:检查 storage/logs/laravel.log 权限和 SELinux(虽然 Ubuntu 默认不用 SELinux,但如果你从 CentOS 迁移过来或手动启用了它,setenforce 1 会让所有写操作静默失败)。


















