php网站的单独文件服务器

时间:2011-08-19 12:37:38

标签: php apache fileserver

我有两台服务器用于网站。一台服务器将拥有php代码和数据库,另一台服务器将只有较低速度的服我需要以一种方式实现这些,即通过网站上传的文件必须存储在另一台服务器上,然后才能从那里下载。

任何人都可以建议我实现这一目标的最佳途径。我知道文件可以通过网站上传后通过PHP的FTP功能转移到另一台服务器,但似乎没有正确的方法。

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

由于

7 个答案:

答案 0 :(得分:13)

最好的想法就是拥有所有文件,包括“存储服务器”上的网站文件。基本上你所做的是挂载“共享文件夹”,这意味着你需要的网站文件和其他文件。 (大多数情况下,您在存储服务器上只有一个/ var / www-local /文件夹,您在Web服务器上的/ var / www /中安装了该文件夹。)

确保使用NFS将其添加到Web服务器上的/ etc / fstab文件中。 (More info on NFS

这个想法的优点是,当您想要扩展时,通过放置软件负载均衡器(如HAProxy),添加尽可能多的Web服务器并且您将使数据同步,这很容易实现。

答案 1 :(得分:5)

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

此外,像Stack Overflow这样的网站会在其网站上使用Content Distribution Network服务来获取某些信息。像这样的解决方案实际上可能比购买/设置/维护一个全新的服务器更具成本效益。

答案 2 :(得分:4)

您可以将上传目录挂载到Web服务器。 查看Linux NFS

答案 3 :(得分:3)

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

基本上,这是一个你可以使用的过程:

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

答案 4 :(得分:1)

如果您的ftp服务器接受此连接类型,则使用url wrapper,您可以使用默认的move_uploaded_file()。或者,您可以使用PHP的ftp functions,尤其是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 ...
    }
}

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

  1. 在文件服务器上创建一个共享到您要下载和上载文件的目录。如果您打算将tyem保留在单独的文件夹中,则需要两股。

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

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

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

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