CF Lumen 教程,使用 Cloud Foundry 从零部署 Lumen API

本文中的“CF”指 Cloud Foundry,一个很流行的开源 PaaS 平台,如果你说的 CF 是 Cloudflare,也可以直接跳到文末查看补充说明。

Lumen 是什么?为什么用 Cloud Foundry?

Lumen 是 Laravel 官方推出的 PHP 微框架,它保留了 Laravel 的优雅语法,但更轻量,非常适合开发 API、微服务和中间件。

CF Lumen 教程,使用 Cloud Foundry 从零部署 Lumen API

Cloud Foundry(CF) 是一个应用托管平台,开发者只需要通过 cf push 命令,就能把应用部署到云端,不用花太多时间折腾服务器、Nginx、PHP-FPM 这些环境。

CF + Lumen 是一种很适合做快速 API 开发的组合。

准备工作

开始之前,你需要准备以下环境:

  1. 一个 Cloud Foundry 账号,以及平台提供的 API 地址。
  2. 本地安装 cf 命令行工具。
  3. 本地安装 PHP 7.4 或更高版本。
  4. 安装 Composer。

确认 cf 能正常使用:

cf --version

如果还没登录,可以先登录:

cf login -a https://api.your-cf.example.com

创建 Lumen 项目

使用 Composer 创建 Lumen 项目:

composer create-project --prefer-dist laravel/lumen lumen-demo

进入项目目录:

cd lumen-demo

复制环境配置:

cp .env.example .env

生成一个 APP_KEY,用于 Lumen 的加密功能:

php -r "echo bin2hex(random_bytes(16));"

把生成的字符串填入 .env 文件:

APP_NAME=LumenDemo
APP_ENV=production
APP_DEBUG=false
APP_KEY=你生成的随机字符串

先本地跑起来测试一下:

php -S 0.0.0.0:8080 -t public

访问 http://localhost:8080,如果能看到 Lumen 版本信息,说明项目创建成功。

添加一个简单的 API 路由

打开 routes/web.php,添加一个测试接口:

<?php
/** @var \Laravel\Lumen\Routing\Router $router */
$router->get('/', function () use ($router) {
    return $router->app->version();
});
$router->get('/api/ping', function () {
    return response()->json([
        'status' => 'ok',
        'message' => 'pong',
        'time' => time(),
    ]);
});

再测试一下:

php -S 0.0.0.0:8080 -t public
curl http://localhost:8080/api/ping

如果返回 JSON 数据,说明路由没问题。

准备 Cloud Foundry 部署配置

在项目根目录创建 manifest.yml 文件:

applications:
  - name: lumen-demo
    memory: 128M
    disk_quota: 256M
    instances: 1
    buildpack: php_buildpack
    path: .
    command: heroku-php-apache2 public/
    env:
      APP_ENV: production
      APP_DEBUG: false
      APP_KEY: 你生成的随机字符串

这里的重点:

  • buildpack 使用的是 Cloud Foundry 的 PHP 构建包。
  • command 里的 heroku-php-apache2 是 PHP 构建包提供的 Web 服务器启动命令。
  • public/ 是 Lumen 应用的 Web 根目录,这个很关键,否则访问会 404。

如果你的 Cloud Foundry 平台支持 Nginx,也可以改成:

command: heroku-php-nginx public/

不同平台的 PHP 构建包版本可能略有差异,以平台文档为准。

推送部署到 Cloud Foundry

先确认当前所在的 org 和 space:

cf target -o 你的组织 -s 你的空间

如果没有 space,可以创建:

cf create-space lumen-demo
cf target -s lumen-demo

然后直接推送:

cf push

Cloud Foundry 会读取 manifest.yml,上传代码,安装 PHP 依赖,然后启动应用。

部署完成后,控制台会输出应用地址,

urls: ["lumen-demo.apps.your-cf.example.com"]

访问测试:

curl https://lumen-demo.apps.your-cf.example.com/api/ping

如果返回:

{
  "status": "ok",
  "message": "pong",
  "time": 1690000000
}

说明已经部署成功。

查看日志和排查问题

如果部署有问题,可以先看日志:

cf logs lumen-demo --recent

常见的坑:

  1. 访问 正常,访问其他路径 404
    多半是 Web 根目录没指向 public,检查 manifest 里的启动命令。

  2. PHP 扩展缺失
    可以在项目 composer.json 里声明需要的扩展,或者参考 Cloud Foundry PHP buildpack 的配置方式安装扩展。

  3. 环境变量没生效
    检查 manifest.yml 里的 env 是否写对,也可以执行:

    cf env lumen-demo

查看当前应用的环境变量。

扩缩容与版本更新

Cloud Foundry 扩容非常方便:

cf scale lumen-demo -i 2 -m 256M

修改代码后,重新执行:

cf push

Cloud Foundry 会使用滚动方式更新应用实例,尽量保证服务不中断。

补充:如果你说的 CF 是 Cloudflare

很多人也把 Cloudflare 简称为 CF。

Lumen 应用部署到服务器或 Cloud Foundry 后,同样可以接入 Cloudflare:

  1. 在 Cloudflare DNS 中添加一个记录,指向你的应用域名。
  2. 开启 Proxy 代理(橙色云图标)。
  3. SSL/TLS 模式选择 Full (Strict)。
  4. Lumen 跑在 Nginx 后面,可以在 Nginx 中配置:
set_real_ip_from 173.245.48.0/20;
real_ip_header CF-Connecting-IP;

这样应用就能拿到用户真实 IP。

  1. 对于 /api/ 这种动态接口,不建议直接缓存;如果要缓存静态资源,可以单独配置 Cache Rules 或 Page Rules。

Lumen 轻量,Cloud Foundry 部署方便,两者结合非常适合作 API 服务,只要把本地 Lumen 项目准备好,写一个 manifest.yml,然后执行 cf push,就能完成上线,遇到问题多看 cf logs,部署一次以后,你会觉得整个过程非常简单。