Pelayan fail statik HTTP ringkas yang ditulis menggunakan nodejs dan Python_node.js

WBOY
Lepaskan: 2016-05-16 16:41:36
asal
2315 orang telah melayarinya

Dalam proses pembangunan harian, kami selalunya perlu mengubah suai beberapa fail statik (seperti JavaScript, CSS, fail HTML, dll.) yang diletakkan pada CDN Dalam proses ini, kami berharap mempunyai cara untuk memetakan CDN dalam talian direktori ke tempatan Direktori pada cakera keras, supaya apabila kami mengubah suai fail secara setempat, tidak perlu menerbitkannya, dan kesannya dapat dilihat serta-merta selepas menyegarkan.

Sebagai contoh, nama domain CDN kami ialah: http://a.mycdn.com, dan direktori tempatan yang sepadan ialah: D:workassets Kami berharap semua akses kepada http://a.mycdn.com/*. akan dipetakan Pergi ke D:workassets* setempat. Contohnya, apabila anda melawati http://a.mycdn.com/s/atp.js, anda sebenarnya membaca D:workassetssatp.js tempatan tanpa memuat turun fail dalam talian daripada Internet.

Sangat mudah untuk melaksanakan fungsi ini, perkara utama adalah seperti berikut:

1. Buka perkhidmatan HTTP secara setempat dan dengarkan port 80; 2. Ubah suai fail hos sistem, tambah "127.0.0.1 a.mycdn.com", dan ikat nama domain CDN ke alamat pelayan setempat; 3. Konfigurasikan perkhidmatan HTTP tempatan Selepas menerima permintaan GET, semak dahulu sama ada fail yang sepadan wujud pada cakera keras tempatan Jika ia wujud, kandungan fail tersebut akan dikembalikan akan dikembalikan.

Seperti yang anda lihat, bahagian penting ialah membina perkhidmatan HTTP tempatan. Terdapat banyak tutorial dalam kawasan ini, seperti memasang perisian pelayan seperti Apache atau Ngnix secara tempatan, dan kemudian mengkonfigurasi peraturan pemajuan yang sepadan. Walau bagaimanapun, saya secara peribadi merasakan bahawa kaedah ini masih agak rumit. Apa yang akan diperkenalkan oleh artikel ini adalah kaedah lain yang tidak memerlukan pemasangan perisian pelayan.

Oleh kerana kami sedang membangun dan menyahpepijat secara tempatan, keperluan untuk prestasi dan keselarasan adalah tidak tinggi, jadi kami sebenarnya tidak memerlukan perisian HTTP profesional seperti Apache/Ngnix, kami hanya memerlukan skrip yang boleh menyediakan perkhidmatan HTTP Itu sahaja. Sebagai contoh, gunakan nodejs untuk melaksanakannya.

/**
 * pengarang: oldj
 *
 **/

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

laluan = memerlukan("laluan"),
fs = memerlukan("fs"),
local_folders,
base_url;

local_folders = [ // Laluan setempat, ejen akan mencari fail dalam direktori dalam senarai ini, dan jika tidak ditemui, pergi ke alamat dalam talian

"D:/kerja/aset"

];
base_url = "http://10.232.133.214"; // Laluan dalam talian, jika fail tidak ditemui, ubah hala ke alamat ini

function loadFile(pathname, response) {

var i, l = local_folders.length,
fn;

console.log("cuba muatkan " nama laluan);

untuk (i = 0; i < l; i ) {

fn = local_folders[i] nama laluan;

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

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

kembali;

}


}

response.writeHead(302, {

"Lokasi":base_url nama laluan

});
response.end();
}

http.createServer(

fungsi (permintaan, respons) {


var req_url = request.url,

nama laluan;


// Memproses permintaan serupa dengan http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css

nama laluan = req_url.indexOf("??") == -1 ? url.parse(request.url).pathname : req_url;

console.log("Permintaan untuk '" nama laluan "' diterima.");
loadFile(nama laluan, respons);

}).dengar(80);


Beri perhatian untuk mengubah suai nilai local_folders dan base_url pembolehubah di atas kepada nilai yang anda perlukan. Simpan fail ini, sebagai contoh, sebagai local-cdn-proxy.js, dan kemudian jalankan "node local-cdn-proxy.js" pada baris arahan Pelayan tempatan akan berjalan tuan rumah.


Apabila mengakses laluan melalui http, skrip di atas akan terlebih dahulu mencari dalam direktori tempatan yang sepadan Jika ditemui, ia akan mengembalikan kandungan fail yang sepadan Jika ia tidak ditemui, ia akan terus 302 melompat ke dalam talian yang sepadan alamat. Untuk situasi di mana ia tidak dapat ditemui, penyelesaian lain ialah meminta pelayan tempatan memuat turun kandungan yang sepadan dari dalam talian dan mengembalikannya, tetapi untuk keperluan ini, lompatan 302 sudah memadai.

Sebagai tambahan kepada versi nodejs, saya juga menulis versi Python:

Salin kod Kod adalah seperti berikut:

# -*- pengekodan: utf-8 -*-
#
# pengarang: oldj
#

os import
import BaseHTTPServer

LOCAL_FOLDERS = [
    "D:/kerja/aset"
]
BASE_URL = "http://10.232.133.214"

kelas WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        cetak "Permintaan untuk '%s' diterima." % laluan diri
        untuk folder dalam LOCAL_FOLDERS:
            fn = os.path.join(folder, self.path.replace("/", os.sep)[1:])
            jika os.path.isfile(fn):
                diri.send_response(200)
                self.wfile.write(open(fn, "rb").read())
                putus

        lain:
            self.send_response(302)
            self.send_header("Lokasi", "%s%s" % (BASE_URL, self.path))

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


可以看到,Python 版本的代码比 nodejs 版本的精简了很多。

上面的两段代码的功能还相对比较简单,比如没有输出内容的 MIME-Type、Content-Length、Content-Length、Content-Length操作(如读取文件超时等)也没有做特别的处理。对于本地开发环境来说,它们已经是可以工作的版本了,你也可以继续扩展这这他多的需求。

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!