ホームページ  >  記事  >  ウェブフロントエンド  >  nodejs と Python_node.js を使用して作成された単純な HTTP 静的ファイル サーバー

nodejs と Python_node.js を使用して作成された単純な HTTP 静的ファイル サーバー

WBOY
WBOYオリジナル
2016-05-16 16:41:362316ブラウズ

日常の開発プロセスでは、CDN 上に配置されたいくつかの静的ファイル (JavaScript、CSS、HTML ファイルなど) を変更する必要があることがよくあります。このプロセスでは、オンライン CDN をマッピングする方法が必要になります。ディレクトリからローカルへ ハードディスク上のディレクトリ。これにより、ファイルをローカルで変更する場合、公開する必要がなく、更新後すぐにその効果が確認できます。

たとえば、CDN ドメイン名は http://a.mycdn.com で、対応するローカル ディレクトリは D:workassets です。すべてのユーザーが http://a.mycdn.com/* にアクセスできるようにします。ローカルの D:workassets* に移動します。たとえば、http://a.mycdn.com/s/atp.js にアクセスすると、実際には、インターネットからオンライン ファイルをダウンロードせずに、ローカルの D:workassetssatp.js を読み取っていることになります。

この関数の実装は非常に簡単で、重要なポイントは次のとおりです:

1. HTTP サービスをローカルで開き、ポート 80 をリッスンします。 2. システムのホスト ファイルを変更し、「127.0.0.1 a.mycdn.com」を追加し、CDN ドメイン名をローカル サーバー アドレスにバインドします。 3. ローカル HTTP サービスを設定します。GET リクエストを受信した後、まず、対応するファイルがローカル ハードディスク上に存在するかどうかを確認します。存在しない場合は、そのファイルの内容がオンラインで返されます。返されます。

ご覧のとおり、重要な部分はローカル HTTP サービスを構築することです。この分野には、Apache や Ngnix などのサーバー ソフトウェアをローカルにインストールし、対応する転送ルールを構成するなど、多くのチュートリアルがあります。ただし、この方法はまだ少し複雑だと個人的に感じています。この記事で紹介するのは、サーバー ソフトウェアのインストールを必要としない別の方法です。

ローカルで開発とデバッグを行っているため、パフォーマンスと同時実行性の要件は高くありません。そのため、実際には Apache/Ngnix のような専門的な HTTP ソフトウェアは必要ありません。必要なのは、HTTP サービスを提供できるスクリプトだけです。たとえば、nodejs を使用して実装します。

コードをコピーします コードは次のとおりです:
/**
 * 著者: oldj
 *
 **/

var http = require("http"), url = require("url"),

パス = require("パス"),
fs = require("fs"),
local_folders、
Base_url;

local_folders = [ // ローカル パス。エージェントはこのリストのディレクトリでファイルを検索し、見つからない場合はオンライン アドレス

に移動します。 "D:/work/assets"

];
base_url = "http://10.232.133.214" // オンライン パス、ファイルが見つからない場合は、このアドレスにリダイレクトします
;

function loadFile(パス名, 応答) {

var i, l = local_folders.length,
fn;

console.log(" パス名をロードしてみます ");

for (i = 0; i

fn = local_folders[i] パス名;

if (path.existsSync(fn) && fs.statSync(fn).isFile()) {

fs.readFile(fn, function (err, data) {
Response.writeHead(200);
Response.write(data);
Response.end();
});

戻る;

}


}

response.writeHead(302, {

"場所":base_url パス名

});
応答.end();
}

http.createServer(

関数 (リクエスト、レスポンス) {


var req_url = request.url,

パス名;


// http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css に似たリクエストを処理します

パス名 = req_url.indexOf("??") == -1 ? url.parse(request.url).パス名 : req_url;

console.log("「パス名」のリクエストを受信しました。");
loadFile(パス名, 応答);

}).listen(80);


上記の local_folders 変数とbase_url 変数の値を必要な値に変更することに注意してください。たとえば、このファイルを local-cdn-proxy.js として保存し、コマンド ラインで「node local-cdn-proxy.js」を実行します。もちろん、ローカル サーバーが実行されることを忘れないでください。ホスト。


http 経由でパスにアクセスすると、上記のスクリプトはまず対応するローカル ディレクトリを検索し、見つからない場合は対応するオンライン ディレクトリに直接ジャンプします。住所。見つからない場合の別の解決策は、ローカル サーバーにオンラインから対応するコンテンツをダウンロードさせて返すことですが、この要件の場合は 302 ジャンプで十分です。

nodejs バージョンに加えて、Python バージョンも作成しました:

コードをコピー コードは次のとおりです:

# -*- コーディング: utf-8 -*-
#
# 作者: oldj
#

OS をインポート
BaseHTTPServer をインポート

LOCAL_FOLDERS = [
    "D:/work/assets"
]
BASE_URL = "http://10.232.133.214"

クラス WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

def do_GET(self):
        print "「%s」のリクエストを受け取りました。" % self.path
        LOCAL_FOLDERS 内のフォルダー:
            fn = os.path.join(folder, self.path.replace("/", os.sep)[1:])
            if os.path.isfile(fn):
                self.send_response(200)
                self.wfile.write(open(fn, "rb").read())
                休憩

その他:
            self.send_response(302)
            self.send_header("場所", "%s%s" % (BASE_URL, self.path))

server = BaseHTTPServer.HTTPServer(("0.0.0.0", 80), WebRequestHandler)
server.serve_forever()


ご覧のとおり、Python バージョンのバージョンは、nodejs バージョンよりも正確に向上しています。

上の 2 段階コードの機能は、出力コンテンツのない場合の MIME タイプ、コンテンツ長などの情報に比べて、起こり得るブロック操作 (文書の長時間取得など) に対しても特別な処理を行っていません。実際に公開されている環境では、これらはすでに動作可能なバージョンですが、さらに多くの要求を満たすために、この 2 つのスクリプトを継続して拡張することもできます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。