2

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

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

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

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

4

4 回答 4

3

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

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

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

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

于 2013-06-11T12:21:38.017 回答
1

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

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

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

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

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

我也会考虑建立一个版本控制系统。(Git很棒,Mercurial也很棒)适合您的项目。不要害怕任何感知到的学习曲线,这些工具使用起来非常简单,而且一旦你准备好使用电动工具,它们也非常强大。

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

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

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

快乐编码!

于 2013-06-11T12:53:08.110 回答
1

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

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

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

这个过程称为-部署

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

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

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

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

于 2013-06-11T13:13:24.650 回答
1

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

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

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

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

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

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

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

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

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

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

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

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

于 2013-06-11T13:59:39.193 回答