Node.js routing mit Apache-proxy

Bin ich mit Apache auf einem Linux-server und finde, dass meine node.js apps routing funktioniert nicht korrekt bei der Verwendung von URLS, die über Apache.

Ich folgte den Anweisungen, die auf andere Beiträge für das einschalten des proxy-Module in apache und richten Sie dann diese definition:

ProxyPass /testauth http://localhost:3000/

(Ich hatte auch einen line in dort zu definieren, die ein ähnliches reverse-proxy, der nichts Tat)

Meine Knoten-app läuft auf port 3000 mit routing einrichten, wie in app.js

app.use('/', routes);
app.use('/tests', tests);
app.use('/questions', questions);

Wenn ich Zugang zu URLs auf meinem server so:

http://rose.cs.umass.edu:3000/
http://rose.cs.umass.edu:3000/questions/179

Bekomme ich die richtigen Ergebnisse (beachten Sie das styling mit einigen einfachen CSS)
Wenn ich versuche, auf thru apache so:

http://rose.cs.umass.edu/testauth/questions/179

Bekomme ich einen 404-Fehler sehen, sondern aus dem backtrace, dass es in meinem js-code.

Aus irgendeinem Grund die URL http://rose.cs.umass.edu/testauth teilweise funktioniert (aber CSS nicht angewendet (weil der index.ejs-Datei enthält die css wie dieses:

<link rel='stylesheet' href='/stylesheets/style.css' />

Den Speicherort der CSS-Dateien und die Kodierung der relativen Pfaden folgt den node.js Beispiele, die ich angesehen haben, und es funktioniert gut in meiner Entwicklungsumgebung. Aber beim ausführen der app, indem Sie gehen durch Apache, Dinge, die nicht richtig arbeitet.
Gibt es ein Update der apache-config? Muss ich eine Anpassung vornehmen, um, wie code-Pfade in der my javascript und ejs Dateien?

  • Sicherlich http://localhost/:3000/ sollte stattdessen http://localhost:3000/? Auch auf eine semi-bezogene Hinweis, Sie können es besser mit einer anderen software anstelle von Apache wenn Sie wirklich wollen, etwas vor dem Knoten, da der Apache nicht Maßstab auch bei allen (mehr oder weniger negiert die Leistungsmerkmale von Knoten).
  • Richtig. Habe ich Fix die post. Die Leistung ist nicht wirklich ein Problem hier. Die Knoten-app ist eine quick-and-dirty “ one-off
  • Wenn /questions und /stylesheets eingesetzt-mit http://localhost:3000 dann sollten Sie nur müssen die folgenden Apache-config Zugriff auf die Ressourcen über die testauth Umfeld (http://localhost:3000/testauth und http://localhost:3000/testauth/<resource>): ProxyPass /testauth/ localhost:3000/ ProxyPassReverse /testauth/ localhost:3000/ ProxyPass /testauth localhost:3000/ ProxyPassReverse /testauth localhost:3000/ – – Oh… und ich denke, Apache load-balancing funktioniert Super für die Skalierung.
InformationsquelleAutor dam | 2016-09-13



2 Replies
  1. 1

    Einer Ahnung hatte ich, was falsch war ist, dass Knoten war, den Druck der Pfade jedes mal, wenn eine Anfrage kam, und Sie sah aus wie

    GET //questions/404 4.278 ms - 916

    Also änderte ich den apache zu haben:

    ProxyPass /testauth http://localhost:3000   (removed trailing slash)

    Nun die Pfade kommen in meine app wurden korrekt gebildet.

    Der nächste Auftrag des Geschäfts ist, Sie zu überarbeiten alle relativen URLs in meinem EJS-templates, client-side javascript, und auch leitet der server-Seite.

    Weil ich musste „testauth“ in den Pfad so, dass der Apache kann nach vorne zu Knoten, die URLs kommen in der app sind von der form rose.cs.umass.edu/testauth/rest-of-url . Dies bedeutet, dass relative URLs in meinem app-code, der aussah wie

    <a href="/questions" ....>

    waren nun falsch, denn Sie haben absoluten URLs, die weggelassen testauth in den Weg. Einige dieser relative URLs sind jetzt ziemlich seltsam (mit Sachen wie ../oder auch ../.. man Dinge) . Ich wünschte, es gäbe eine variable, vergleichbar mit ${pageContext.Anfrage.contextPath}, dass ich die Verwendung in JSP-URLs bauen.

    • Ich stehe vor dem gleichen Problem. Hast du eine Möglichkeit finden, dies zu tun?
  2. 0

    Entschied ich mich zu imitieren, um die JSP – ${pageContext} Idee

    Ich Hinzugefügt, um eine Datei namens config.js das hat verschiedene Einstellungen, insbesondere, wo die Anwendung ausgeführt wird (Sachen wie db-Referenzen, etc). Ich fügte hinzu,

    //uncomment the line that applies
    config.pageContext = "" //dev environment
    //config.pageContext = "testauth" //production environment

    Meine routing-Skripts alle etwas zu tun:

    res.render('questions', {pageContext: util.pageContext(req), questions: questionArray});

    Und die EJS-templates haben Sachen wie diese, in der URLS:

    <script src="<%= pageContext %>/static/js/bootstrap.min.js"></script>

    Einer zweiten alternative, die ich verwendet für eine Weile, bis ich ging mit den oben genannten:

    Pass ein argument, um Ihren Knoten app, wenn Sie es starten. Sie dann eine Globale variable festzulegen, ähnlich wie oben und verwenden Sie es ebenso. Wenn Sie ein process-manager (ich benutze pm2) zum ausführen von Knoten-app auf Ihrem server, den Sie vielleicht haben, etwas zu tun:

    pm2 start testauth -- -c /testauth  // start testauth.bin using /testauth for the page context

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.