php网站的独立文件服务器

Posted

技术标签:

【中文标题】php网站的独立文件服务器【英文标题】:Separate file server for a php website 【发布时间】:2011-10-30 14:29:26 【问题描述】:

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

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

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

谢谢

【问题讨论】:

辅助服务器上存储了什么样的文件? 需要更多信息。服务器运行什么样的操作系统,你有管理员权限吗.... 感谢您的评论,文件将由应用程序用户上传。它可能是 pdf、doc 和图像。服务器必须基于 Linux。我必须拥有管理员权限,因为没有它可能是不可能的 谁能回答我的问题。紧急 【参考方案1】:

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

通过将它添加到网络服务器上的 /etc/fstab 文件中,确保使用 NFS 安装它。 (More info on NFS)

这种想法的优势在于,当您想要扩展时,这很容易通过放置一个软件负载平衡器(如 HAProxy)、添加任意数量的网络服务器来实现,这样您的数据就会同步。

【讨论】:

表示会有两台服务器。第二台服务器将被挂载到主服务器中,通过执行此应用程序无需考虑另一台服务器。它将被视为一个系统,没有第二个服务器的其他 url。 这仅回答了部分问题,因为您将无法使用像专用内容分发网络这样的外部空间。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

基本上,您可以使用以下流程:

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

【讨论】:

拥有这个它将在主服务器上过载,因为通过应用程序上传的所有文件都将通过 FTP 传输到其他服务器。最终用户也将面临额外的延迟,因为文件将由他首先上传到主服务器(他将执行数据库条目)然后它将是 FTP 到文件服务器。【参考方案5】:

通过使用url wrapper,如果您的 ftp 服务器接受此连接类型,您可以使用默认的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 ...
    

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

    在文件服务器上创建一个共享到您要下载和上传文件的目录。如果您打算将 tyem 保存在不同的文件夹中,则共享两个。

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

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

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

我喜欢这种方法,因为服务器操作系统负责将文件传入和传出文件服务器。 PHP 只是处理告诉它它需要哪些文件。

【讨论】:

以上是关于php网站的独立文件服务器的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何解决网站大流量与高并发的问题

PHP如何解决网站大流量与高并发的问题

如何将数据从 Heroku 上托管的 Node.js 应用程序发送到托管在完全独立(Cpanel)服务器上的 PHP 文件?

jsp第一章 动态网页开发基础

从网站上的 PHP 脚本运行 Java 类文件

在php类型网站的后台是如何上传视频文件呢