ウェブファイルを作成する

何らかの理由で、私は常にファイルをダウンロードするための独自のサービスを作りたいと思っていました。 すべての種類のslil / zalilは、速度に適していませんでした。 ifolder-豊富な広告。 私はあまり人気のないサービス( これから悪化することはありませんでした)サービスup.spbland.ruを使用しました 。 しかし、これはどういうわけか正しくありません。 そして、私は自分のサービスを書くことにしました。 詳細や日常的な作業ではなく、概念について説明します。



リソースの要件:

-少なくとも1000 MBのPOSTメソッドを使用してファイルをアップロードするのはなぜですか?

-プロセスの必須の視覚化、すなわち プログレスバーをアップロード

-ユーザーがファイルを再開する機能(ダウンロード中)

-サードパーティのフォーラム、サイト上のファイルへの直接リンクをインストールする可能性を除外します。 site.ru/IDのみ



最初に、アップロードプログレスバーについて説明します。

大量のmultipart / form-data情報を受け取ると、apacheは/ tmpにすべてを追加し、ダウンロードが完了した後(つまり、リクエスト全体がWebサーバーに到着したとき)、コントロールをphpに転送し、次にphpがmove_uploaded_fileを実行します。 その性質上、phpは、プロセスAがプロセスBのロードのどの段階であるかを知ることができないように配置されています。 入力タイプ=「ファイル」に加えて、入力タイプ=「非表示」名前=「UPLOAD_IDENTIFIER」値=「何らかの番号」をフォームに追加する必要があります。後でこの識別子を使用して、uploadprogress_get_info()関数を使用してダウンロードステータスを追跡できます:count -受信バイト、合計バイト、速度、その他のパラメーター。 私の場合、私は1秒に1回AJAXを介してスクリプトにアクセスし、関連情報を受け取りました。



タスクは完了できます:

-悪い

-わかった

-地球規模のクールな



悪い -ファイルを受け入れて、PHP経由でファイルを提供することを意味します。 HTTP 206 Partial Contentのサポートにより、このパスを少し改善できます。 ただし、このパスは、注意を払う必要のないホールにパッチを適用するためのパスです。



クール:ファイルのアップロードはApacheによって処理されるべきであり、nginxによって処理されるべきです。 第一に、これらのプログラムはHTTP / 1.1仕様を完全にサポートし、第二に、Apacheは解釈されたphpよりも常に高速に実行されます。 Nginxには、ファイルをアップロードするための特別なX-Accel-Redirectメカニズムがあります。 一番下の行は、nginxが透過プロキシサーバーとしてインストールされることです。 Nginxは、 site.ru / somefiles / 123.mp3ファイルに対するユーザーのリクエストを処理し、Apacheとphpに転送します。 さらに、nginxツールまたはmod_rewriteを使用して



RewriteRule ^/somefiles/(.*)$ /get.php?path=$1 [L]







リクエストは/get.php?path=123.mp3に要約されます

PHPで、クライアント、セッションなどのIPアドレスを分析します。 ファイルを発行するか拒否するかが決定されます。 次に、phpは特別に細工されたヘッダーを渡します。



header("X-Accel-Redirect: /files/123.mp3")







nginxはそれ自体を制御し、すでに独自の手段でファイルを提供し始めているため、apacheよりも数百倍も効率的です。 ただし、このメソッドには独自の方法があります。ファイルをサーバーにアップロードするとき、nginxはリクエスト全体を完全に受信し、それからのみそれをApacheに転送します。 nginxがファイル全体を完全に受信するまで、apacheはダウンロードが進行中であることすら知らないため、アップロードプログレスバーは不可能です。



結論:ファイルはapacheから直接アップロードし、nginxからアップロードする必要があります。 私の場合、nginx(またはapache)を他のポートでハングさせることができます。 しかし、ファイアウォールを詰め込んだユーザーに80以外のポートからダウンロードさせることは、よくあることではありません。 したがって、nginxを個別のアドレス(たとえば、download-0.site.ru)にハングさせる方が適切です(この概念を使用すると、後でサーバーを追加できます)。 しかし、2つのアドレスを使用できなかったため、惑星バージョンのファイルホスティングを拒否する必要がありました。



ただし、以前に設定したすべてのタスクを保持したいのです。



わかった そして、私の助けになりました: Rewritemap



このような構造を構築することにより:



Rewritemap ipmap txt:/home/anton/iplist.txt

RewriteCond ${ipmap:%{REMOTE_ADDR}} =allow

RewriteRule ^([0-9]+)/download/ /xfiles/$1 [L]

RewriteRule ^([0-9]+)/download/ /$1/ [L,R=302]

RewriteRule ^([0-9]+)/? /view.php?id=$1 [L]








iplist.txtファイルにクライアントIPアドレスがあった場合、またはsite.ru/ページにリダイレクトされた場合、site.ru / 100200300 / download / 22.mp3の形式のリンクをファイル/ xfiles / 100200300(ファイルが実際にある場所)にリダイレクトする機会を得ましたcaptchaを使用した100200300は、コードが図に正しく示されている場合、クライアントIPをiplist.txtファイルに入力し、Locationを介して再度リダイレクトします。

site.ru/100200300/download/22.mp3ですが、今回は実際のファイルのアップロードが行われます。



iplist.txtファイルの形式は次のとおりです。



77.1.1.1 allow # 1207100906







ラティスの後、この行をいつ削除するかを特別なサービススクリプトに伝えるタイムスタンプがあります。 サービススクリプトは、crontabを介して1時間に1回実行されます。



その結果、私はかなり正確で信頼できるシステムを得ました。 おそらくその欠点は、RAMの非効率的な使用です。 各Apacheプロセス(mpm preforkモジュールを使用)は、一度に1つのクライアントしか処理できませんが、プロセス自体は約10 MBのメモリを消費します。 1000個のモデムがそれぞれ10スレッドでサーバーから同時にダウンロードを開始すると仮定すると、崩壊が発生し、十分なメモリがないはずです。 しかし、Httpd.conf MaxClientsからのディレクティブはこれから私を救います。 nginxでは、このような問題は原則として存在しませんでした。 さらに、nginxには、たとえば1つのアドレスからの同時接続数など、ユーザーを制限する優れた機能があります。



惑星ホスティングにアップグレードする方法:

-フロントエンドとしてnginxへの移行

-センターでファイルを受信するためのサーバーを備えた分散システムの作成

-すべてのファイルを1つのフォルダー/ xfiles /に保存することを拒否し、最初の2文字に基づいてxfiles内に別の100個のサブフォルダーを作成します。

-SASディスクに切り替えます。インターネット上では、これは単一の重いファイルの交換ではなく、何百もの小さなファイル(音楽、写真)の絶え間ないダウンロードであるためです。



記載されている作業バージョン: up.giga.su



PS私の最初のhabrapost



All Articles