您如何在本地高效开发/测试然后在生产服务器上启动?

时间:2013-06-11 12:06:35

标签: php testing web-applications

我在决定如何有效开发和测试Web应用程序时遇到问题,然后在生产服务器上启动它们。我是网络开发的新手,也是一般开发大型项目的新手,所以请耐心等待。

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

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

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

4 个答案:

答案 0 :(得分:3)

由于每个人的工作方式不同,这将导致相当自以为是的回应,但这里有一些一般规则可以帮助您:

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

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

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

答案 1 :(得分:1)

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

  1. 您对托管环境的操作系统的评价是多少
  2. 您对托管环境的访问权限
  3. 您希望在项目中使用哪些技术(假设PHP为初学者)
  4. 假设你可以决定你所托管的操作系统,并且拥有对该托管环境的完全访问权限(如果你仍在决定主机,我会推荐两者),那么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版本,如果你设法遇到不兼容的软件包要求,最简单,最干净的解决方案是运行另一台机器, 方式它(我把它留给谷歌),但我个人喜欢把事情分开。老实说,它不应该出现太多。

    除此之外,我只能说我希望你在开发网页时玩得开心!不要害怕尝试其他语言; Node.jsPythonGo以及许多其他人在服务器端玩游戏非常有趣,而Jquery,Angular.js和其他许多人在客户端都非常棒。

    快乐的编码!

答案 2 :(得分:1)

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

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

所以基本上有这3个工具,您可以在几分钟内设置与生产相同的测试服务器。我们走得更远,我们在服务器上使用API​​进行hypervizor,因此我们可以在几分钟内为任何新开发人员创建devbox,我们有很多承包商,同样可以通过amazon实例实现。当然,您需要通过在puppet中编写脚本来准备您的环境(或者如果您的环境不是那么大,您可以使用bash来完成),具有足够的配置等等。

此过程名为 - Deployment

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

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

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

P.S。在php广为人知的部署工具是capistrano,但我仍然会使用puppet和makefiles。它更快更透明。

答案 3 :(得分:1)

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

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

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

测试环境需要与开发环境分离,并尽可能接近生产环境的表示。您可能需要两个版本的测试环境,一个用于测试功能,其他数据捕获用于第一次通过验证,以便捕获数据开发需要修复发现的问题,另一个版本尽可能密切地复制生产了解效率问题。

不应允许开发人员将开发工具放在测试环境中。我已经看到过某些东西被投入到生产中导致系统崩溃的情况,因为缺少开发环境所提供的组件。您希望在测试环境中捕获这些问题。

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

主要是尽可能地将生产与开发隔离开来,以便您确切了解生产服务器中的内容。当您改变生产服务器上的内容时,您可以很好地了解变化的原因以及变化对生产环境的影响。

这是使用诸如Mercurial或Subversion之类的存储库放置质量控制角色的地方。我们的想法是,存储库中的内容是作为完整包进行测试的内容。一旦在特定包装上完成测试并且质量良好,那么包装就会投入生产。

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

因此,如果您拥有生产环境的黄金版本,某种形式的图像,那么您可以使用它来复制其他服务器,测试环境和设计器测试环境。生产环境的其他变体将拥有自己的包,并且需要添加到生产环境中,例如开发环境将是生产环境以及带有工具,设计器测试数据等的开发环境。

这就是虚拟机非常方便的地方。

这听起来既费力又低效。然而,人们会犯错误,这种过程有助于减少错误使其投入生产的可能性。

相关问题