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.
本文在树莓派 400 上实现
本文使用传统的 LAMP 技术栈 debian (raspberry os) + apache + php + mariadb
现成的方法:
直接使用 apt 部署的方法安装的是默认 php 版本,如果新项目不在乎 laravel 版本,可以这么玩。但是现在 php 更新地很快,项目也不一定是重新开始的项目,这些时候就得自己编译对应的版本了。
apt-get install \
sqlite3 \
openssl \
libxml2-dev \
libssl-dev \
libsqlite3-dev \
-y
以树莓派安装 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
--build=arm-linux-gnueabihf --host=arm-linux-gnueabihf , 否则不注意 make 一下就会有汇编代码的报错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 部署 和 裸机部署,原理都是一样的,作为 web 应用,关键是梳理好各个进程之间的关系。裸机部署的时候有很多现成的工具和守护进程,在 docker 端则把每个守护进程交给一个 docker container。对于 Laravel 的应用,我们需要考虑以下进程的实现:
如果不想使用专用的 CI/CD 软件(例如 Jenkins)来自动部署,还需要一个简单的镜像做热更新。因为 php 代码不用编译,一个简单的轮询更新就够了。
在安装完 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
出于安全考虑,默认 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
这件事情一般在部署的时候加。
sudo -u www-data crontab -e
写入如下字段:
* * * * * php /var/www/laravel-pi/artisan schedule:run >> /dev/null 2>&1
当然也可以让用户来开启和关闭,laravel-pi 在 admin 页面可以在线配置 cron job,二者是等价的。
详情参考官方文档
:::TIPS 计划任务的时间间隔一般以分钟为单位 :::