Wie kann ich nginx und node.js auf einem Server ausführen?

Wie kann ich nginx und node.js auf einem Server ausführen?

Welche Art von Setup kann ich verwenden, um sowohl WordPress/PHP als auch Node.js auf demselben Server zu hosten? Ich habe einen VPS von Digitalocean, einen Ubuntu 12.04-Server.

Ich habe gelesen, dass manche Apache -> Nginx -> Varnish verwenden. Andererseits habe ich an manchen Stellen gelesen, dass man Varnish nicht braucht, wenn man Nginx hat.

Die Lösung, die ich jetzt habe, ist Varnish auf Port 80 mit 2 Backends, eines für Apache und eines für Node.js.

Funktioniert dies mit Nginx statt mit Apache hinter Varnish?

Antwort1

Ja, Ihr vorhandenes Setup (Varnish-Frontend mit Apache- und Node.js-Backends) funktioniert genauso, wenn Sie Apache durch Nginx ersetzen (d. h. Varnish kümmert sich nicht besonders um die Backends – Nginx und Apache werden gleich behandelt).

Node.js wird normalerweise mit Nginx ausgeführt, da es viel effizienter ist, statische Assets direkt über Nginx als über Node.js bereitzustellen. Für eine einfache Einrichtung können Sie Varnish vollständig eliminieren – Node.js wird auf Port 80 ausgeführt und leitet ausgewählte Anfragen per Proxy an einen Node.js-Upstream-Server weiter:

upstream nodejs  {
      server 127.0.0.1:3000;
      server 127.0.0.1:3000;
}

server {
        listen 80 default_server;
        server_name  www.example.com;
        error_log /var/log/nginx/www.example.com/error.log;
        access_log /var/log/nginx/www.example.com/access.log;
        root   /var/www/www.example.com/public;

        location / {
             try_files $uri @nodejs;
        }

        location @nodejs {
             proxy_pass  http://nodejs;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
             proxy_redirect off;
             proxy_buffering off;
             proxy_set_header        Host            $host;
             proxy_set_header        X-Real-IP       $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

Einer der (früheren) Gründe für die Verwendung von Varnish vor diesem Setup war, dass Nginx das Proxying von HTTP 1.1-Verbindungen nicht nativ unterstützte (was für den Upgrade-Header erforderlich war, der mit Websockets verwendet wurde) – dies ist kein Problem mehr, und aktuelle Versionen von Nginx können auch Websocket-Verbindungen proxyen. Abgesehen davon ist die Verwendung von Varnish zum Zwischenspeichern von Dateien ein überzeugender Grund, es als Front-End-Server beizubehalten (obwohl es erwähnenswert ist, dass der einzige echte Vorteil auftritt, wenn Sie Varnish zum Bereitstellen zwischengespeicherter Kopien dynamisch generierter Seiten verwenden). Wenn Sie beispielsweise Nginx auf Port 81 und Node.js auf Port 3000 abhören, haben Sie möglicherweise Folgendes in Ihrem Varnish VCL (das Pfade von example.com/nodejs mit Node.js und alles andere mit Nginx bereitstellt):

backend default {
  .host = "127.0.0.1";
  .port = "81";
}

backend nodejs{
  .host = "127.0.0.1";
  .port = "3000";
}

...

sub vcl_recv {
    set req.grace = 120s;
    ...
    if (req.http.Host ~ "^(www\.)?example.com") {
        if (req.url ~ "^/nodejs/") {
            set req.backend = nodejs;                       
        }
    }

    return (lookup);
}

verwandte Informationen