我有两台服务器用于网站。一台服务器将拥有php代码和数据库,另一台服务器将只有较低速度的服我需要以一种方式实现这些,即通过网站上传的文件必须存储在另一台服务器上,然后才能从那里下载。
任何人都可以建议我实现这一目标的最佳途径。我知道文件可以通过网站上传后通过PHP的FTP功能转移到另一台服务器,但似乎没有正确的方法。
或者两个服务器可用于静态媒体内容,如仅图像。
由于
答案 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从主服务器连接到它。
基本上,这是一个你可以使用的过程:
答案 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 ...
}
}
<?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)
在文件服务器上创建一个共享到您要下载和上载文件的目录。如果您打算将tyem保留在单独的文件夹中,则需要两股。
使用PHP代码Base映射Web服务器上的文件夹。确保使用登录信息连接到具有读写权限的共享。
映射共享后,在网站上创建一个共享文件夹的虚拟目录(这完全取决于您的Web服务器)。
检查PHP如何处理访问网站中共享驱动器上的文件,具体取决于您的网络服务器,它可能与您正常处理文件的方式不同。
我喜欢这种方法,因为服务器操作系统处理文件与文件服务器之间的传输。 PHP只是处理告诉它需要哪些文件。