• 百度应用部署秘籍


    【背景介绍】

    传统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。

     

    1) 单击“开始”,在弹出菜单中右击“计算机”,在下拉菜单中选择“属性”打开系统属性对话框。

    2) 单击右侧面板中的“高级系统设置”,打开高级系统设置对话框。

    3) 单击“高级”视图右下方的“环境变量”,打开环境变量对话框。

    4) 编辑用户可执行路径或系统可执行路径,添加依赖包的安装路径并保存。路径之间需用分号(;)隔开,以默认方式安装依赖包为例,需添加的路径如下所示:

    D:HashiCorpVagrantin; C:Program FilesOracleVirtualBox

     

    注意:

    修改用户可执行路径仅影响当前用户,修改系统可执行路径将影响所用用户。

     

    Linux下安装依赖包

    A.  下载依赖包。Vagrant (版本高于1.2.2) VirtualBox

    1.  安装依赖包。

    以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-86992~Ubuntu~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"] =~ "^(.*)$" {

        vhost-magnet.path-pattern = var.wwwdir + "/%_"

        vhost-magnet.attract-raw-url-to = ( "/bae_app_conf.lua" )

    }

     

    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

  • 相关阅读:
    bzoj 4539 [Hnoi2016]树——主席树+倍增
    bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
    bzoj 4025 二分图——线段树分治+LCT
    LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治
    bzoj 3572 [Hnoi2014]世界树——虚树
    bzoj 4650(洛谷 1117) [Noi2016]优秀的拆分——枚举长度的关键点+后缀数组
    洛谷 P3957 跳房子 —— 二分答案+单调队列优化DP
    洛谷 P1578 奶牛浴场 —— 最大子矩形
    bzoj 1510 Kra-The Disks —— 思路
    bzoj 1657 Mooo 奶牛的歌声 —— 单调栈
  • 原文地址:https://www.cnblogs.com/baidumtc/p/5530871.html
Copyright © 2020-2023  润新知