原文作者: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/
案例开发配置步骤
- 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 的相关信息
我们把 CodeIgniter 项目放在刚刚执行 fun nas info 命令查看到的本地 nas 录下。
最后使用 fun nas sync 将本地 nas 资源同步到 nas 服务:
使用 fun 工具把本地资源同步到 nas 上具体步骤可以参考:https://yq.aliyun.com/articles/712700
- 创建函数入口文件
在函数根目录下创建一个 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 RingCentral\Psr7\Response;
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 部署函数,部署成功如图!
最后给服务函数绑定自定义域名详情。
总结
函数计算有如下优势:
- 无需采购和管理服务器等基础设施
- 专注业务逻辑的开发
- 提供日志查询、性能监控、报警等功能快速排查故障
- 以事件驱动的方式触发应用响应用户请求
- 毫秒级别弹性伸缩,快速实现底层扩容以应对峰值压力
- 按需付费。只需为实际使用的计算资源付费,适合有明显波峰波谷的用户访问场景
- 除了上面所列的优势,FC 可以做为 Web Backend,只需要编写一个函数实现传统 Web 服务器中的 conf 中的逻辑,就可以将一个完整的 Web 工程迁移到 FC ,从而从传统的 Web 网站运维,监控等繁琐的事务中解放出来。
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”