十三、公共和非公共资源分开
至此,我们在重组遗留应用程序的核心方面取得了重大进展。然而,周围的建筑仍有许多不足之处。
除此之外,我们的整个应用程序仍然嵌入在文档根中。这意味着,我们需要对我们打算保密的资源进行特殊保护,或者我们需要依靠隐蔽性来确保客户不会浏览到不打算公开的资源。web 服务器配置中的错误或未能注意到特定的安全措施,可能会将我们的部分应用程序泄露给公众。
因此,我们的下一步是将所有公共资源提取到新的文档根目录中。这将防止意外交付非公共资源,并为进一步重构建立一个结构。
混合资源
目前,我们的 web 服务器充当传统应用程序的组合前端控制器、路由器和调度器。页面脚本的路由直接映射到文件系统,使用 web 服务器文档根作为基础。反过来,web 服务器文档根目录直接映射到遗留应用程序的根目录。
例如,如果 web 服务器文档根为/var/www/htdocs
,则它当前将作为应用程序根加倍。因此,URL 路径/foo/bar.php
直接映射到/var/www/htdocs/foo/bar.php
。
对于公共资源来说,这可能很好,但我们的应用程序中有很大一部分不希望外部人员直接访问。例如,与配置和设置相关的目录不应暴露于可能的外部检查。web 服务器配置中的错误可能会泄露代码本身,使恶意用户可以使用我们的密码和其他信息。
分离过程
虽然过程本身很简单,但我们正在进行的变革是一项基础性的变革。它影响服务器配置以及遗留应用程序结构。为了完全实现此更改,我们需要与负责服务器部署的所有操作人员密切协调。
一般来说,流程如下:
- 与运营部协调,传达我们的意图。
- 在遗留应用程序中创建一个新的文档根目录以及一个临时索引文件。
- 重新配置服务器以指向新的文档根目录,并抽查新配置以查看是否显示临时索引文件。
- 删除临时索引文件,然后将所有公共资源移动到新文档根目录,并在此过程中进行抽查。
- 提交、推动和协调 QA 测试的操作。
与操作人员协调
这是这个过程中最重要的一步。在未与服务器负责人(我们的操作人员)讨论我们的意图之前,我们决不能做出影响服务器配置的更改。
运营部门的反馈将告知我们需要遵循的路径,以确保我们的变革有效。他们将建议或指导我们新文档根目录名应该是什么,以及新服务器配置指令应该是什么。他们负责部署应用程序,因此我们希望尽最大努力使他们的工作尽可能简单。如果运营不愉快,那么每个人都会不高兴。
或者,如果我们没有操作人员,并且负责自己的部署,那么我们的工作就会变得越来越容易。这更容易,因为我们没有协调和沟通成本。这更难,因为我们需要关于服务器配置的具体、详细的知识。在这种情况下,请小心操作。
创建文档根目录
在与我们的操作人员协调之后,我们在遗留应用程序结构中创建了一个文档根目录。我们的运营联系人将向我们提供正确的目录名;在本例中,我们假设名称为docroot/
。
例如,如果我们当前有一个如下所示的遗留应用程序结构:
var/www/htdocs/
classes/
...
css/
...
foo/
bar/
baz.php
images/
...
includes/
...
index.php
js/
tests/
...
views/
...
... 我们在应用程序的顶层添加了一个新的docroot/
目录。在新文档根目录中,我们添加了一个临时index.html
文件。这将让我们知道,如果我们的服务器重新配置工作正常。它可以包含我们喜欢的任何文本,例如Rejoice! The new configuration works!
。
完成后,新的目录结构将看起来更像这样:
/var/www/htdocs/
classes/
...
css/
...
docroot/
index.html
foo/
bar/
baz.php
images/
...
includes/
...
index.php
js/
...
tests/
...
views/
...
重新配置服务器
现在,我们重新配置本地开发 web 服务器,以指向新的docroot/
目录。我们的操作人员应该给我们一些如何操作的指示。
在 Apache 中,我们可以编辑本地开发环境的配置文件,以更改主应用程序目录中相关.conf
文件中的DocumentRoot
指令:
DocumentRoot "/var/www/htdocs"
... 到应用程序中新创建的子目录:
DocumentRoot "/var/www/htdocs/docroot"
然后保存文件,重新加载或重启服务器以应用更改。
提示
适用的DocumentRoot
指令可能位于多个位置之一。它可以在主httpd.conf
文件中,也可以作为VirtualHost
指令的一部分在单独的配置文件中。如果我们使用的不是 Apache,那么配置可能位于完全不同的文件中。不幸的是,关于 web 服务器管理的完整说明超出了本书的范围。有关详细信息,请查看特定服务器的文档。
一旦应用了配置更改,我们将浏览到遗留应用程序,查看新文档根是否得到尊重。我们应该看看我们临时index.html
文件的内容。如果没有,我们就做错了,需要重新审视我们的变化,直到它们按预期工作为止。
移动公共资源
既然我们已经将 web 服务器配置为指向我们新的docroot/
目录,我们就可以安全地删除我们的临时index.html
文件。
这样做之后,我们的下一步是将所有公共资源从其当前位置移动到新的docroot/
目录中。这包括我们所有的页面脚本、样式表、JavaScript 文件、图像等。它不包括用户不能浏览的任何内容:类、包含、设置、配置、命令行脚本、测试、查看文件等等。
我们希望在docroot/
中保持与在应用程序基础中相同的相对位置,因此在移动时不应更改文件名或目录名。
当我们将公共资源移动到新位置时,我们应该偶尔通过浏览应用程序来抽查修改后的结构。这将有助于我们尽早发现更改中的任何问题,而不是推迟。
提示
我们移动的一些 PHP 文件可能仍然依赖于特定位置的include
文件。在这些情况下,我们可能需要修改它们以指向相对于新的docroot/
目录的路径。或者,我们可能需要修改 include 路径值,以便它们可以找到必要的文件。
完成后,我们将有一个目录结构,看起来更像这样:
/var/www/htdocs/
classes/
...
docroot/
css/
...
foo/
bar/
baz.php
index.php
js/
...
images/
...
includes/
...
tests/
...
views/
...
提交、推送、协调
当我们将所有公共资源移动到新的docroot/
目录,并且遗留应用程序在此新结构中正常工作时,我们提交所有更改并将它们推送到公共存储库。
此时,我们通常会通知 QA 我们对测试的更改。但是,由于我们已经对服务器配置进行了基础性更改,因此我们需要与操作人员协调 QA 测试。运营部门可能需要将新配置部署到 QA 服务器。只有这样,QA 才能有效地检查我们的工作。
常见问题
这真的有必要吗?
大多数情况下,将各种非公共资源留在文档根目录中似乎是无害的。但是对于我们的下一步,将公共资源和非公共资源分开是非常重要的。
回顾和下一步
我们现在已经开始重构遗留应用程序的总体架构。通过创建将公共资源与非公共资源分开的文档根,我们可以开始构建一个前端控制器系统来控制对应用程序的访问。
版权属于:月萌API www.moonapi.com,转载请注明出处