使用Docker 打包部署Laravel 应用

Laravel是目前最流行的PHP框架,特点是开发速度快,当然部署也麻烦。

传统部署流程:

  • Composer安装依赖
  • 使用Apache/Nginx进行部署Laravel的Web接口
  • 使用Supervisor作为Laravel队列服务的进程守护
  • 设置crontab定期执行Laravel的定时任务

看起来,每次部署Laravel还是挺麻烦的,有了Docker后,我们可以使用Docker的特性来集成基本的部署操作,并且由于容器的特性,还可以使的应用跑的时候更加安全。

使用Apache打包基础镜像

这里我们使用的基础镜像为: php:7.1-apache,之后可以使用docker-php-ext-install安装我们需要的PHP扩展。

完整的Apache基础镜像Dockerfile参见Github.

使用Composer安装依赖

用Supervisor跑Queue,Crontab以及Web

与传统部署方式不同的是,Docker有入口点的概念,当入口点改为Supervisor后,作为Web的apache将不会启动,所以,这里我们也需要用Supervisor以及cronjob.

使用bash来模拟cronjob:

完成的Supervisor配置参见Github.

在Docker里安装Supervisor:

入口点修改

首先, 打包的时候,进行Laravel的cache以提高性能。


php artisan route:cache && php artisan view:clear

Dockerfile里修改入口点:

完整的Dockerfile见Github.

在自己的Laravel项目中快速打包

使用Docker的ONBUILD特性,我做了个基础镜像,只需要在自己的Laravel项目的Dockerfile中改为:

即可快速方便的构造Docker镜像!

用Nginx反代运行于Apache的Laravel

很早之前,我把自己的vps从apache切换到了nginx,那时候是因为vps性能不好,能省就省。

后来经常遇到php5-fpm挂掉等各种情况导致跑php程序经常会502,于是,从去年开始,我开始将我的php站点逐步切换至apache,并使用nginx进行反代。

这时候,其实很想吐槽php,还得弄个apache来跑….

后来,当开始反代一些laravel写的网站的时候,遇到了一些坑,所以写这篇文章记录下。

Apache配置

假设我们这里用9000端口在apache监听了一个vhost,具体配置就不写了XD

Nginx配置

http的vhost配置:

如果是https反代,我们需要进行额外的配置:

注意新增的几个ssl相关的配置来告诉Laravel是ssl访问哦,同时,我们还要配置下Laravel。

Laravel 配置

以下配置以Laravel5.2为例。

在 app\Providers\RouteServiceProvider.php 中,我们需要修改以下函数:

至此,反代的laravel app中,通过assets(),url()等函数产生的url都会是https.