【问题标题】:File upload on load balanced server负载均衡服务器上的文件上传
【发布时间】:2010-09-28 17:42:43
【问题描述】:

我有一个我开发的网络项目,其中一个主要功能是上传文件。

所有权限均基于 Windows 身份验证。当我第一次创建项目时,我没有意识到它会在负载平衡的服务器上。现在是负载均衡服务器的环境,文件上传成了大问题。

我最初以为我可以只为网络共享创建一个虚拟目录,作为上传文件夹,但是这个解决方案变成了权限的噩梦。我无法在生产环境中进行任何成功的测试。

所以我现在在想,我的解决方案是在服务器上创建一个服务来检查上传目录并同步它们。我看到的另一种可能的解决方案是将文件存储在我过去遇到过一些问题的数据库中。

有人知道将文件上传到使用 Windows 权限进行身份验证的负载平衡服务器的直接解决方案吗?

谢谢。

更新 - 所以我已更改应用程序池以通过对共享和文件夹本身具有 Windows 权限的完全权限的域帐户运行。虚拟目录在 IIS 中具有完全权限,但我仍然遇到同样的问题。

其中需要完成的事情之一就是创建目录的能力,我认为这可能会让我感到困惑。我只是在使用 System.IO.Directory.CreateDirectory

关于我可能缺少权限的任何其他想法?

【问题讨论】:

  • 如果您说它具有“完全权限”,我不太确定可能出了什么问题 - 只要确保它确实如此,实际上对“修改”和“写入”权限目录。如果您使用组来分配 NTFS 权限,请尝试直接使用该帐户。
  • 此外,如果您更改工作进程帐户的组成员身份,则必须重新启动 IIS(不仅仅是网站或应用程序池)才能重新进行身份验证,就像用户必须注销一样并登录。
  • 您可以尝试使用 AWS S3 来存储您的文件。我在负载平衡的服务器上运行一个项目,并将任何用户上传的文件放在 S3 存储桶中。如果您的网站托管在 AWS 服务器上,则存储/检索操作会非常快。

标签: permissions file-upload load-balancing


【解决方案1】:

如果您真的想避免存储在数据库中,我认为您的下一个最佳选择是您已经谈到的虚拟目录解决方案,尽管我可以看到权限问题很容易失控,具体取决于您的设置.

在我们的生产环境中,我们所有不同的站点都有自己的应用程序池。应用程序池本身都有自己的域帐户,这使得管理文件系统和 SQL 服务器中的权限变得更加容易。这些帐户中的每一个都是 IIS WP 域组的成员。在集群中的每台服务器上,域 IIS WP 是本地内置 IIS_WPG 组的成员。群集中每台服务器上的 IIS 配置都是相同的。这样做的重要作用是确保给定的 Web 应用程序始终以相同的身份运行,而不管集群中的哪个服务器受到攻击。

使用我描述的设置,实现虚拟目录解决方案将非常简单,尽管您仍然需要担心其他明显的问题,例如命名冲突等。如果您仍在使用默认的应用程序池身份设置,我认为实施我所描述的内容将有助于您在处理集群配置时更轻松。

This article lists some good advantages and disadvantages to storing in the file system:

优势

其中一个 将文件存储在 磁盘是它很容易做到的。 只需在 FileUpload 上调用 SaveAs 控制,你就完成了。

另一个优点是文件在 磁盘易于备份;你只是复制 文件到另一个位置。这 也使增量更容易 备份;已经存在的文件 备份不需要复制 再次。

缺点

存储 您在文件系统中的文件有 缺点也很少。大概 最成问题的问题是 文件的松耦合性质 磁盘。他们没有很强的关系 与数据库中的记录。所以, 例如,当您从 数据库,你最终可能会得到一个 孤立的产品形象。没有 在之间进行 INNER JOIN 的直接方法 产品表和您的图片 文件夹来确定什么是孤立的 你留下的文件。这意味着一个 页面开发者负责 编写删除文件的代码 从磁盘每当关联 数据库记录被删除。

此外,要将上传的文件存储在磁盘上, 您的网络服务器需要权限 写入文件系统。这很容易 当你自己跑的时候过来 服务器,但可能会更多 在 ISP 场景中存在问题。

【讨论】:

    【解决方案2】:

    您的解决方案应该可以正常工作:

    1. 创建网络帐户
    2. 让每台服务器上的应用程序的应用程序池在此帐户下运行
    3. 在特定服务器上创建一个文件夹并授予此网络帐户权限
    4. 将文件夹设置为“共享”,并授予帐户对共享的权限
    5. 设置所有服务器使用该目录存储上传的文件

    【讨论】:

      【解决方案3】:

      仅供参考,

      解决此问题的方法是使用有权访问共享、文件夹权限和虚拟目录权限的用户帐户进行临时模拟。

      当我最初尝试这个时,我的模拟代码有一些错误,然后在修复时输入了错误的密码,所以我放弃了这种方法。我终于尝试了其他所有方法并回到了这个 - 看起来它正在工作。

      因此,当将网络共享处理为看起来像的虚拟目录时,答案就是模拟。

      这是实现这一切的代码的链接:

      http://support.microsoft.com/kb/306158#4

      【讨论】:

      • 您为什么要为此使用模拟?这意味着您必须将凭据存储在应用程序中的某个位置,这很丑陋(恕我直言)。
      • 它被标记为accepted(这并不一定意味着正确),因为他决定接受他自己对自己问题的回答。还是很丑。
      最近更新 更多