title: 部署 Laravel 应用

src: posts/2022-12-16-部署 Laravel 应用.md

change log: None

created at: Jan. 24, 2026, 12:39 p.m., last updated: Jan. 24, 2026, 12:39 p.m.

部署 Laravel 应用

本文在树莓派 400 上实现

LAMP 软件栈

本文使用传统的 LAMP 技术栈 debian (raspberry os) + apache + php + mariadb

现成的方法:

直接使用 apt 部署的方法安装的是默认 php 版本,如果新项目不在乎 laravel 版本,可以这么玩。但是现在 php 更新地很快,项目也不一定是重新开始的项目,这些时候就得自己编译对应的版本了。

安装系统库

apt-get install \
    sqlite3 \
    openssl \
    libxml2-dev \
    libssl-dev \
    libsqlite3-dev \
    -y

树莓派从源码编译 php

以树莓派安装 php 8.2.8 为例需要需指定的 php 版本

./configure \
    --with-curl \
    --with-mysqli \
    --with-openssl \
    --enable-sockets  \
    --with-zlib \
    --enable-fileinfo \
    --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf 
make -j 3 # 树莓派 4 有 4 个 cpu,我们用 n - 1 个 cpu 并行编译
# 如果是内存比较小的 1 GB 的树莓派,-j 3 会内存不够

make install

安装 composer

wget https://getcomposer.org/download/latest-stable/composer.phar
chmod +x composer.phar
mv composer.phar /usr/local/bin/composer

开发环境 和 生产环境

以项目 Laravel-pi 为例 。我一共有 4 块树莓派,分别是 1代,2代,3代,4代。其中每一台都有一个生产环境,在目录 /var/www/laravel-pi 下面。每一台树莓派都有若干个开发环境,用于平时调试代码。

二者的不同在于:

| | 开发环境 | 生产环境 | | - | - | - | | http 执行程序 | php -S xxx | apache httpd | | 网站的生命周期 | 一次会话 | 有守护进程 | | http 执行用户 | pi(开发者) | www-data(不受信任的网页用户)| | 工作路径(workspace) | /home/pi/xx (随意) | /var/www/laravel-pi | | laravel-pi/.env 文件配置 | 随意 | 需要谨慎配置 | | laravel-pi cron job | 执行 cron file | ? | | laravel-pi queue worker | 执行 systemd unit | ? |

docker 部署 和 裸机部署

无论是 docker 部署 和 裸机部署,原理都是一样的,作为 web 应用,关键是梳理好各个进程之间的关系。裸机部署的时候有很多现成的工具和守护进程,在 docker 端则把每个守护进程交给一个 docker container。对于 Laravel 的应用,我们需要考虑以下进程的实现:

如果不想使用专用的 CI/CD 软件(例如 Jenkins)来自动部署,还需要一个简单的镜像做热更新。因为 php 代码不用编译,一个简单的轮询更新就够了。

进程1: web 服务(httpd + php)

部署到 /var/www/

在安装完 apache2 之后,你会在 Apache2 Debian Default Page 看到这句话:

The default Debian document root is /var/www/html. You can make your own virtual hosts under /var/www. This is different to previous releases which provides better security out of the box.

遵循 debian 的建议,我们把工程新建在 /var/www/laravel-pi 下面。当然其他地方也没关系,只要写好 apache vhost 配置文件就可以了。

sudo mkdir /var/www/laravel-pi

使用 www-data 用户部署

出于安全考虑,默认 apache 会使用一个受限制的用户 www-data 来运行 php 脚本。这个用户不能登录也没有自己的 home 目录。

当然你也可以换个有其他权限的用户,例如你自己(这同样危险,我猜你有 sudo 权限)。只需修改 /etc/apache2/envvars 即可

sudo sed -i "s/www-data/pi/g" /etc/apache2/envvars
sudo systemctl restart apache2

如果是一个普普通通的 php 工具,例如 adminer https://packages.debian.org/bullseye/all/adminer/filelist , 只要让 www-data 就行了。

但这 laravel 是一个重量级的框架,其中有很多 cli 命令需要改写文件。另外想用 git 在线升级也需要目录的写权限。这时候一个折中的方法是直接把目录所有权给 www-data:

sudo chown www-data:www-data /var/www/laravel-pi

然后使用 www-data 用户来全权处理整个文件夹:

cd /var/www/laravel-pi
sudo -u www-data git init
sudo -u www-data git pull https://gitee.com/yongtian/laravel-pi.git
sudo -u www-data cp .env.example .env
sudo -u www-data php artisan key:generate
...

对于最小权限原则,请勿 chmod 777 -R xxxx

进程2:计划任务(Task Scheduling)

这件事情一般在部署的时候加。

sudo -u www-data crontab -e

写入如下字段:

* * * * * php /var/www/laravel-pi/artisan schedule:run >> /dev/null 2>&1

当然也可以让用户来开启和关闭,laravel-pi 在 admin 页面可以在线配置 cron job,二者是等价的。

详情参考官方文档

:::TIPS 计划任务的时间间隔一般以分钟为单位 :::

进程3:队列执行器(Queue worker)

ref