0

我正在为正在运行的文件上传站点构建多服务器支持。当图像上传时......它们被缩略图并存储在主前端服务器上,直到 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 的情况下将文件移动到其目的地,但这需要时间,并且会延迟脚本直到移动完成。我也不喜欢让用户运行这样的命令,我宁愿让服务器定期执行这些命令。

还有什么我可以的吗?

4

10 回答 10

3

您可以在 .htaccess 中使用 mod_rewrite 命令来检查 temp_content 中的文件是否存在,如果不存在,则让它将它们重定向到新位置

于 2009-07-01T17:43:35.840 回答
1

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

于 2009-07-01T17:44:01.143 回答
1

非常简单:

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

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

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

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

于 2009-07-01T20:01:46.727 回答
0

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

在一个想法世界中,我会看到你将这个文件直接放到它的最终位置,因为你需要允许用户访问链接。

于 2009-07-01T17:44:18.193 回答
0

一些JavaScript怎么样?

<img src="http://www.domain.com/temp_content/filename.jpg"
onerror="this.src='http://server1.domain.com/thumbs/filename.jpg'">
于 2009-07-01T17:48:31.200 回答
0

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

于 2009-07-01T17:53:29.537 回答
0

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

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

于 2009-07-01T18:26:24.007 回答
0

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

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

  1. 实际提供文件(从位置读取字节并将字节发送到客户端)。
  2. 将客户端重定向到不同服务器上的实际位置。
于 2009-07-01T19:37:24.403 回答
0

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

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

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

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

于 2009-07-01T19:45:53.327 回答
0

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

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

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

于 2009-07-01T20:00:48.693 回答