如何设置我的 Web 应用程序开发环境以轻松进行生产转换?

如何设置我的 Web 应用程序开发环境以轻松进行生产转换?

我即将开始开发一个 Web 应用。上线时,它将托管在云中的专用服务器上。目前,我的开发环境是我的共享托管帐户。我认为模仿共享托管类型的环境会更加困难(而且毫无意义),因为它需要大量定制、限制和预期目的(服务数百个网站而不是一个)。

考虑到我将拥有对生产服务器的完全/根控制权,我应该在物理或虚拟服务器上设置开发环境吗?如果是这样,我是否只需将我的 VirtualBox/VMware 虚拟开发机(或 P2V)转换/映像/导入到云中的虚拟机,还是必须手动模拟开发机的环境(即安装完全相同的操作系统、软件、库、组件、补丁等)(并复制/SVN 网站和数据库)?如果不是,那么设置开发服务器以便轻松进行实时转换的最佳实践是什么?

答案1

使用共享帐户进行开发工作可能是最糟糕的选择,因为它的配置不太可能与最终的实时服务器相同。我建议设置一台本地机器,使其尽可能接近最终目标配置的克隆。关于物理与虚拟,如果虚拟提供了足够的性能来满足您的需求,则没有理由使用物理。

如果您创建目标机器的本地克隆,那么到时候只需复制文件即可,当然还要确保目标上的权限设置正确。然后转储数据库并将其加载到目标上。没有比这更简单的了。

答案2

首先,记录你对服务器所做的任何修改,这称为运行手册。需要手动跟踪的一些事项:

  1. 重要软件包的版本级别。语言、库和数据库软件包。
  2. 所有重要目录和路径的位置。
  3. 列出所有外部依赖关系。

其次,使用脚本定义所有环境变量和系统设置。如果做不到这一点,至少要记下来。

第三,尽可能多地(如果不是全部的话)保留修订控制,包括您的运行手册和环境脚本。您应该能够仅从 SVN 存储库部署服务器的新实例。

第四,保留备份,保留非常非常好的备份。测试它们。

其余部分则与您的部署非常相关。在虚拟或物理服务器上进行设置完全取决于您的网络、磁盘和内存中的 IO(输入/输出)负载。这只能随时间量化,因此请尽可能多地绘制图表。

最重要的是,让事情模块化、可重复。

(感谢@bittrance 的评论!)

以下是“使用脚本设置环境变量”的几个示例。

答案3

假设我们讨论的是生产环境中的整台机器(无论是物理的还是虚拟的)(而不是 Google App Engine),我的最佳实践是这样的:

付出额外的努力来为您的软件创建适当的包装。例如,对于针对 RedHat 的 Java 开发,使用/编写创建 RPM 的 Maven 工具。对于您的数据库,将所有更改包含在 RPM 中,并让它们自动应用或创建一个为您应用它们的小工具。本质上,当服务器可以用单个命令安装/升级时,您就完成了。是的,这意味着包括针对该系统定制的配置文件。

这需要做一些额外的工作,但从长远来看是值得的。

正确打包软件后,开发/准备/演示服务器的问题就不再那么重要了,因为您可以随时构建另一个。使用正确的安装程序,您可以准确知道需要对机器进行哪些更改才能使其正常运行。

不要担心迁移虚拟机:无论如何您都需要在迁移时更改大量配置参数。

如果您告诉我们更多有关操作系统/开发工具的信息,我可能会给您提供一些更具体的建议。

编辑:PHP/MySQL。假设这是 LAMP。

使用您的 PHP 代码创建一个 deb/rpm,该代码依赖于您需要的各种 Apache、mysql、mod_ssl、php 包。查看该平台上的其他 PHP 应用程序包以获取灵感。通常,您不希望包依赖于数据库,因为数据库可能位于不同的框中。

您的软件包应该包含两个 SQL 脚本(来自您的源存储库):一个用于初始化新数据库,包括授权语句、加载存储过程、创建索引等;另一个用于加载一些演示数据,这些数据可用于测试系统以快速启动和运行。此外,软件包的后续版本可能包含用于升级数据库的补丁脚本。

大多数现代 Linux 发行版都不允许覆盖其他软件包的文件,因此,如果可能的话,请尽量避免这样做。

EDIT2:如何仅从目录树构建 Debian 包。

您需要一个看起来像您想要进行的安装的目录树(假设在一个名为 build 的目录中),并且您需要一些控制文件:

控制文件/控制:

Package: coolapp
Version: 1.0.0-2
Architecture: i386
Maintainer: Skunkworks Dept <[email protected]>
Depends: apache2 (>= 2.2.16)
Section: contrib/libs
Priority: optional
Description: My Cool App
 It's going to revolutionize, yo!

控制文件/配置文件:

etc/coolapp/settings.conf

鉴于这两个,使用名为 mkdeb 的脚本:

#!/bin/bash

CONTROLDIR=$1
shift
SOURCEDIR=$1
shift
INCLUDES=$*
BUILD=/var/tmp/mkdeb

CONTROLFILE=$CONTROLDIR/control
PKGNAME=$(grep -E '^Package:' $CONTROLFILE | awk '{ print $2 }')
PKGVERSION=$(grep -E '^Version:' $CONTROLFILE | awk '{ print $2 }')
PKGARCH=$(grep -E '^Architecture:' $CONTROLFILE | awk '{ print $2 }')

FILENAME=$PWD/${PKGNAME}_${PKGVERSION}_${PKGARCH}.deb

rm -rf $BUILD && install -d $BUILD
tar -C $SOURCEDIR -zcf $BUILD/data.tar.gz $INCLUDES
# Proper debian packages have md5 sums for all their files
(cd $SOURCEDIR && find $INCLUDES -type f | xargs md5sum > $BUILD/md5sums)
metadata=
for f in control prerm postrm preinst postinst templates conffiles ; do
    if [ -f $CONTROLDIR/$f ] ; then
        cp $CONTROLDIR/$f $BUILD
        chmod a+x $BUILD/$f
        metadata="$metadata $f"
    fi
done

# Metadata and stuff
tar -C $BUILD -zcf $BUILD/control.tar.gz md5sums $metadata
echo 2.0 > $BUILD/debian-binary
(cd $BUILD && ar rc $FILENAME debian-binary control.tar.gz data.tar.gz)

就像这样:

mkdeb ./controlfiles ./build .

答案4

  1. 保持开发和实时的底层发行版相同。例如,如果实时将是 ubuntu 10.10 ec2 实例,那么开发应该是 ubuntu 10.10 环境,即使这意味着在您的 (mac) 笔记本电脑上运行虚拟机。更好的是让它与实时相同,这样即使是网络连接问题也会均衡。

  2. 使用配置管理 (puppet/chef) 工具配置这两个服务器/环境,使其具有自文档性和可重现性。这些在单个服务器上同样有​​效,甚至更简单。您可以从一个简单的巨型配方开始,该配方仅包含一些 if-dev/else-live 技巧。将这些配方与您的代码一起保存在您的版本控制系统中。

  3. 将代码保存在版本控制系统中的某个独立位置,可以是本地的,如 trac/svnserve 设置,也可以托管在 github 中。只是分开,某个完全不涉及最终用户服务的地方。编写一个非常简单的脚本,从该版本控制系统部署您的应用程序。它可以只是一个 shell 脚本,其中混合了 3 或 4 行 bash,从简单开始,将其保存在版本控制系统中,并根据需要进行迭代。

如果您完成所有这些操作,您将拥有一个与实时环境相匹配的开发环境,并且可以通过 diff 来证明这一点。您还可以获得一个简单的部署工作流程,可以轻松快速地进行迭代,并且您将拥有构建匹配服务器并在需要时进行扩展的所有基础工作。

相关内容