如何在Ubuntu上部署Laravel生产环境?

来源:Vuejs社区作者:松本一香头衔:网络博主
导读:本期聚焦于松本一香创作的《如何在Ubuntu上部署Laravel生产环境?》,敬请观看详情。为什么Laravel应用在本地开发一切正常,部署到Ubuntu服务器后却频繁出现500错误或白屏?问题往往不在业务代码,而是PHP扩展、目录权限、Nginx重写规则和进程守护等运维细节没有配置到位。本文以全新Ubuntu系统为例,完整介绍生产环境部署流程:从安装Nginx、PHP-FPM、MySQL、Composer,到拉取项目代码、配置.env、设置storage与bootstrap/cache目录权限。同时会说明如何通过Supervisor守护队列进程、配置cron执行定时任务,以及启用OPcache和缓存优化指令。按照文中步骤操作,你可以把Laravel应用稳定运行在Ubuntu上,减少上线后常见的配置类故障,提升部署成功率。

在Ubuntu上部署Laravel生产环境,核心思路是用Nginx作为Web服务器,通过FastCGI把请求交给PHP-FPM处理,并使用MySQL存储数据。部署前需要确认服务器具备root或sudo权限,操作系统建议使用Ubuntu 22.04或24.04 LTS长期支持版本。本文以全新安装的Ubuntu服务器为例,逐步完成从环境搭建到应用上线的全过程。

如何在Ubuntu上部署Laravel生产环境?

一、安装Nginx、MySQL与基础工具

Laravel生产环境通常不依赖Apache,Nginx的高并发处理能力和低内存占用更适合PHP-FPM架构。MySQL或MariaDB负责持久化数据,后续Laravel通过PDO扩展连接数据库。先更新系统软件源,确保所有软件包版本最新。

sudo apt update
sudo apt upgrade -y
sudo apt install nginx mysql-server -y

安装完成后,启动Nginx和MySQL服务,并设置开机自启。可以使用systemctl命令检查服务状态,确保没有因为端口冲突或依赖问题启动失败。MySQL安装后默认只监听本地socket,生产环境如需远程连接,需要额外修改绑定地址并创建授权用户。

sudo systemctl enable --now nginx
sudo systemctl enable --now mysql
sudo systemctl status nginx
sudo systemctl status mysql

安全方面,建议立即运行MySQL自带的安全脚本,设置root密码、移除匿名用户和测试数据库。这一步能显著降低数据库被攻击的风险。如果服务器有防火墙,还需放行80和443端口,保证HTTP与HTTPS流量可以正常进入。

二、安装PHP-FPM及Laravel所需扩展

Laravel 10及以上版本要求PHP 8.1或更高版本,Ubuntu 22.04默认仓库提供PHP 8.1,Ubuntu 24.04则提供PHP 8.3。除了php-fpm本身,还需要安装Laravel运行所需的常用扩展,包括mbstring、xml、curl、zip、mysql和sqlite等。

sudo apt install php8.3-fpm php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip php8.3-bcmath php8.3-gd php8.3-intl -y

安装完成后,可以修改php.ini配置文件,调整上传文件大小、执行时间和内存限制。生产环境建议关闭display_errors,避免错误信息直接暴露给用户。使用sed命令可以快速替换默认值,也可以手动编辑/etc/php/8.3/fpm/php.ini文件。

sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 20M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/post_max_size = 8M/post_max_size = 24M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.3/fpm/php.ini
sudo sed -i 's/display_errors = On/display_errors = Off/' /etc/php/8.3/fpm/php.ini

修改完配置后,重启PHP-FPM进程使设置生效。PHP-FPM默认以www-data用户运行,后续Nginx也需要通过这个用户与PHP进程通信,因此项目目录的所有者必须提前规划好,避免权限不足。

三、安装Composer并拉取Laravel项目

Composer是PHP的依赖管理工具,Laravel项目通过它加载框架核心和第三方包。下载Composer的官方安装脚本,然后将其移动到全局可执行目录,这样在任何位置都可以直接调用composer命令。

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

项目代码可以通过Git仓库克隆到服务器,也可以使用Composer创建全新项目。如果已有项目仓库,推荐使用Git部署,方便后续回滚和版本管理。将项目放置到/var/www/laravel目录,并切换到对应分支。

sudo mkdir -p /var/www/laravel
sudo chown -R $USER:www-data /var/www/laravel
cd /var/www/laravel
git clone https://github.com/yourname/your-laravel-app.git .
composer install --no-dev --optimize-autoloader --no-interaction

生产环境必须使用composer install而不是composer update。install会严格按照composer.lock文件安装指定版本,保证依赖一致性,避免更新引入未测试的代码。加上--no-dev参数可以跳过开发依赖,减少生产服务器的文件数量和潜在攻击面。

四、配置Nginx站点与伪静态

Laravel的入口文件位于public/index.php,所有HTTP请求都应指向public目录,而不是项目根目录。Nginx的root指令要设置为/var/www/laravel/public,并配置try_files规则,让不存在的文件请求转发给index.php处理。

server {
    listen 80;
    server_name ippipp.com;
    root /var/www/laravel/public;
    index index.php index.html;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

上述配置中,location ~ \.php$匹配所有以.php结尾的请求,并通过Unix socket交给PHP-FPM处理。注意fastcgi_param SCRIPT_FILENAME使用$realpath_root可以避免路径穿越问题。最后的location块会拒绝访问隐藏文件,但保留.well-known目录用于SSL证书验证。

创建配置文件后,将其软链接到Nginx的sites-enabled目录,然后测试配置语法并重载Nginx。如果测试失败,Nginx不会中断运行,但新配置不会生效,必须排查错误后再继续。

sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

五、设置目录权限与环境变量

Laravel运行时需要写入storagebootstrap/cache目录,用于保存日志、缓存、编译后的视图等文件。这两个目录必须对Nginx运行的www-data用户可写。推荐将目录所有者设置为www-data,权限设置为775,避免使用777这种过于宽松的权限。

cd /var/www/laravel
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache

环境配置方面,复制.env.example.env并生成应用密钥。然后编辑.env文件,填入数据库连接信息、应用URL和队列驱动等。生产环境必须设置APP_ENV=productionAPP_DEBUG=false,关闭调试模式可以避免泄露敏感堆栈信息。

cp .env.example .env
php artisan key:generate
php artisan migrate --force

数据库迁移时加上--force参数,确认生产环境执行。因为Laravel为防止在production环境下误操作,默认会提示确认。执行迁移前确保数据库已创建,并且.env中的数据库账号拥有足够权限。迁移完成后,可以运行php artisan db:seed填充初始数据,但要注意幂等性。

六、使用Supervisor守护队列与调度

Laravel队列通常使用Redis或数据库驱动,生产环境需要常驻进程来处理队列任务。如果直接在前台运行php artisan queue:work,终端断开后进程就会结束,所以需要使用Supervisor来守护队列进程。Supervisor可以自动重启意外退出的进程,保证任务持续消费。

sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/laravel-worker.conf

写入以下配置,指定队列进程数量、用户和日志路径。进程数量可以根据服务器CPU核数和任务密度调整,一般2到4个即可满足中小型应用。

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel/storage/logs/worker.log
stopwaitsecs=3600

定时任务方面,Laravel使用单个cron条目调用调度器。编辑www-data用户的crontab,添加每分钟执行schedule:run的命令。调度器会检查定义在routes/console.phpapp/Console/Kernel.php中的任务,并按计划执行。

sudo crontab -u www-data -e
* * * * * php /var/www/laravel/artisan schedule:run >> /dev/null 2>&1

确保cron服务已启用并运行。如果任务日志需要保留,可以将标准输出重定向到指定文件,而不是丢弃到/dev/null。配置完成后,使用supervisorctl rereadupdate命令重新加载配置,再通过status查看队列进程是否启动成功。

七、生产环境性能优化与安全建议

上线前后建议执行Laravel的优化命令,缓存配置、路由和视图可以显著减少请求处理时间。需要注意的是,执行config:cache后,.env文件的修改不会立即生效,必须重新运行缓存命令。因此日常开发环境不建议执行,生产环境部署完成后执行即可。

php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache

启用PHP OPcache可以避免每次请求都重新解析和编译PHP文件。编辑php.ini,设置合适的opcache.memory_consumptionopcache.validate_timestamps。生产环境可以将validate_timestamps设为0,表示代码更新后需要手动重启PHP-FPM才能刷新缓存。

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

安全方面,除了关闭debug模式,还应限制敏感目录访问、使用HTTPS、定期更新系统补丁和依赖包。Nginx配置中已添加了基本安全响应头,还可以考虑配置SSL证书并强制跳转HTTPS。数据库用户应遵循最小权限原则,不要给应用账号全局管理员权限。日志文件要定期轮转,避免占用过多磁盘空间。

完成以上步骤后,Laravel应用已经在Ubuntu服务器上稳定运行。日常维护时,重点监控队列进程是否正常运行、cron任务是否按时执行,并在代码更新后重新运行缓存命令和重启队列进程。这样可以将生产环境故障率降到最低,让应用持续可靠地对外提供服务。

Ubuntu部署LaravelLaravel生产环境Nginx配置修改时间:2026-08-29 21:21:58

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。