不确定这是否可行,但也许有另一种方法可以得到相同的结果。
旧情况
我正在运行一个使用 CentOS 6 的 LAMP 服务器。该服务器托管着我们拥有的很多网站。在文件系统中,我们有一个文件夹,其中包含这些网站共有的所有资产(图像、音频文件等)。我们谈论的是大约 400K 个文件和 60 GB 的数据。
网站访问该文件夹的方式是通过符号链接称为资产放置在各自文档根目录的根目录中(因此基本上有几十个这样的资产由于符号链接遍布整个文件系统,因此所有这些网站的代码都充满了对这些符号链接的引用,以便在其页面中加载这些文件。
假设资产符号链接指向/server/path/to/assets
。例如,网站会通过调用 来加载文件http://mywebsite.com/assets/audio_file.mp3
。在内部,assets 符号链接会加载位于 的文件/server/path/to/assets/audio_file.mp3
。
新形势
我们决定资产文件夹从服务器上移到互联网上的另一个位置(如果有人好奇的话,是 AWS S3),以节省服务器中的空间并减少负载。
问题
由于我们要移动这些资产的位置,我们需要手动更改所有网站代码中对这些资产的所有引用。这当然是一项艰巨的工作,我们谈论的是数千个。
可以选择在所有网站的代码中使用搜索和替换,如果没有其他办法,我会这样做,但出于不同的原因,如果可能的话,我宁愿避免这样做。
理想的解决方案
我理想中的想法是,创建一个符号链接,让所有当前符号链接指向该链接,并使其指向我们的 AWS S3 存储桶的 URL。例如:
- 删除
/server/path/to/assets
文件夹(当然,先移动其中的所有文件) - 创建一个新的符号链接(或任何其他可行的解决方案)称为资产而不是指向的文件夹
https://my-amazon-s3.com/assets
然后,神奇的是,当网站想要加载时http://mywebsite.com/assets/audio_file.mp3
,它会在 AWS S3 存储桶中查找文件,而不是我们的服务器。
我知道这可能要求有点太多,所以我希望也许有人会建议另一种方法来解决这个问题。
答案1
无法创建到未挂载文件系统的符号链接。
可以使用以下方式将 S3 存储桶安装为本地文件系统s3fs
,请参阅https://github.com/s3fs-fuse/s3fs-fuse。一旦您这样做,它就会显示为本地文件系统,您可以以正常方式进行符号链接。
请注意,这在后台使用 S3 API 将内容提取到本地服务器并从那里交付。相对而言,它很慢。这可能使它不适合您的网站,但决定权在您手中。
您可能希望考虑的另一种方法是使用 Apache 的功能重定向请求RewriteRule
。使用正则表达式,这相当简单,
RewriteRule ^/assets/(.*)$ https://my-amazon-s3.com/assets/$1 [R=302,L]
如果您使用 HAProxy,那么您可以获得类似的结果。