百度应用部署秘籍
【背景介绍】
传统 PaaS 采用 sandbox 实现 app 间的资源安全隔离,sandbox 需要对运行环境和编程语言进行底层的功能限制,例如:禁止创建进程和线程,禁止部分系统调用,禁止对某些系统路径的读写,禁止加载 C 语言模块,禁止某些网络功能等,这大大增加了开发者的开发成本,也使得应用开发和跨平台迁移难度叫交接和学习成本变大,不利于平台的推广。另外困扰开发者的一个主要问题就是应用的云端运行环境与开发者的本地开发环境不一致,很多功能受到限制。开发者在本地开发调试好的应用,发布到云端就遇到沙盒限制问题无法运行,不得不针对云端环境进行修改。BAE 采用轻量虚拟机技术进行资源隔离,在运行环境和编程语言层面,不做任何限制;应用在云端的运行环境与开发者本地的开发环境保持一致,从而使得学习成本、开发和迁移成本降到最低,开发者的生产力得到最大限度的解放。下图显示沙盒技术实现资源隔离(左)与轻量虚拟机技术实现资源隔离(右)的区别:
一、服务器部署评估
应用部署计算流量可能存在一个逐渐优化的过程,为了防止流量突增引起雪崩效益,针对 php 执行环境(代码为 hello world),对单个执行单元并发 20 时候,qps 达到 530 最高阈值,并发再次提高 qps 会下降,单个执行单元配置:单核,内存 512,带宽 10M 。部分压测数据如下:
注:当前压测数据是对执行单元最简单的吞吐校验。是线上和线下的一个辅助校验,当有后端服务的时候此数据会有量级减少
二、特性
执行单元由运行在轻量虚拟机内的一组进程构成;每个执行单元对应一个轻量虚拟机。开发者无需关心轻量虚拟机的存在,只需关注部署的执行单元即可。
假设有一个 BAE 部署分配了两个执行单元,每个执行单元对应一个轻量虚拟机,执行单元启动后,对应着轻量虚拟机里面的一组进程,包括 lighttpd 和 php-fpm 进程等。若其中一个轻量虚拟机出现故障,BAE 平台自动为其重新分配一个轻量虚拟机,并将执行单元部署到新的轻量虚拟机上,这就是执行单元的迁移。这种技术保证了应用的高可靠性。
运行环境和与编程语言无任何限制:对运行环境和编程语言,包括创建进程、创建线程、系统调用、执行 C 扩展模块、文件系统访问不做任何限制。
多种编程语言支持:目前支持 PHP、Python、Java、Node.js,以后会陆续增加对主流开发语言的支持。目前的 bae4.0 开发者还可以自定义运行环境
编程框架的支持:编程语言层面没有任何限制,相应地支持特定编程语言的所有编程框架。无论是主流还是小众框架,只要能在开发者本地的环境中运行起来,则云端也能运行无阻。
自动安装依赖包:通过配置依赖包文件,云端环境可以自动安装用户指定的依赖包。例如,package.json 是 nodejs-web 部署类型的 NPM 配置文件,用于配置 node.js 编译时的依赖包及启动时的入口文件,从 package.json 配置的依赖包在编译时安装在应用根目录的.bae/node_modules 目录下。相似地,requirements.txt 是 python-web/python-worker 部署类型的用户自定义依赖配置文件,用于配置编译时的依赖包。开发者部署代码时添加 requirements.txt 文件,其中指定的依赖包会下载安装到应用根目录的 deps 目录下。
丰富的服务支持:提供多样性的扩展服务,包括 MySQL、MongoDB、Redis、Log、Port 等。
自由的网络访问:多数 PaaS 对外的网络访问需要通过 HTTP Proxy 或 Socket Proxy 代理出去,而 BAE 对外的网络访问无需代理层的转发。此外,BAE 提供扩展服务 Port,允许开发者自定义对外提供服务的 TCP 端口,从而实现更复杂的业务逻辑。
新增 worker 类型:多数 PaaS 只提供 web 部署类型,BAE 在此基础上提供 worker 类型,主要用于后台任务,例如爬虫,长期运行于后台,不停的去爬取各种网络资源。
本地开发环境:BAE 提供基于跨平台虚拟化工具 VirtualBox 和虚拟机创建工具 Vagrant 的本地开发环境,通过模拟与 BAE 云端执行单元完全一致的虚拟环境,确保本地调试通过的代码部署到云端后可顺利发布,节省了因本地与云端环境不一致导致的调试成本,在一定程度上提高了开发效率。
环境部署:本地开发环境是 BAE 为方便开发者使用 BAE CLI 工具进行本地调试提供的 Ubuntu 虚拟机(12.04.2 LTS, 64bit)。
依赖于跨平台虚拟化工具 VirtualBox 和虚拟机创建工具 Vagrant,本地开发环境通过模拟与 BAE 远端执行单元完全一致的虚拟环境,确保本地调试通过的代码部署到 BAE 后可顺利发布,节省了因本地与远端环境不一致导致的调试成本,在一定程度上提高了开发效率。
注意: 搭建并使用本地开发环境可以帮助开发者绕开本地与远端环境不一致引起的潜在问题,属于可选(optional)范畴,不是使用 BAE 部署 Web 应用的必须操作
Windows 下安装依赖包
A. 下载 localenv 压缩包并解压。
B. 从解压包内的 localenv/SOFTWARE 目录安装 Vagrant 和 Virtual Box
C. 将依赖包的安装路径加入可执行路径 PATH。
单击“开始”,在弹出菜单中右击“计算机”,在下拉菜单中选择“属性”打开系统属性对话框。
单击右侧面板中的“高级系统设置”,打开高级系统设置对话框。
单击“高级”视图右下方的“环境变量”,打开环境变量对话框。
编辑用户可执行路径或系统可执行路径,添加依赖包的安装路径并保存。路径之间需用分号(;)隔开,以默认方式安装依赖包为例,需添加的路径如下所示:
D:\HashiCorp\Vagrant\bin; C:\Program Files\Oracle\VirtualBox\
注意:
修改用户可执行路径仅影响当前用户,修改系统可执行路径将影响所用用户。
Linux 下安装依赖包
A. 下载依赖包。Vagrant (版本高于 1.2.2) VirtualBox
安装依赖包。
以 debian-based 系统(Ubuntu, Debian)安装 Vagrant 1.3.5 和 Virtual Box
4.2.4 为例,执行如下命令:
$ sudo dpkg -i ~/Downloads/vagrant_1.3.5_x86_64.deb
$ sudo dpkg -i /Downloads/virtualbox-4.2_4.2.16-86992Ubuntu~precise_amd64.deb
使用本地开发环境的常用开发调试命令如下:
• 使用 BAE CLI 工具本地发布
• $ bae app publish --local
更多 BAE CLI 工具的使用方法,参见 CLI 入门指南。
• 查看本地发布的部署
• PHP/Python/Node.js/Static:$ curl 127.0.0.1:8080 -H “Host: $app_domain”
• Java:$ curl 127.0.0.1:8080/$war_name/
• 单一语言虚拟机环境中添加对其他语言的支持:$ bae_install <Programming_Language>
如当前虚拟机环境仅支持 PHP 语言,执行`bae_install,java,后可以在本地同时调试 PHP 和 Java 语言的应用。
三、本机环境搭建
如果用户想搭建本地的真实运行环境,在此以 linux 环境搭建为例,整理步骤如此:确定自己要使用什么域名访问应用,以下例子用 phpoffline.duapp.com.
/home/bae(应该已存在,bae 用户主目录,运行入口目录)
/home/bae/bae(php 目录,php 环境)
/home/bae/lighttpd(lighttpd 目录, lighttpd-1.5.0)
/home/bae/wwwdata
/home/bae/wwwdata/htdocs(lighttpd 访问根目录)
/home/bae/wwwdata/htdocs/phpoffline.duapp.com(bae 平台的应用目录,就是你定义的域名)
使用 bae 用户部署 lighttpd
到我的网盘下载 tar 包:
http://pan.baidu.com/share/link?shareid=78893&uk=1846015233
解包后,包内的 lighttpd 目录对应/home/bae/lighttpd 目录,(按此目录结构将会节省大量配置工作,自己衡量:)
接下来修改 lighttpd 的配置文件:
Lighttpd 白名单:使用白名单内的域名访问所在机器,才会被 lighttpd 允许。
[root@test.baidu.com home]# vi /home/bae/lighttpd/conf/domain_whitelist(白名单配置文件)
加入自己要用的域名 phpoffline.duapp.com,保存退出
Lighttpd 配置:配置 lighttpd 的各种参数和路径
[root@test.baidu.com home]# vi /home/bae/lighttpd/conf/lighttpd.conf
var.rundir = “/home/bae/lighttpd”
var.wwwdir = “/home/bae/wwwdata/htdocs”
var.netpath = “10.40.72.110(此处是你机器 IP):9898/log”
添加使用 lua 转发:
HTTP["host"] =~ "^(.*)HTTP["host"]= "(.∗)" {
}
hosts 和软链
Root 账户登录虚拟机,修改 hosts 文件
[root@test.baidu.com home]# vi /etc/hosts
添加这样一行:
10.... phpoffline.duapp.com,保存退出
Bae 用户在/home/bae/wwwdata/htdocs 下创建软链,指向应用的目录/home/bae/wwwdata/phpoffline.duapp.com
如果在 windows 下访问,请在 hosts 中配置域名和应用部署 ip 的映射关系,如:10.... phpoffline.duapp.com(linux sebserver 服务器地址)
部署 PHP
首先还是到我的网盘下载 PHP 部署用的 tar 包:http://pan.baidu.com/share/link?shareid=78968&uk=1846015233
下载后,里面有三个目录,放到/home/bae/bae 下面去
修改 PHP 相应的配置文件:
首先检查/home/bae/bae/php/etc/php-fpm.conf,这 2 处配置与下图路径一致
然后检查/home/bae/bae/php/sbin/php-fpm,这 3 处与下图一致
最后,vi /home/bae/bae/phplib/php.ini
找到 open_basedir 项,把/home/bae/wwwdata/htdocs/*******.com 替换为:/home/bae/wwwdata/htdocs/phpoffline.duapp.com
找到 error_log 项,确认是这个:/home/bae/lighttpd/log/php.log.wf
启动服务
Php 启动/停止:
[bae@dbl-wise-tt-newrd07.vm.baidu.com home]#/home/bae/bae/php/sbin/php-fpm start(stop)
Lighttpd 启动/停止:
[bae@dbl-wise-tt-newrd07.vm.baidu.com home]#/home/bae/lighttpd/bin/lighttpd_control start(stop)
部署应用
首先从 svn 上 co 自己需要的版本(待开发的 4 位版本或者最新基线,等等)
进入虚拟机的/home/bae/wwwdata/htdocs/phpoffline.duapp.com 下,通过 svn co 命令把代码拿到该目录下下(拿下来应该是个 appid****目录,目录结构应该是:app.conf,index.php)。在次场景对于的 url 是https://svn.duapp.com/appid0d9c295kd8。/home/bae/wwwdata/htdocs/目录下面建立域名 phpoffline.duapp.com 到 ci 目录的 appid0d9c295kd8 的软链接。通过 windows 或是 linux 都能访问对于的应用。 Ln –s appid0d9c295kd8 /home/bae/htdocs/phpoffline.duapp.com
四、app.conf 和 bae_app_conf.lua 转换关系
上传代码的时候使用时 app.conf,但是转发的时候再 lighttpd 使用时 lua 转发。这是因为在代码发布的时候平台对 app.conf 做了转发切换,app.conf 介绍请参考:https://bce.baidu.com/doc/BAE/GUIGettingStarted.html#.E9.85.8D.E7.BD.AEapp.conf
这里以一个基准 app.conf 和 bae_app_conf.lua 生成转化:
其他转换请参考:http://pan.baidu.com/s/1bnTUijP
更多干货分享请关注”百度 MTC 学院“http://mtc.baidu.com/academy/article
评论