Heim  >  Artikel  >  Web-Frontend  >  Ein einfacher statischer HTTP-Dateiserver, der mit nodejs und Python_node.js geschrieben wurde

Ein einfacher statischer HTTP-Dateiserver, der mit nodejs und Python_node.js geschrieben wurde

WBOY
WBOYOriginal
2016-05-16 16:41:362316Durchsuche

Im täglichen Entwicklungsprozess müssen wir häufig einige im CDN platzierte statische Dateien (wie JavaScript, CSS, HTML-Dateien usw.) ändern. In diesem Prozess hoffen wir, eine Möglichkeit zu haben, das Online-CDN abzubilden Verzeichnis in lokal Ein Verzeichnis auf der Festplatte, sodass wir eine Datei nicht veröffentlichen müssen, wenn wir sie lokal ändern, und der Effekt sofort nach der Aktualisierung sichtbar ist.

Unser CDN-Domänenname lautet beispielsweise: http://a.mycdn.com und das entsprechende lokale Verzeichnis lautet: D:workassets. Wir hoffen, dass alle auf http://a.mycdn.com/* zugreifen können. wird zugeordnet. Gehen Sie zu den lokalen D:workassets*. Wenn Sie beispielsweise http://a.mycdn.com/s/atp.js besuchen, lesen Sie tatsächlich die lokale Datei D:workassetssatp.js, ohne Online-Dateien aus dem Internet herunterzuladen.

Die Implementierung dieser Funktion ist sehr einfach. Die wichtigsten Punkte sind wie folgt:

1. Öffnen Sie lokal einen HTTP-Dienst und überwachen Sie Port 80; 2. Ändern Sie die Systemhosts-Datei, fügen Sie „127.0.0.1 a.mycdn.com“ hinzu und binden Sie den CDN-Domänennamen an die lokale Serveradresse 3. Konfigurieren Sie den lokalen HTTP-Dienst. Überprüfen Sie zunächst, ob die entsprechende Datei auf der lokalen Festplatte vorhanden ist. Wenn sie nicht vorhanden ist, wird der entsprechende Inhalt zurückgegeben wird zurückgegeben.

Wie Sie sehen, besteht der Schlüssel zum Aufbau eines lokalen HTTP-Dienstes. In diesem Bereich gibt es viele Tutorials, wie zum Beispiel die lokale Installation von Serversoftware wie Apache oder Ngnix und die anschließende Konfiguration entsprechender Weiterleitungsregeln. Ich persönlich bin jedoch der Meinung, dass diese Methode immer noch etwas kompliziert ist. In diesem Artikel wird eine weitere Methode vorgestellt, die keine Installation von Serversoftware erfordert.

Da wir lokal entwickeln und debuggen, sind die Anforderungen an Leistung und Parallelität nicht hoch, sodass wir eigentlich keine professionelle HTTP-Software wie Apache/Ngnix benötigen, sondern nur ein Skript, das HTTP-Dienste bereitstellen kann. Das war’s. Verwenden Sie beispielsweise nodejs, um es zu implementieren.

/**
 * Autor: oldj
 *
 **/

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

path = require("path"),
fs = require("fs"),
local_folders,
base_url;

local_folders = [ // Lokaler Pfad, der Agent sucht in den Verzeichnissen in dieser Liste nach Dateien, und wenn er nicht gefunden wird, geht er zur Online-Adresse

„D:/work/assets“

];
base_url = "http://10.232.133.214"; // Online-Pfad, wenn die Datei nicht gefunden werden kann, auf diese Adresse umleiten

Funktion LoadFile(Pfadname, Antwort) {

var i, l = local_folders.length,
fn;

console.log("versuchen zu laden" Pfadname);

für (i = 0; i < l; i ) {

fn = local_folders[i] Pfadname;

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

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

zurück;

}


}

Response.writeHead(302, {

„Standort“:base_url-Pfadname

});
Response.end();
}

http.createServer(

Funktion (Anfrage, Antwort) {


var req_url = request.url,

Pfadname;


// Anfragen ähnlich wie http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css

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

console.log("Anfrage für '" Pfadname "' empfangen.");
LoadFile(Pfadname, Antwort);

}).listen(80);


Achten Sie darauf, die Werte der Variablen local_folders und base_url oben auf die von Ihnen benötigten Werte zu ändern. Speichern Sie diese Datei beispielsweise als local-cdn-proxy.js und führen Sie dann „node local-cdn-proxy.js“ in der Befehlszeile aus. Vergessen Sie natürlich nicht, die Bindung auszuführen Gastgeber.


Wenn Sie über http auf einen Pfad zugreifen, sucht das obige Skript zunächst im entsprechenden lokalen Verzeichnis. Wenn es gefunden wird, wird der Inhalt der entsprechenden Datei zurückgegeben. Wenn es nicht gefunden wird, springt es direkt zum entsprechenden Online-Verzeichnis Adresse. Für Situationen, in denen er nicht gefunden werden kann, besteht eine andere Lösung darin, den lokalen Server den entsprechenden Inhalt online herunterladen und zurückgeben zu lassen. Für diese Anforderung reicht jedoch ein 302-Sprung aus.

Zusätzlich zur NodeJS-Version habe ich auch eine Python-Version geschrieben:

Code kopieren Der Code lautet wie folgt:

# -*- Codierung: utf-8 -*-
#
# Autor: oldj
#

Betriebssystem importieren
BaseHTTPServer importieren

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

Klasse WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        print „Anfrage für ‚%s‘ erhalten.“ % self.path
        für Ordner in LOCAL_FOLDERS:
            fn = os.path.join(folder, self.path.replace("/", os.sep)[1:])
            wenn os.path.isfile(fn):
                self.send_response(200)
                self.wfile.write(open(fn, "rb").read())
                Pause

        sonst:
            self.send_response(302)
            self.send_header("Location", "%s%s" % (BASE_URL, self.path))

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


可以看到,Python verwendet die Nodejs-Software, um die Funktionalität zu verbessern.

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn