7

Webサイト用に2つのサーバーがあります。1つのサーバーにはphpコードとデータベースがあり、もう1つのサーバーにはファイルのみを保存する速度の遅いサーバーがあります。Webサイトからアップロードされたファイルを別のサーバーに保存し、そこからダウンロードできるように、これらを実装する必要があります。

誰かが私にそれを達成するための最良の方法を提案できますか?ウェブサイトからアップロードした直後に、phpのFTP機能でファイルを別のサーバーに転送できることは知っていますが、正しい方法ではないようです。

または、2台のサーバーを画像などの静的メディアコンテンツにのみ使用できます。

ありがとう

4

7 に答える 7

14

最良のアイデアは、「ストレージサーバー」上のWebサイトファイルを含むすべてのファイルを保持することです。基本的にあなたがすることは「共有フォルダ」をマウントすることです、これはあなたが必要とするウェブサイトファイルと他のファイルを意味します。(ほとんどの場合、ストレージサーバーには/ var / www-local /フォルダーがあり、Webサーバーの/ var / www /にマウントします)。

Webサーバーの/etc/ fstabファイルに追加して、NFSを使用してマウントしてください。(NFSの詳細

このアイデアの利点は、拡張したいときに、ソフトウェアロードバランサー(HAProxyなど)を配置し、必要な数のWebサーバーを追加することで簡単に実現でき、データを同期できることです。

于 2011-08-25T07:43:08.970 に答える
5

私はこのようなことを可能にするGlusterと呼ばれるものを使用しました。私がそれを使用する状況は、代替コンテンツ配信よりも負荷分散のためです。

また、Stack Overflowのようなサイトは、サイト上の特定の情報にコンテンツ配信ネットワークサービスを使用しています。このようなソリューションは、実際には、まったく新しいサーバーを購入/セットアップ/保守するよりも費用効果が高い場合があります。

于 2011-08-27T20:08:11.293 に答える
4

アップロードディレクトリをWebサーバーにマウントできる可能性があります。LinuxNFSを確認してください

于 2011-08-25T05:11:45.973 に答える
3

これが最善の方法かどうかはわかりませんが、ファイルサーバーを別のサブドメインにするだけではどうでしょうか。そうすれば、すべてのファイルダウンロードの特徴を処理でき、メインサーバーからFTPまたはSFTP経由で接続できます。

基本的に、使用できるプロセスは次のとおりです。

  1. サブドメインをセカンダリサーバーにポイントします。私はここでそれに関するいくつかの情報を見つけました。
  2. ファイルを処理および検証するアップロードフォームをメインサーバーに用意します。
  3. ファイルが受け入れ可能と見なされたら、FTPまたはSFTPを介して他のサーバーに送信します。このためにPHPツールを機能させることができない場合は、phpseclibが役立つ可能性があります。このステップをマルチスレッドにすることをお勧めします。
于 2011-08-25T05:18:29.877 に答える
2

ftpサーバーがこの接続タイプを受け入れる場合は、URLラッパーを使用することで、デフォルトの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、images、javascriptなど)へのすべてのリクエストを処理します

于 2011-08-26T14:39:32.600 に答える
0
  1. ファイルサーバー上に、ファイルをダウンロードおよびアップロードするディレクトリへの共有を作成します。tyemを別々のフォルダーに保持する場合は2つの共有。

  2. PHPコードベースを使用してWebサーバー上のフォルダーをマップします。ログインを使用して、読み取りおよび書き込みアクセス権を持つ共有に接続していることを確認してください。

  3. 共有をマップしたら、Webサイトに仮想ディレクトリを共有フォルダーに作成します(これはすべてWebサーバーによって異なります)。

  4. PHPがWebサイトの共有ドライブ上のファイルへのアクセスをどのように処理するかを確認します。Webサーバーによっては、通常のファイルの処理方法とは異なる場合があります。

サーバーOSがファイルサーバーとの間のファイルの転送を処理するため、このアプローチが気に入っています。PHPは、必要なファイルの通知を処理するだけです。

于 2011-08-30T17:53:41.990 に答える