Verwenden von Nginx zum Umschreiben von URLs in ausgehenden Antworten


8

Wir haben einen Kunden mit einer Site, die auf Apache läuft. In letzter Zeit hat die Site eine erhöhte Auslastung erfahren, und als Zwischenstopp möchten wir den gesamten statischen Inhalt der Site auf Cookieless-Domains verschieben, z http://static.thedomain.com.

Die Anwendung ist nicht gut verstanden. Um den Entwicklern Zeit zu geben, den Code so zu ändern, dass ihre Links auf den statischen Inhaltsserver verweisen ( http://static.thedomain.com), habe ich darüber nachgedacht, die Site über nginx zu proxen und die ausgehenden Antworten so umzuschreiben, dass Links wie folgt /images/...umgeschrieben werden http://static.thedomain.com/images/....

So gibt es beispielsweise in der Antwort von Apache auf nginx einen Blob aus Headern + HTML. In dem von Apache zurückgegebenen HTML haben wir <img>Tags, die wie folgt aussehen:

<img src="/images/someimage.png" />

Ich möchte dies umwandeln in:

<img src="http://static.thedomain.com/images/someimage.png" />

Damit fordert der Browser beim Empfang der HTML-Seite die Bilder direkt vom statischen Inhaltsserver an.

Ist dies mit Nginx (oder HAProxy) möglich?

Ich habe einen flüchtigen Blick durch die Dokumente geworfen, aber nichts ist mir aufgefallen, außer eingehende URLs neu zu schreiben.

Antworten:


5

Es gibt ein http://wiki.nginx.org/HttpSubModule - "Dieses Modul kann Text in der Nginx-Antwort suchen und ersetzen."

Vergangenheit aus Dokumenten kopieren:

Syntax:

sub_filter string replacement

Beispiel:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}

Gibt es so etwas für Haproxy?
Bradvido

@bradvido Ich habe eine solche Funktion in Haproxy nicht gefunden.
Oleg Neumyvakin

3

Verwenden Sie am besten die Proxy-Funktion und rufen Sie den Inhalt von der entsprechenden Stelle ab, anstatt URLs neu zu schreiben und Weiterleitungen an den Browser zurückzusenden.

Ein gutes Beispiel für das Proxying von Inhalten sieht folgendermaßen aus:

#
#  This configuration file handles our main site - it attempts to
# serve content directly when it is static, and otherwise pass to
# an instance of Apache running upon 127.0.0.1:8080.
#
server {
    listen :80;

    server_name  www.debian-administration.org debian-administration.org;
        access_log  /var/log/nginx/d-a.proxied.log;

        #
        # Serve directly:  /images/ + /css/ + /js/
        #
    location ^~ /(images|css|js) {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }

    #
    # Serve directly: *.js, *.css, *.rdf,, *.xml, *.ico, & etc
    #
    location ~* \.(js|css|rdf|xml|ico|txt|gif|jpg|png|jpeg)$ {
        root   /home/www/www.debian-administration.org/htdocs/;
        access_log  /var/log/nginx/d-a.direct.log ;
    }


        #
        # Proxy all remaining content to Apache
        #
        location / {

            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     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;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }
}

In dieser Konfiguration leitet static.domain.comnginx die Datei nicht über den entsprechenden lokalen Pfad ab , anstatt Anforderungen an den Browser umzuleiten und zu erwarten, dass der Browser eine weitere Anforderung stellt. Wenn die Anforderung dynamisch ist, wird der Proxy aktiviert und ruft die Antwort von einem Apache-Server (lokal oder remote) ab, ohne dass der Endbenutzer dies jemals weiß.

Ich hoffe das hilft


Vielen Dank für die Zeit, die Sie für die Beantwortung dieser Frage aufgewendet haben. Ich werde einen Prüfstand einrichten und sehen, wie das funktioniert. Das Wichtigste dabei ist, den gesamten statischen Inhalt vom Apache-Server zu entfernen. Ich denke also, ich könnte nginx auf dem CDN-Server ausführen und proxy_passauf den Apache-Server eingestellt haben, z proxy_pass http://172.16.3.1:80. Das heißt, wir verschieben die öffentliche IP-Adresse der Site auf den Nginx / CDN-Server.
Kev

Ja das ist richtig. Und keine Probleme - ich bin gerade auch knietief in Nginx und liebe es.
Tak

Ich habe deine Antwort nicht vergessen :) Ich hatte noch keine Gelegenheit, dies zu versuchen.
Kev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.