【问题标题】:How do you efficiently develop/test locally then launch on a production server?您如何有效地在本地开发/测试然后在生产服务器上启动?
【发布时间】:2013-06-11 12:06:34
【问题描述】:

我在决定如何有效地开发和测试 Web 应用程序,然后在生产服务器上启动它们时遇到了问题。我对 Web 开发非常陌生,并且通常也在开发大型项目,所以请多多包涵。

我将在运行 Debian 7 32 位的 VPS 上托管我的 Web 应用程序。在这个 VPS 上,我使用 PHP 5.4.16 和 dotdeb 的 nginx。我想要做的是获得一台使用完全相同的包和配置的本地机器,以便在生产服务器上轻松启动。我曾经做过一场噩梦,调整了在我的开发机器上工作的各种设置,但在产品上却不行。也许这种方法不是正确的做法。我应该分配部分生产服务器用于开发和测试吗?但我需要一直 ssh-ing。

另一个问题是,即使我可以在本地机器上获得相同的包,如果我将来需要使用不同版本的 PHP 怎么办?如果我需要安装与其他安装的包不兼容的包怎么办?

似乎唯一的解决方案是为每个项目维护一个虚拟机。这是一个不错的解决方案吗?您如何在本地开发机器上高效地开发/测试?

【问题讨论】:

  • 我不做 PHP 开发,所以我不能对此发表评论。就个人而言,我在我的开发笔记本电脑上运行 Ubuntu 的一个变体,并在我所有的 VPS 上使用 Ubuntu,所以那里没有不兼容。我使用 Ruby 语言,带有一个“版本管理器”,它可以让我随意切换 Ruby 的版本 + 所有使用的 Ruby 库。我设置了我的 shell,以便 cding 进入项目目录会自动选择该项目使用的 Ruby+库的版本。然后,我在我的开发机器上同时运行 MySQL+Postgres,因此每个项目都可以在本地运行在与生产环境相同的数据库上。

标签: php testing web-applications


【解决方案1】:

由于每个人的工作方式不同,这将导致相当固执的反应,但这里有一些通用规则可以帮助您:

  1. 使用版本控制并隔离您的源代码以及您的开发和生产环境要求。这将帮助您维护不同的版本并进行测试。

  2. 您可以使用vagrant,它就像一个“可编写脚本的”虚拟机控制器来轻松管理复制的环境。

  3. 为了您自己的理智,请确保您的环境中的数据库版本相同。

【讨论】:

    【解决方案2】:

    您实际上有几个不同的问题需要解决:开发、测试、部署到生产环境、监控生产环境。

    通常,您希望使用数据和与生产类似的环境在与生产分离的设备上进行开发,但具有开发需要高效和有效的所有优点,例如测试工具、调试器、记录器、自动化单元测试等。数据需要类似于生产中的数据,但不是生产数据,因为在大多数情况下,生产数据必须得到保护。此外,由于开发人员拥有自己的制造数据,它允许将特定场景的测试作为设计人员测试的一部分。

    我建议使用标准测试数据集,当系统的源代码和功能发生更改时,开发人员会将其添加到其中。测试数据的添加/修改是一种变化,需要某种正式或半正式的过程,背后有一些想法,否则你最终会一团糟。熵对于软件系统是真实的,就像对于趋于混乱和无序的物理系统一样。

    测试环境需要与开发环境分离,并尽可能接近生产环境的代表。您可能需要两个版本的测试环境,一个用于测试功能并带有额外的数据捕获,用于第一次通过验证以捕获数据,开发需要修复发现的问题,第二个是尽可能接近地复制生产以按顺序进行了解效率问题。

    不应允许开发人员将开发工具放到测试环境中。我见过一些情况,因为缺少开发环境提供的组件而导致系统崩溃。您想在测试环境中发现这类问题。

    需要规划新系统版本的部署,以便在生产出现问题时回滚更改。

    最重要的是尽可能将生产与开发隔离,以便您准确了解生产服务器中的内容。当您更改生产服务器上的内容时,您可以很好地了解正在更改的内容以及更改的原因以及更改对生产环境的影响。

    这是使用 Mercurial 或 Subversion 等存储库的地方,它可以发挥质量控制作用。这个想法是,存储库中的内容是作为一个完整包进行测试的内容。一旦对特定包装完成测试并且质量良好,则该包装将投入生产。

    这也是您需要拥有黄金版生产环境的地方。为了稳定起见,您希望生产环境以受控和有条理的方式进行更改。每个人都看到了一个更新,它导致以前工作的应用程序和功能崩溃,因此您希望管理该更新过程。

    因此,如果您有一个黄金版本的生产环境、某种图像,那么您可以使用它来复制其他服务器、您的测试环境和您的设计器测试环境。您的生产环境的其他变体将拥有自己的软件包,以及他们需要的生产环境的附加内容,例如开发环境将是生产环境加上开发环境及其工具、设计器测试数据等。

    这就是虚拟机如此方便的地方。

    这听起来既费力又低效,确实如此。然而,人们会犯错误,这种过程有助于减少错误将其投入生产的机会。

    【讨论】:

      【解决方案3】:

      这很大程度上取决于几个因素:

      1. 您对托管环境的操作系统有多少意见
      2. 您对托管环境有什么访问权限
      3. 你想在你的项目中使用什么技术(假设 PHP 是初学者)

      假设您可以决定要托管的操作系统,并且可以完全访问该托管环境(如果您仍在决定主机,我会推荐两者),那么 3 确实是决定因素。

      NginX 是一个非常不错的 Web 开发选择,因为它作为 proxy 具有非常强大的能力。你可以在同一台服务器上运行几乎任何你想要的东西,然后 proxy 它,或者使用 NginX 将它呈现在一个新的 virtual host 上。 (是的,我知道Apache 也有这些功能,但 NginX 似乎在几乎所有方面都优于 Apache)。这超出了它作为静态和动态内容的独立服务器的能力。如果您还不熟悉 PHP 和 NginX,请查看this link

      如果您使用一个前端(在本例中为 NginX)来展示您的托管服务提供商上的所有项目,那么一个与操作系统(包括版本)匹配的虚拟机(您应该可以使用)您的托管服务提供商是一个完美的开发环境。从实际的角度来看,你使用什么 VM 解决方案并不重要,从免费到破产都有很多。选择一个符合要求的。

      我还想建立一个version control system。 (Git 很棒,Mercurial 也很棒)适合您的项目。不要害怕任何感知到的学习曲线,这些工具真的很容易上手,而且一旦你准备好使用电动工具,真的功能强大.

      您还应该研究在开发虚拟机和 Web 主机之间传输文件的方法。 SSH 是当今常用的方法,但我听说有人使用 BitTorrentSync 之类的东西来保持他们的代码库一致。就个人而言,我认为这有点冒险(新技术、一些意想不到的行为等)。如果您要使用 SSH,请查看 Passwordless logins。他们对set up 并不难!

      关于 PHP 版本,如果您确实遇到了不兼容的包要求,最简单和最干净的解决方案是运行另一台机器,方法它(我把它留给你谷歌),但我个人喜欢把事情分开。老实说,它不应该出现太多。

      除此之外,我只能说希望您在 Web 开发中玩得开心!也不要害怕尝试其他语言; Node.jsPythonGo 和许多其他的在服务器端玩起来非常有趣,而 Jquery、Angular.js 和许多其他在客户端非常棒。

      编码愉快!

      【讨论】:

        【解决方案4】:

        每种语言都有自己的部署工具。尤其是这取决于您使用的环境。我可以给你一些关于中等环境(大约 100 台服务器)web 项目/服务的例子。我是一名 python 开发人员,我的团队中使用了这些类型的工具:

        • 版本控制系统(gitmercurialsvn)[生产服务器对存储库具有只读访问权限)
        • 虚拟环境工具(python 是virtualenv,ruby 是rvmbundler,隔离python/ruby 库,可以使用不同版本的python/ruby 本身)
        • 配置管理工具(puppet是一种使用广泛的工具,它可以设置所有需要的守护进程,如nginxuwsgimysql数据库,django框架自动设置,iptables防火墙,用户管理, ssh 密钥管理)
        • Makefile(用于启动所需操作)

        因此,基本上拥有这 3 个工具,您可以在几分钟内设置与生产相同的测试服务器。我们走得更远,我们在服务器上安装了带有 API 的 hypervizor,因此我们可以在几分钟内为任何新开发人员创建 devbox,而且我们有很多承包商,亚马逊实例也可以做到这一点。当然,您需要通过在 puppet 中编写脚本来准备您的环境(或者如果您的环境不是很大,您可以使用 bash 来完成),并进行大量配置等。

        此过程称为 - Deployment

        例如,当我们想将更改从测试服务器部署到生产服务器时,我们从生产服务器启动make deploy production 命令,脚本从 git 中检出所有代码,清理编译的 python 文件,重新启动 nginx 服务器、清除缓存和许多其他对应用我们的更改至关重要的操作。

        部署被认为是一项技能,主要由团队负责人完成,因此他们比其他开发人员更担心服务器环境设置。您可能会有部署策略。当您应用更改时,它可以是一周中的特定日期。 facebook 公司有一个很好的视频:video about deployment in facebook

        我的建议是,谷歌搜索所有这些答案中的每个关键字。部署需要大量时间和精力来设置良好的可靠环境。这是您在生产中遇到的所有问题的宝贵经验。我一直在阅读有关 IT 趋势解决方案的新闻,例如 linkedin.com 最近迁移到了 node.js(我认为是整个后端......)。以下是一些来源:Hacker newsRedditHigh Scalability

        附:在 php 中广为人知的部署工具是 capistrano,但我仍然会使用 puppet 和 makefile。它只是更快、更透明。

        【讨论】:

          猜你喜欢
          • 2016-05-02
          • 2021-10-21
          • 1970-01-01
          • 2016-03-12
          • 1970-01-01
          • 2019-09-15
          • 1970-01-01
          • 1970-01-01
          • 2014-06-26
          相关资源
          最近更新 更多