トラックフロー+オープンソース=シンプルファイルストレージ

Tracks Flowプロジェクトがオープンソースコミュニティのサポートを開始していることをお知らせします。 今日、私たちはオープンアクセスのシンプルな開発を投稿しています-PHPのファイルストレージサーバーとC#のクライアントライブラリ。

厳密に判断しないでください-このプロジェクトはかなり前に書かれたもので、それ以来fidel.ru、tracksflow.comで変更なしで使用されています。 オープンアクセスでレイアウトする前に、それを少しとかしました。

このコードは、大規模な(そうではない)ファイル用のストレージシステムを最小限の労力で実装したい人を対象としています。

長所



*大きなファイルで正しく動作しない可能性がある唯一の機能は、md5ファイルの量を確認することです。 この関数は、TimeOutExceptionを発生させる場合があります。

仕組み


ファイルはデータのチャンクでダウンロードされます-チャンクごとに1つのPOST要求。 ダウンロードは順次行われます。 次の要求を処理するとき、サーバーは受信した部分を結果のファイルに追加します。 すべての操作は、ターゲットファイルの長さに不変です。
すべてのファイルは、ディレクトリ構造内のファイルシステムに保存されます。
 /<_>//<___id>/<___id>/<-__id>/<filename.ext> 
, .
Nginx X-ACCEL_REDIRECT . Nginx.


Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }

/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.


Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }

/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.


Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
    /<_>//<___id>/<___id>/<-__id>/<filename.ext>
    , .
    Nginx X-ACCEL_REDIRECT . Nginx.


    Nginx + php-fpm. nginx :
    server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
  1. /<_>//<___id>/<___id>/<-__id>/<filename.ext>
    , .
    Nginx X-ACCEL_REDIRECT . Nginx.


    Nginx + php-fpm. nginx :
    server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
    /<_>//<___id>/<___id>/<-__id>/<filename.ext>
    , .
    Nginx X-ACCEL_REDIRECT . Nginx.


    Nginx + php-fpm. nginx :
    server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
  2. /<_>//<___id>/<___id>/<-__id>/<filename.ext>
    , .
    Nginx X-ACCEL_REDIRECT . Nginx.


    Nginx + php-fpm. nginx :
    server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }

  • サーバーファイルを<path_to_php_code>ディレクトリにコピーします
  • lib.phpをチェックします-getfsroot()関数は、<storage_root_path_should_be_the_same_in_lib.php>の設定で指定されたパスを返す必要があります。 getlocroot()関数には、<location_name>の構成で指定されたものと同じものが含まれている必要があります。
  • <storage_root_path_should_be_the_same_in_lib.php>にNginx / php-fpmと同じ権限を設定し、書き込み権限を付与します。
  • 512KBを超えるチャンクを使用する場合は、php-fpm、nginx、およびphp.iniで、アップロードの制限に対応する値を書き込む必要があります。

    スケーリングする方法


    保存されているファイルの量でスケーリングする場合、複数のサーバーを使用する必要があります。 この場合、必要な数のサーバーにLufsをインストールし、Webサーバーにファイルシステムをマウントして、ローカルディレクトリと同様に操作すると便利です。

    ユースケース


    このソリューションでは、ユーザーアバターとプレイリストカバーを保存します。 したがって、エンティティのタイプごとに2つのスペース(スコープ)を使用します。 各画像の識別子は、データベース内のエンティティの識別子と同じです。 ファイル名は、エンティティのファイルタイプとjpg拡張子を定義するサイズsysnem(たとえば、ImageLarge)で構成されます。 このアプローチでは、エンティティの識別子のみを認識し、エンティティに対応するファイルタイプのディレクトリを作成して、ファイルへのリンクを作成できます。

    参照資料


    Gitソリューションリポジトリ: https : //github.com/tracksflow/FileStorage

    もちろん、 TracksFlow.comに招待します。 このサービスは活発に開発されているので、長く滞在していなければ間違いなく面白いものを見つけるでしょう。 まあ、まだされていない人のために-今日、私たちは会社の従業員にPMでリクエストを送信するすべての人に招待を配布しています(メッセージにメールアドレスを示すことを忘れないでください)。
  • Source: https://habr.com/ru/post/J150514/


    All Articles