【问题标题】:How to make a static URL point to different servers?如何使静态 URL 指向不同的服务器?
【发布时间】:2009-07-01 17:40:47
【问题描述】:

我正在为正在运行的文件上传站点构建多服务器支持。上传图像时......它们会被缩略图化并存储在主前端服务器上,直到 cron 执行(每 10 分钟)并将它们移动到存储服务器,因此在前 10 分钟内,它们将驻留并提供服务关闭主前端服务器。

上传文件时,会为用户提供嵌入代码...这是一个缩略图 url + 指向完整大小的链接,这是一个 html 页面。所以它可能类似于http://www.domain.com/temp_content/filename.jpg 链接到http://www.domain.com/file-ID

除了 10 分钟,http://www.domain.com/temp_content/filename.jpg 将不存在,它将是 http://server1.domain.com/thumbs/filename.jpg

如果用户获取原始代码...拇指文件将被破坏。

我可以在没有 cron 的情况下将文件移动到其目的地,但这需要时间,并且会延迟脚本直到移动完成。我也不喜欢让用户运行这样的命令,我宁愿让服务器定期执行这些命令。

还有什么可以吗?

【问题讨论】:

    标签: php file storage


    【解决方案1】:

    您可以在 .htaccess 中使用 mod_rewrite 命令来检查 temp_content 中的文件是否存在,如果不存在,请使用 redirect them to the new location

    【讨论】:

      【解决方案2】:

      您是否考虑过存储 image_name/image_location 的数据库,以及用于从数据库详细信息中提供图像的通用 PHP 脚本?

      【讨论】:

      • 所以对于嵌入页面的每个拇指...它必须查询数据库并获取它的位置?那将是灾难性的。
      • 性能可能没有那么差——这是数据库的设计目的,因此通常比文件系统访问更快。从工程的角度来看,采用最简单的设计并解决实际出现的性能问题。
      【解决方案3】:

      很简单:

      我不喜欢你的文件路径,所以我改变了它。 ^_^

      创建链接以立即转到主存储。 http://www.domain.com/file/filename.jpg

      在主服务器上使用这样的规则集

      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_URI} /file/(.+)
      RewriteRule ^/file/.+ /temp_content/%1 [L,R]

      【讨论】:

        【解决方案4】:

        说真的,鉴于您的情况,我能看到的唯一选择是为您的用户提供实际的 URL,因为我相信您将能够了解他们。然后,您需要通知用户他们在 10 分钟内无法实际使用该链接。

        考虑到您需要允许用户访问该链接,我会看到您将此文件直接放到其最终存放位置。

        【讨论】:

        • 如果我有 10 台服务器,我不知道文件会去哪里。 Cron 在执行时决定。
        【解决方案5】:

        一些 JavaScript 怎么样?

        <img src="http://www.domain.com/temp_content/filename.jpg"
        onerror="this.src='http://server1.domain.com/thumbs/filename.jpg'">
        

        【讨论】:

        • 在文件被移动之前,我不知道它是 server1、server 16 还是 server9。
        【解决方案6】:

        我不明白这会是什么问题。如果您让用户上传文件,他们的位置必须存储在正确的记录中吗?当您生成这些记录时,您的页面必须检查这些记录吗?为什么不添加另一个字段来指定他们所在的服务器。然后确保 cron 任务在完成移动文件后更新记录?

        【讨论】:

        • 如果数据库可用,我建议考虑使用数据库而不是文件。
        【解决方案7】:

        这是一种乞求网络黑客攻击的事情。基本上,域指向的自定义路由事物并将数据包转发到适当的主机。太丑了

        老实说,这对 ServerFault 来说是一个很好的问题,因为他们知道如何设置拓扑来启用这种事情。

        【讨论】:

          【解决方案8】:

          使用数据库将图像名称映射到位置。现代数据库做缓存。如果你发现性能很差,你也可以在内存中有一个简单的哈希表缓存——这样你可以在 500MB 的 RAM 中存储大约 200 万个名称->位置映射(假设每个映射大约 256 个字节)。

          对于提供文件的脚本,它可以

          1. 实际服务文件(从位置读取字节并将字节发送到客户端)。
          2. 将客户端重定向到不同服务器上的实际位置。

          【讨论】:

            【解决方案9】:

            我目前在大约 10 分钟后将我们网站上所有上传的媒体移动到 amazon s3/cloudfront,并结合使用 2 件事将用户重定向到新位置。

            对于公共资产(拇指等),我们将父项的定义与媒体的新位置(例如 server1.site.com/media/1.jpg)一起缓存。

            对于私有资产,向检查身份验证的脚本发出请求,然后发出 302 重定向到经过身份验证的 s3 url。

            长话短说,将新位置存储在 memcache 中,将 mod_rewrite 管道连接到 404 上的脚本以获取原始文件,然后 302 重定向到新位置。

            【讨论】:

              【解决方案10】:

              Cron 不会“决定”关于跨服务器的文件负载平衡的任何事情。 Cron 在指定时间执行命令。

              实际上在服务器之间进行图像负载平衡的逻辑在哪里?该逻辑的负载平衡部分可以由处理上传的脚本完成吗? cron 作业仍然可以处理图像从上传服务器到最终服务器的实际移动。

              这样,用户可以看到一个“临时”位置来验证上传。确认上传后,用户会得到一个“最终”的图片链接,以及一条关于“可能需要等待 10 分钟,图片才能在该位置‘直播’”的消息。

              【讨论】:

              • cron 脚本充当负载平衡器,它查看一些轮询器来决定应该加载文件的适当服务器。
              猜你喜欢
              • 1970-01-01
              • 2015-04-01
              • 2023-03-26
              • 1970-01-01
              • 1970-01-01
              • 2017-03-12
              • 2020-01-19
              • 2013-04-03
              • 2023-03-21
              相关资源
              最近更新 更多