必要でした:
- 大きなファイルのアップロード/アップロードを許可します。
- ファイルへの直接リンクの複製を許可しないでください。
- 同時にダウンロードするファイルの数を制限します。
実装のために、彼らはfastcgiを介してPHPとともにNGINXを選択しました。
NGINXで追加:
- 豪華なNginxアップロードモジュール 。NGINX-PHPパスでダウンロードしたファイルの複数のコピーを回避します。 さらに、少し改良を加えて、目的のフォルダーに直接ダウンロードすることができます。これにより、PHPにコピーする代わりに簡単な名前変更を使用できます。
- secure_linkモジュールに必要なパッチ 。これにより、安全なリンクを限られた期間有効にすることができます
PHPは最も一般的なものを使用し、 spawn-fcgiを介して起動しました 。
彼らは、12個のテラバイトディスクを詰めた小さなサーボチカを置きました。
プログラマーはPHPコードを作成し、Maris Ruskulisは、NGINXを書き換える次のトリックを思い付きました。これにより、ファイルをダウンロードするときにPHPにアクセスできなくなります。
その結果、NGINX設定は次のようになりました。
http {
limit_zone regular $zonekey 10m;
limit_zone premium $zonekey 10m;
server {
root /www/oursiteishere;
location / { try_files $uri @files; }
location ~ \.php$ { try_files $uri @files; fastcgi_stuff_here; }
location @files { rewrite ^(.*)$ /index.php?$1 last; }
location /storage/ { root /storages/; internal; }
# Location for regular users
location ~ /download/.+/(.+)/0/.+/.*/(.+)$ {
set $fname $2;
set $username $1;
set $zonekey "$binary_remote_addr $username";
limit_conn regular 1;
limit_rate '100k';
secure_link_secret megasecret;
secure_link_ttl on;
if ($secure_link = "") { return 403; }
add_header Content-Disposition "attachment; filename*=UTF-8''$fname";
rewrite ^/download/([a-f0-9]+)/([\.~0-9a-zA-Z_]+)/([01])/([0-9]+)/(.+)/.+$ /storage/$4/$5 break;
}
# Location for premium users
# Location for upload using upload module
}
}
この構成の注目すべき点は、スプーフィングから保護された生成された一時リンクを使用してファイルをダウンロードするとき(チェックはsecure_linkによって実行される)、後続のX-Accel-RedirectではPHPが呼び出されないという事実です。
おそらくこのソリューションは、ファイルを直接アップロードする前にロジックの存在に制限を課しますが、それでも、私の意見では、fastcgiを少し節約できるかなり独創的なトリックです。