lamp环境搭建_LAMP 应用程序 Drupal 迁移到 Bluemix 云服务器步骤

时间:2020-03-13  来源:apache  阅读:

LAMP 是一个运行动态网站和 Web 应用程序的常用的开源堆栈。最初,该缩写表示 Linux 操作系统、Apache HTTP Server、MySQL 数据库和 PHP 编程语言。随着时间的推移,LAMP 现在表示一种用于 PHP 应用程序的更通用的开源软件堆栈。例如,Apache Web 服务器可替换为 nginx,MySQL 数据库服务器拥有 PostgreSQL 等替代选择。

Bluemix 是 LAMP 应用程序的理想平台。要将 LAMP 应用程序迁移到 Bluemix,需要解决以下主要问题:

PHP 运行时需求 ― PHP 构建块 需要满足应用程序需求,比如 PHP 版本,启用的 PHP 扩展和其他相关设置。
数据库迁移 ― 除了满足应用程序的数据库服务器需求和实现数据加载之外,还必须设置一种从应用程序访问数据库的方式。
非持久性文件系统 ― Bluemix 运行时文件系统不是持久性的(它会在重新部署应用程序后刷新)。迁移需要考虑这种行为是否会影响迁移的应用程序,需要在必要时为应用程序实现持久存储。

本教程展示经验丰富的 PHP 开发人员如何借助 Bluemix mysql 和 Object Storage 服务,解决这些问题并将 LAMP 应用程序迁移到 Bluemix。您将使用 Drupal 应用程序作为示例,在 Bluemix 上构建一个简单的博客站点。Drupal(一个经典的 LAMP 应用程序)是一个流行的开源内容管理系统,它是使用 PHP 编写的,为数百万的网站和应用程序提供支持,从个人博客到企业、政党和政府站点。随后,当您准备将自己的 LAMP 应用程序迁移到 Bluemix 时,可以使用此练习作为参考。


构建您的应用程序需要做的准备工作

必需:

    一个 Bluemix 帐户和一个 DevOps Services 帐户,二者都被链接到您的 IBM ID
    熟悉 PHP 编程语言

可选:

    熟悉 Drupal
    Cloud Foundry 命令行接口


第 1 步. 创建一个 Bluemix 应用程序,添加服务,并收集环境变量

    登录到您的 Bluemix 帐户。
    在目录中,单击选择 Runtimes 部分的 PHP。
    在 Start with a runtime 对话框的 App 字段中,指定应用程序的名称(我的设置为 bluedrupal)并单击 CREATE。等待完成您的应用程序配置。
    转到 Bluemix 仪表板,单击新创建的应用程序,然后单击 ADD A SERVICE OR API。

    Bluemix Labs Catalog 中针对 mysql 服务的免费计划是 10MB 存储空间,而针对 ClearDB MySQL Database 服务的免费计划仅为 5MB ― 该空间对 Drupal 应用程序部署而言太小了。如果您拥有针对 ClearDB MySQL Database 服务的更大计划,您可以选择它而不是 mysql。另一个选择是 ElephantSQL 服务(PostgreSQL 即服务),它也拥有 10MB。
    一直向下滚动到 Bluemix 目录底部,单击 Bluemix Labs Catalog 链接。
    在 Bluemix Labs Catalog 的 Data & Analytics 部分,选择 mysql 试验服务并单击 USE。如果获得提示,请重新载入应用程序。
    返回到 Bluemix 仪表板,单击您的应用程序,然后单击 ADD A SERVICE OR API。
    单击 Data & Analytics 部分的 Object Storage 服务(不是 带 v2 的版本名称)。
    在 Add Service 对话框中,单击 USE。如果获得提示,重新载入应用程序。
    单击仪表板中您的应用程序以打开该应用程序的概述页面,其中显示了两个已添加的服务。 屏幕截图显示了应用程序概述

    屏幕截图显示了应用程序概述

    在概述页面中,单击 Object Storage 服务磁贴中的 Show Credentials 链接,查看该服务的相关环境变量,比如 auth_uri、username 和 password。将这些变量复制到一个文本文件中,供以后使用。

步骤 2. 检查代码更改

在这一步中,比较普通的 Drupal 7.36 源代码(您可从 Drupal 站点获取一个 ZIP 文件)与为 Bluemix 准备的更新的 Drupal 源代码。要在 DevOps Services 中我的 bluedrupal 项目中查看更新的 Drupal 源代码,可在此页上向上滚动并单击获取代码按钮。准备好迁移到 Bluemix 的 Drupal 代码是项目的 drupal-7.36 文件夹。


PHP 运行时需求

Drupal 7 推荐使用拥有 5.4 版或更高版本的 PHP 环境。此外,它需要一些扩展来获得全部特性,比如 mbstring、gd 和 pdo(参阅 Drupal 系统需求 了解详细信息)。

目前,官方 Bluemix PHP buildpack 支持 Drupal 7 的所有需求。为了满足 PHP 环境版本需求,我在应用程序代码中的 drupal-7.36 目录下创建了一个名为 composer.json 的配置文件:

{
    "require": {
        "php": ">=5.4.0"
    }
}

有关如何更新其他配置项的详细信息,请参阅 cloudfoundry/php-buildpack 文档。

drupal-7.36/.bp-config/options.json 文件配置 PHP buildpack。我对该文件执行的唯一更改是启用相关的扩展:

{
    "PHP_EXTENSIONS": ["bz2", "pdo", "zlib", "curl", "mcrypt", "mbstring", "mysqli",
                             "gd", "zip", "pdo_mysql", "pgsql", "pdo_pgsql"]
}

数据库迁移

Drupal 7 需要 MySQL 5 或更高版本或 PostgreSQL 8.3 或更高版本。来自 Bluemix Labs Catalog 的 Bluemix mysql 服务满足此需求(主要目录中的 ClearDB MySQL Database 和 ElephantSQL 服务也满足)。该数据库将在 Drupal 安装期间初始化,所以不需要为此用途运行 SQL 脚本。但对于未来迁移的 LAMP 应用程序,可能需要手动执行数据库迁移任务(表模式创建、数据加载等)。

在 PHP 代码中访问数据库的简单方式是硬编码连接属性(url、user、password、dbname 等)。但一种灵活的方式是在运行时期间从 VCAP_SERVICES 环境变量读取连接属性,而不是硬编码它们。

Drupal 7 随带了一个示例配置文件 (sites/default/default.settings.php),在安装之前必须复制它作为一个名为 settings.php 的新文件。此文件包含数据库连接信息和其他连接细节。下面这段代码来自准备好迁移到 Bluemix 的源代码中的 drupal-7.36/sites/default/settings.php。该文件从 VCAP_SERVICES 读取 mysql(或 ClearDB MySQL Database 或 ElephantSQL)服务的连接属性,所以您不需要在安装期间手动输入数据库连接信息:

//Check VCAP Services
$services = getenv("VCAP_SERVICES");
$services_json = json_decode($services, true);
    
//mysql service from Bluemix Lab Catalog?
if (isset($services_json["mysql-5.5"])) {
    $mysql_config = $services_json["mysql-5.5"][0]["credentials"];
    $databases = array(
        'default' => array(
            'default' => array(
                'database' => $mysql_config["name"],
                'username' => $mysql_config["username"],
                'password' => $mysql_config["password"],
                'host' => $mysql_config["hostname"],
                'port' => $mysql_config["port"],
                'driver' => 'mysql',
                'prefix' => 'main_',
            ) ,
        ) ,
    );
}   
//ClearDB MySQL service?
else if (isset($services_json["cleardb"])) {
    $mysql_config = $services_json["cleardb"][0]["credentials"];
    $databases = array(
        'default' => array(
            'default' => array(
                'database' => $mysql_config["name"],
                'username' => $mysql_config["username"],
                'password' => $mysql_config["password"],
                'host' => $mysql_config["hostname"],
                'port' => $mysql_config["port"],
                'driver' => 'mysql',
                'prefix' => 'main_',
            ) ,
        ) ,
    );
}   
//ElephantSQL (PostgresSQL) service?
else if (isset($services_json["elephantsql"])) {
    $elephanturi = $services_json["elephantsql"][0]["credentials"]["uri"];
    if (preg_match("/^postgres:\/\/([^:]+):([^:@]+)@([^:]+):([0-9]+)\/([^:]+)$/",
                             $elephanturi, $matches))     {   
        $databases = array(
            'default' => array(
                'default' => array(
                    'database' => $matches[5],
                    'username' => $matches[1],
                    'password' => $matches[2],
                    'host' => $matches[3],
                    'port' => $matches[4],
                    'driver' => 'pgsql',
                    'prefix' => 'main_',
                ) ,
            ) ,
        );
    } else {
        $databases = array();
    }
} else {
    $databases = array();
}

文件系统寿命

Bluemix 运行时文件系统不是长期存在的:应用程序在文件系统上生成的文件会在重新部署后清除。对于一些应用程序,此行为是可接受的,因为数据保存在数据库服务器中来持久化;只有某些临时文件(例如日志)会在文件系统上生成,而且缺少它们没有严重的影响。但对于其他应用程序,包括 Drupal,必须解决此问题。

Drupal 7 采用了一种模块化方法设计,所以您可以安装社区中您喜欢的任何模块。如果在安装 Drupal 后安装模块,则必须在重新部署应用程序后重新安装它们,因为模块保存在本地文件系统中。一种解决办法是将模块放在 sites/all/modules 文件夹中。可以看到,一些模块保存在 bluedrupal 源代码中的 drupal-7.36/sites/all/modules 中。

其他可能在重新部署后丢失的文件包括您上传到将要创建的简单博客站点的图像或其他文件,因为它们默认存储在本地文件系统中。该应用程序使用 Bluemix 上的 Object Storage 服务解决此问题,实现文件持久化。

我找到了一个名为 OpenStack Object Storage 的 Drupal 模块,它可以帮助将 Drupal 文件保存在对象存储而不是本地文件系统上。原始模块的身份验证模式与 Bluemix Object Storage 服务不兼容,但我可以修改它来兼容 Object Storage。bluedrupal 源代码中的 drupal-7.36/sites/all/modules/openstack_storage 的修改版本。

以下代码摘自 drupal-7.36/sites/all/modules/openstack_storage/vendor/rackspace/php-opencloud/lib/OpenCloud/OpenStack.php,演示了如何在 PHP 中向 Bluemix Object Storage 服务执行身份验证:

/**

 * Authenticate the tenant using the supplied credentials
 *
 * @return void
 * @throws AuthenticationError
 */
public function authenticate()
{
$identity = IdentityService::factory($this);
        
        $authField= 'Basic '.base64_encode($this->secret['username'].':'.
                                             $this->secret['password']);  
        $authHeader = array(
    'Authorization' => $authField,
);
$response = $identity->generateToken($this->getCredentials(), $authHeader);
        
        $sUrl=$response->getHeader('X-Storage-Url');
        $aToken=$response->getHeader('X-Auth-Token');
        $uname=$this->secret['username'];
        $dRegion="DummyRegion";
        $dType="DummyCloudFile";
        
        //Use a dummy body to be compatible with OpenCloud library
        $body=json_decode(
        '{
        "access": {
"token": {
    "id": "'.$aToken.'",
    "tenant": {
        "description": null,
        "enabled": true,
        "id": "'.$uname.'",
        "name": "'.$uname.'"
    }
},
"serviceCatalog": [
    {
        "endpoints": [
            {
                "adminURL": "'.$sUrl.'",
                "region": "'.$dRegion.'",
                "internalURL": "'.$sUrl.'",
                "id": "'.$uname.'",
                "publicURL": "'.$sUrl.'"
            }
        ],
        "endpoints_links": [],
        "type": "object-store",
        "name": "'.$dType.'"
    }
],
"user": {
    "username": "'.$uname.'",
    "roles_links": [],
    "id": "'.$uname.'",
    "roles": [
        {
            "name": "Member"
        },
        {
            "name": "anotherrole"
        }
    ],
    "name": "'.$uname.'"
}
}
}');
        

//$body = Formatter::decode($response);

$this->setCatalog($body->access->serviceCatalog);
$this->setTokenObject($identity->resource('Token', $body->access->token));
$this->setUser($identity->resource('User', $body->access->user));

if (isset($body->access->token->tenant)) {
    $this->setTenantObject($identity->resource('Tenant', $body->access->token->tenant));
}

// Set X-Auth-Token HTTP request header
$this->updateTokenHeader();
}

在配置 Drupal 来将文件保存到对象存储之前,以下来自 drupal-7.36/sites/all/modules/openstack_storage/initObjectStore.php 的代码会初始化 Bluemix Object Storage 服务(创建容器,您可以将其视为文件夹):

<;?php
require_once './vendor/autoload.php';
    
use OpenCloud\OpenStack;
use OpenCloud\ObjectStore\Resource\DataObject;
    
$services = getenv("VCAP_SERVICES");
$services_json = json_decode($services,true);
$obj_config = $services_json["objectstorage"][0]["credentials"];
    
echo "Try to authenticate Bluemix Object Store... <;/br>";
$endpoint = $obj_config["auth_uri"];
$credentials = array(
    'username' => $obj_config["username"],
    'password' => $obj_config["password"]
);
    
$openstack = new OpenStack($endpoint, $credentials);
$openstack->Authenticate();
echo "Bluemix Object Store authenticated <;/br>";
    
$objectStoreService = $openstack->objectStoreService('DummyCloudFile', 'DummyRegion', 'tenant');
echo "Try to create Container drupalObjectStore... <;/br>";
$objectStoreService->createContainer('drupalObjectStore');
$containers=$objectStoreService->listContainers();
$con=FALSE;
foreach ($containers as $container) {
    if($container->getName()=='drupalObjectStore')
    {
        $con=$container;
        break;
    }
}
    
if($con)
{
    $container->setReadPublic();
    echo "Container drupalObjectStore created.<;/br>";
}
else
{
    echo "Fail to create Container drupalObjectStore <;/br>";
}
    
?>

步骤 3. 将该应用程序部署到 Bluemix

    在此页面上向上滚动并单击获取代码按钮,转到 DevOps Services 中 bluedrupal 项目的概述页面。
    单击 Fork Project,在提示时使用您的 IBM ID 登录到 Bluemix DevOps Services,在请求时输入您项目的名称。选中 Make this a Bluemix Project 复选框,并确保 Bluemix Region、Organization 和 Space 的值是正确的。单击 CREATE 分解该存储库。
    在新创建的项目中,单击 EDIT CODE。在页面顶部 Tools 菜单右侧,单击显示您项目名称的下拉列表,然后单击铅笔图标来打开用于 Bluemix 部署的 Edit Launch Configuration 对话框。 该屏幕截图显示了可单击来打开 Edit Launch Configuration 对话框的图标

    该屏幕截图显示了可单击来打开 Edit Launch Configuration 对话框的图标

    将 Application Name 和 Host 字段更新为您在第 1 步中创建的 Bluemix 应用程序的名称。确认其他字段(Target、Organization、Space 和 Domain)是正确的,然后单击 Save。 该屏幕截图显示了 Edit Launch Configuration 对话框

该屏幕截图显示了 Edit Launch Configuration 对话框

    单击向右的三角形图标来部署该应用程序。等待一分钟左右,然后检查部署状态。 该屏幕截图显示了部署按钮

该屏幕截图显示了部署按钮

如果更喜欢使用 cf 命令来从本地命令行部署项目,可以执行以下步骤:

    将 bluedrupal 源代码克隆到本地。
    更新 manifest.yml 文件,将 更改为您的 Bluemix 应用程序名称。还可以更改您请求的内存大小(默认内存大小设置为 128MB):

    ---
    applications:
    - name:
    memory: 128M
    instances: 1
    host:
    path: ./drupal-7.36

    运行 cf push 命令来部署应用程序。

步骤 4. 安装并配置 Drupal


    浏览到应用程序安装 URL:http://your_app_name.mybluemix.net/install.php。
    选择安装概况页面上的 Standard,然后单击 Save and continue。
    选择 English 作为语言,然后单击 Save and continue。将花几分钟来安装模块。
    在 site-configuration 页面上填入相关信息(包括管理帐户和密码),然后单击 Save and continue 完成安装。
    浏览到您应用程序的 URL:http://your_app_name.mybluemix.net。如果有必要的话,可以使用您刚设置的管理员用户名和密码登录。
    选择 Add content > Article。填入 Title 字段,添加一些内容,然后添加一个图形来创建一个新博客条目。Drupal 应用程序应该能正确运行,但在重新部署后,上传的图像文件将被清除,因为它们存储在本地文件系统中。

初始化 Bluemix Object Storage 服务

    浏览到 http://your_app_name.mybluemix.net/sites/all/modules/openstack_storage/initObjectStore.php 来初始化 Object Storage 服务。
    您将看到 “Container drupalObjectStore created” 消息,表明 Bluemix Object Storage 服务已初始化。 该屏幕截图显示了确认容器已创建的消息

该屏幕截图显示了确认容器已创建的消息

    您将在后面的步骤中使用所创建的容器。

为 Drupal 配置 OpenStack Storage 插件

    浏览到您应用程序的主页 (http://your_app_name.mybluemix.net)。如果有必要的话,请进行登录。
    单击主菜单中的 Modules,选择 FILE MANAGEMENT 部分的 OpenStack Storage 复选框,然后单击 Save configuration 启用 Drupal 的 OpenStack Storage 插件。
    单击主菜单中的 Configuration,然后单击 WEB SERVICES 部分的 OpenStack Storage。
    在 Endpoint URL 字段中填入您从 Object Storage 凭据中复制的 auth_uri 值。在 Tenant ID 字段中输入 tenant。在 Username 字段中,输入来自您保存的凭据的 username 值,然后在 Password 字段中输入保存的 password 值。单击 Save configuration。
    在 OPENSTACK SETTINGS 下,可以看到 DummyCloudFile 是 OpenStack Object Store 类型的值。再次填写 Password 字段并单击 Save configuration。
    出现的 DummyRegion 是 OpenStack Object Store Region 的值。再次填写 Password 字段并单击 Save configuration。 该屏幕截图显示了 Configuration 页面

    该屏幕截图显示了 Configuration 页面

    单击 OBJECT STORE 选项卡。在 OPENSTACK STORAGE 部分,在 Map to Container 下拉列表中选择 drupalObjectStore(这是在初始化步骤中创建的容器)。不更新其他两个部分。单击 Save configuration。

您已成功地配置 OpenStack Storage 插件。


设置默认下载方法


    单击主菜单中的 Configuration,然后单击 MEDIA 节中的 File system。
    选择 Store files as objects on OpenStack object storage 作为默认下载方法,然后单击 Save configuration。

将上传目标设置为 Object Storage 服务

    单击主菜单中的 Structure 并单击 Content types。
    单击 Article 中的 manage fields。
    单击 Image 行中的 edit。
    在 IMAGE FIELD SETTINGS 下,选择 OpenStack Storage 作为上传目标,然后单击 Save settings。

图像文件将上传到对象存储,而不是本地文件系统。


步骤 5. 运行应用程序

现在您已成功部署和配置您的应用程序,可以测试它了。

    浏览到您应用程序的主页:http://your_app_name.mybluemix.net。如果有必要的话,请进行登录。
    选择 Add content > Article。填写 Title 字段并输入一些内容来创建一个新博客条目,然后附加一幅图像。
    上传的图像被存储到 Bluemix Object Storage 服务中。如果使用 Firefox,可以右键单击该图像并选择 Inspect Element 来确认,您会看到该图像的 URL,类似于 https://dal05.objectstorage.softlayer.net/v1/AUTH_6e9c4fb9-d3eb-4ea1-9dcf-14ebb6f14087/drupalObjectStore/styles/medium/openstack/field/image/Tulips_0.jpg?itok=NYQrDL3D: 该屏幕截图显示了包含图像元素细节的示例 Drupal 应用程序主页

    该屏幕截图显示了包含图像元素细节的示例 Drupal 应用程序主页


结束语

就其性质而言,IBM Bluemix 是 LAMP 应用程序的理想平台。本教程使用 Drupal 应用程序作为示例,演示了将 LAMP Web 应用程序迁移到 Bluemix 的分步过程。如果您是许多开发 LAMP 应用程序并想尝试在 Bluemix 上运行它们的开发人员的一员,如果您使用本教程的示例作为指导,迁移不会很难。

lamp环境搭建_LAMP 应用程序 Drupal 迁移到 Bluemix 云服务器步骤

http://m.bbyears.com/jiaocheng/86880.html

推荐访问:lamp一键安装包 lampp lamp法 lamp1 lamp架构 lampo lamp是什么意思
相关阅读 猜你喜欢
本类排行 本类最新