7

我有两个用于网站的服务器。一台服务器将具有 php 代码和数据库,而另一台速度较慢的服务器仅用于存储文件。我需要以通过网站上传的文件必须存储在另一台服务器上的方式来实现这些,然后也可以从那里下载。

谁能建议我实现这一目标的最佳方法。我知道文件可以在通过网站上传后通过 php 的 FTP 功能传输到另一台服务器,但似乎不是正确的方法。

或者两个服务器可以用于静态媒体内容,如图像。

谢谢

4

7 回答 7

14

最好的办法是只拥有所有文件,包括“存储服务器”上的网站文件。基本上你要做的是挂载“共享文件夹”,这意味着你需要的网站文件和其他文件。(大多数时候,您在存储服务器上只有一个 /var/www-local/ 文件夹,您将其挂载在网络服务器上的 /var/www/ 中)。

通过将它添加到网络服务器上的 /etc/fstab 文件中,确保使用 NFS 安装它。(有关 NFS 的更多信息

这个想法的好处是,当你想要扩展时,这很容易通过放置一个软件负载均衡器(如 HAProxy),添加尽可能多的网络服务器,你将让你的数据同步。

于 2011-08-25T07:43:08.970 回答
5

我使用了一种叫做Gluster的东西,它允许这样的事情。我使用它的情况更多是用于负载平衡而不是替代内容分发。

此外,Stack Overflow 等网站使用内容分发网络服务来获取其网站上的某些信息。像这样的解决方案实际上可能比购买/设置/维护全新的服务器更具成本效益。

于 2011-08-27T20:08:11.293 回答
4

可能您可以将上传目录挂载到您的网络服务器。检查Linux NFS

于 2011-08-25T05:11:45.973 回答
3

不知道这是否是最好的方法,但为什么不简单地让文件服务器有一个单独的子域呢?这样它就可以处理所有文件下载细节,您可以通过 FTP 或 SFTP 从主服务器连接到它。

基本上,这是您可以使用的过程:

  1. 将您的子域指向辅助服务器。我在这里找到了一些相关信息。
  2. 在您的主服务器上有一个上传表单,用于处理和验证文件。
  3. 当文件被认为可接受时,通过 FTP 或 SFTP 将其发送到其他服务器。如果您无法让 PHP 工具为此工作,phpseclib可能会有所帮助。您可能希望将此步骤设为多线程。
于 2011-08-25T05:18:29.877 回答
2

通过使用url 包装器,如果您的 ftp 服务器接受此连接类型,您可以使用默认的move_uploaded_file() 。或者,您可以使用 PHP 的ftp 函数,尤其是ftp_put(),将文件上传到服务器。

对于内容交付,您需要有数据库或其他方式来获取内容分发服务器上的原始 url,并将该 url 放入 html 参数中:

<img src="http://cdn1.example.com/images/68263483.png" />
<a href="http://cdn2.example.com/files/9872345.pdf">Download PDF</a>

处理上传文件的示例代码是

<?php
// ...
$uploads_dir = 'images';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, 
            "ftp://user:pass@cdn1.example.com/$uploads_dir/$name");

        // save url in your database for later retrieval ...
    }
}

或使用ftp_put()

<?php
// ...
$ftpCon = ftp_connect('cdn1.example.com') 
    or die('Could not connect to ftp server');
$uploads_dir = 'images';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        ftp_put($ftpCon, "$uploads_dir/$name", $tmp_name)
            or die("could not upload $name to ftp server");
        // save url in your database for later retrieval ...
    }
}
于 2011-08-29T15:31:56.707 回答
0

如果您的应用程序需要对文件服务器进行大量读/写,那么我认为将它分开是个坏主意。也许您可以将 NFS 镜像到您的主 Web 服务器以减少延迟!

使用 nginx 处理对静态文件的所有请求(例如:css、图像、javascript)

于 2011-08-26T14:39:32.600 回答
0
  1. 在文件服务器上创建一个共享到您要下载和上传文件的目录。如果您打算将 tyem 保存在单独的文件夹中,则共享两个。

  2. 使用 PHP 代码库映射 Web 服务器上的文件夹。确保您使用登录名连接到具有读写访问权限的共享。

  3. 映射共享后,在网站上创建一个虚拟目录到共享文件夹(这完全取决于您的 Web 服务器)。

  4. 检查 PHP 如何处理访问网站共享驱动器上的文件,具体取决于您的网络服务器,它可能与您通常处理文件的方式不同。

我喜欢这种方法,因为服务器操作系统处理与文件服务器之间的文件传输。PHP 只是处理告诉它它需要哪些文件。

于 2011-08-30T17:53:41.990 回答