十分钟上线- CodeIgniter 项目迁移到函数计算

 容器服务Docker K8S     |      2019-12-16 00:00:00

原文作者:txd123
原文链接:https://developer.aliyun.com/article/727023

更多云原生相关资讯可关注阿里巴巴云原生技术圈

前言

阿里云函数计算 Function Compute(FC),旨在帮助用户采用弹性伸缩、动态分配资源的方式,来执行业务函数。让用户无需购买部署服务器,无需考虑业务负载,就能快速搭建可处理高并发的后台服务。
本文介绍 HTTP 触发器快速迁移 CodeIgniter 应用到函数计算。函数计算运行 PHP 框架原理可以参考一下《十分钟上线-函数计算玩转 WordPress》。

案例概览

在本教程中,我们讲解如何利用函数计算一步一步来构建 Web 的 Server 端,该案例是把一个 CodeIgniter 部署到函数计算,本文旨在展示函数计算做 Web Backend 能力,具体表现为以下几点:

完善的 PHP 系统迁移到 FC 的成本不高
FC 打通了专有网络 VPC 功能,用户的函数可以配置访问专有网络的云资源,比如本案例中:nas
案例体验入口:

体验地址:http://support.mofangdegisn.cn/

案例开发配置步骤

  1. CodeIgniter 项目同步到 nas 上

在本地创建一个函数的根目录,在该目录下创建 template.yml 文件,内容如下:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  Wkhtmltopdf:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Role: 'XXXX'
      LogConfig:
        Project: XXX
        Logstore: XXX
      VpcConfig:XXX
        VpcId: 
        VSwitchIds:
          - XXX
        SecurityGroupId: XXXX
      NasConfig:
        UserId: 10003
        GroupId: 10003
        MountPoints:
          - ServerAddr: 'XXXX'
            MountDir: /mnt/www
    CodeIgniter:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        Runtime: php7.2
        CodeUri: './index.php'
      Events:
         httpTrigger:
             Type: HTTP
             Properties:
               AuthType: ANONYMOUS
               Methods:
                  - GET

当然您这边也可以使用fun工具提供的 NasConfig: Auto 配置,可以自动生成 nas 相关配置,具体步骤可以参考:https://yq.aliyun.com/articles/712693

fun 工具进入之前创建的函数根目录下后执行,fun nas info 查看 nas 的相关信息

image.png

我们把 CodeIgniter 项目放在刚刚执行 fun nas info 命令查看到的本地 nas 录下。

image.png

最后使用 fun nas sync 将本地 nas 资源同步到 nas 服务:

image.png

使用 fun 工具把本地资源同步到 nas 上具体步骤可以参考:https://yq.aliyun.com/articles/712700

  1. 创建函数入口文件

在函数根目录下创建一个 index.php 文件,文件内容如下:

<?php
#自定义的域名,绑定了自定义域名的,可以换成自己自定义的。
$MY_HOST    = "support.mofangdegisn.cn";
#web目录,CodeIgniter框架默认是根目录
$WWW_DIR = '/mnt/www/CodeIgniter';

function handler($request, $context){

    #如果不使用函数计算后台提供的域名,这句可以注释掉。
    if(strpos($request->getAttribute("requestURI"),"/2016-08-15/proxy") !== false) $request = clearFcHost($request,$context);#兼容 fc后台的url地址

    $uri  = $request->getAttribute("requestURI");
    $file = explode("?", $uri)[0];
    if($file=='/') $uri='/';#
    $file = $GLOBALS['WWW_DIR'].$file;

    if(file_exists($file) and $uri!='/'){
        if(strpos($uri,".php")) return php_run(basename($file), $request, $context);#php_run
        return static_run($uri);#static_run
    }

    $request = $request->withAttribute("requestURI", "?s=".$uri);
    return php_run('index.php', $request, $context);# php_run CodeIgniter框架入口 index.php

}

function php_run($name,$request, $context)
{
    return $GLOBALS['fcPhpCgiProxy']->requestPhpCgi($request, $GLOBALS['WWW_DIR'], $name,['SERVER_NAME' => $GLOBALS['MY_HOST'], 'SERVER_PORT' => '80', 'HTTP_HOST' => $GLOBALS['MY_HOST']],['debug_show_cgi_params' => false, 'readWriteTimeout' => 15000]);
}
use RingCentralPsr7Response;
function static_run($uri): Response{
    $file_dir = $GLOBALS['WWW_DIR'].$uri; #完整文件路径
    $file_dir = explode("?", $file_dir)[0]; #去掉动态路径
    if(is_dir($file_dir)) $file_dir .= '/index.html';# 可以这里定义目录的默认索引页
    $handle   = fopen($file_dir, "r");
    $contents = fread($handle, filesize($file_dir));
    fclose($handle);
    return new Response(200, ['Content-Type'  => $GLOBALS['fcPhpCgiProxy']->getMimeType($file_dir),'Cache-Control' => "max-age=8640000",'Accept-Ranges' => 'bytes'], $contents);
}

function clearFcHost($request,$context){
    $uri  = $request->getAttribute("requestURI");
    $uri  = str_replace("/2016-08-15/proxy/".$context['service']['name']."/".$context['function']['name'],"",$uri);
    $request = $request->withAttribute("requestURI", $uri);
    return $request;
}

#错误处理
function error($code) {
    #if($resp->getStatusCode() !=200) return error($resp->getStatusCode());
    return 'Codelgniter框架测试~~';
}

执行 fun deploy 部署函数,部署成功如图!
image.png

最后给服务函数绑定自定义域名详情。

总结

函数计算有如下优势:

  • 无需采购和管理服务器等基础设施
  • 专注业务逻辑的开发
  • 提供日志查询、性能监控、报警等功能快速排查故障
  • 以事件驱动的方式触发应用响应用户请求
  • 毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力
  • 按需付费。只需为实际使用的计算资源付费,适合有明显波峰波谷的用户访问场景
  • 除了上面所列的优势,FC 可以做为 Web Backend,只需要编写一个函数实现传统 Web 服务器中的 conf 中的逻辑,就可以将一个完整的 Web 工程迁移到 FC ,从而从传统的 Web 网站运维,监控等繁琐的事务中解放出来。

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”