如何使静态URL指向不同的服务器?

时间:2009-07-01 17:40:48

标签: php file storage

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

当文件上传时,会为用户提供嵌入代码...这是一个缩略图网址+指向完整尺寸的链接,这是一个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,但这需要时间,并且会延迟脚本直到移动完成。我也不喜欢让用户运行这样的命令,我宁愿让服务器定期执行它们。

我能做的其他事情吗?

10 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

非常简单:

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

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

主服务器上的

使用像这样的规则集

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

答案 3 :(得分:0)

真的,考虑到你的情况,我能看到的唯一选择是给你的用户实际的URL,因为我相信你能够知道它们。然后,您需要通知用户他们实际上不能使用该链接10分钟。

在一个创意世界中,我会看到你将这个文件直接放到最后的休息处,因为你需要允许用户访问这个链接。

答案 4 :(得分:0)

一些JavaScript怎么样?

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这就是网络黑客所需要的东西。基本上,域指向的自定义路由事项将数据包转发到适当的主机。这太丑了

但是,老实说,对于ServerFault来说这是一个很好的问题,因为他们是那些知道如何设置拓扑以实现此类事情的人。

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

我目前在大约10分钟后将我们网站上的所有上传媒体移至亚马逊s3 / cloudfront,并将两件事情的组合重定向到新位置。

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

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

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

答案 9 :(得分:0)

Cron没有“决定”任何有关跨服务器的文件负载平衡的信息。 Cron在指定时间执行命令。

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

这样可以向用户呈现“临时”位置以验证上传。在确认上传之后,用户将获得到图像的“最终”链接,以及关于“可能需要等待10分钟以使图像在该位置'实时'的消息。”