2011-08-19 1 views
6

ウェブサイト用に2つのサーバーがあります。 1つのサーバーにはPHPコードとデータベースがあり、もう1つは速度の遅いサーバーでファイルを格納するだけです。私は、ウェブサイトを通じてアップロードされたファイルが別のサーバに保存され、そこからダウンロードできるような方法でこれらを実装する必要があります。PHPウェブサイトのファイルサーバーを別にします

誰でも私にそれを達成するための最良の方法を提案できますか?私はファイルがWebサイトを介してアップロードした直後にPHPのFTP機能によって別のサーバに転送できることは知っていますが、正しい方法ではありません。

イメージのような静的なメディアコンテンツに2つのサーバーを使用することもできます。

ありがとうございます

+0

セカンダリサーバーにはどのような種類のファイルが保存されていますか? – ExtremeCoder

+0

多くの情報が必要です。どんな種類のOSが稼働しているのですか?あなたはそれに管理者権限を持っていますか? –

+0

コメントありがとうございました。ファイルはアプリケーションユーザによってアップロードされます。それは、pdf、docと画像かもしれません。サーバーはLinuxベースでなければなりません。私はそれが可能でないかもしれないので、私は管理者のアクセスを持っている必要があります – phpian

答えて

13

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

Webサーバーの/ etc/fstabファイルにNFSを追加してマウントするようにしてください。 (More info on NFS

このアイデアの利点は、あなたが拡大したいとき、これはあなたが好きなだけWebサーバを追加し、(HAProxyのような)ソフトウェアロードバランサーを置くことによって容易に可能であるとあなたが同期してデータを持っているということです。

+0

2台のサーバーがあることを意味します。 2番目のサーバーはメインサーバーにマウントされ、このアプリケーションを実行することで別のサーバーについて考える必要はありません。それは1つのシステムとして2番目のサーバーのための他のURLとして扱われません。 – phpian

+0

専用のコンテンツ配信ネットワークのような外部のスペースを使用できないため、これは質問の一部にしか答えません。 – Lars

4

アップロードディレクトリをWebサーバーにマウントすることはできますか。 チェックLinux NFS

3

これが最善の方法かどうかわかりませんが、単にファイルサーバーを別のサブドメインにするのはなぜですか?これにより、ファイルダウンロードの細目をすべて処理でき、メインサーバーからFTPまたはSFTP経由で接続することができます。

  1. ポイントセカンダリサーバーでのサブドメイン:

    基本的には、ここにあなたが使用できるプロセスです。私はそれにいくつかの情報を見つけたhere

  2. ファイルを処理して検証するメインサーバーにアップロードフォームがあります。
  3. ファイルが許容可能と見なされたら、FTPまたはSFTP経由で他のサーバーに送信します。このためにPHPツールを使用できない場合は、phpseclibが役に立ちます。この手順をマルチスレッドにしたい場合があります。
+0

これを持っていると、アプリケーションを通してアップロードされるすべてのファイルが他のサーバーへのFTPになるため、メインサーバーで過負荷になります。エンドユーザは、ファイルがアップロードされるので、最初にメインサーバ(データベースエントリーを行う)にファイルがアップロードされ、ファイルサーバへのFTPになるため、余分な遅延が発生します。 – phpian

0

アプリケーションでファイルサーバーへの集中的な読み取り/書き込みが必要な場合は、それを分離するのは悪い考えです。 NFSをメインWebサーバーにミラーリングして待ち時間を短縮することができます。静的ファイルへのすべてのリクエストを処理するためにnginxの

使用(例:CSS、画像、JavaScript)

5

私はこのようなことが可能になりますGlusterと呼ばれるものを使用しました。私がそれを使用する状況は、代替コンテンツ配布よりもロードバランシングの方が多くなります。

また、スタックオーバーフローのようなサイトでは、サイト上の特定の情報についてContent Distribution Networkサービスを使用しています。このようなソリューションは、実際には新しいサーバー全体を購入/設定/保守するよりもコスト効率が良いかもしれません。

+0

非常に興味深いプロジェクトのように見える、ありがとう! – Lars

+0

+1 Gluster、素晴らしい解決策。 – ceejayoz

1

url wrapperを使用すると、ftpサーバーがこの接続タイプを受け入れる場合は、デフォルトのmove_uploaded_file()を使用できます。また、PHPのftp functions、特にftp_put()を使用してファイルをサーバーにアップロードすることもできます。

は、コンテンツ配信のために、あなたは、コンテンツ配信サーバ上の元のURLを取得し、HTMLの引数にURLを入れて、データベースまたは他の手段を持っている必要があります:

<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:[email protected]/$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 ... 
    } 
} 
0
  1. ファイルをダウンロードしてアップロードするディレクトリにファイルサーバー上の共有を作成します。別のフォルダにtyemを保存する予定の場合は2つの共有になります。

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

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

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

このアプローチは、サーバーOSがファイルサーバーとのファイルのやりとりを処理するため、私はこのアプローチが好きです。 PHPは、それが必要なファイルを伝えるだけです。