Utilizzo di nginx per riscrivere gli URL all'interno delle risposte in uscita


8

Abbiamo un cliente con un sito in esecuzione su Apache. Recentemente il sito ha visto un aumento del carico e come stop gap vogliamo spostare tutto il contenuto statico sul sito su domini senza cucina, ad es http://static.thedomain.com.

L'applicazione non è ben compresa. Quindi, per dare agli sviluppatori il tempo di modificare il codice per indirizzare i loro collegamenti al server di contenuto statico ( http://static.thedomain.com), ho pensato di inviare un proxy al sito tramite nginx e riscrivere le risposte in uscita in modo tale che i collegamenti /images/...vengano riscritti come http://static.thedomain.com/images/....

Quindi, ad esempio, nella risposta di Apache a nginx c'è un blocco di intestazioni + HTML. Nel codice HTML restituito da Apache abbiamo <img>tag che assomigliano a:

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

Voglio trasformarlo in:

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

In modo che il browser alla ricezione della pagina HTML richieda quindi le immagini direttamente dal server di contenuti statici.

Questo è possibile con nginx (o HAProxy)?

Ho avuto una rapida occhiata attraverso i documenti, ma nulla mi è saltato fuori se non riscrivendo gli URL in entrata.

Risposte:


5

Esiste un http://wiki.nginx.org/HttpSubModule - "Questo modulo può cercare e sostituire il testo nella risposta nginx."

copia passato da documenti:

Sintassi:

sub_filter string replacement

Esempio:

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

Esiste qualcosa di simile per il haproxy?
Bradvido,

@bradvido Non ho trovato questa funzionalità in haproxy.
Oleg Neumyvakin,

3

È preferibile utilizzare la funzione proxy e recuperare il contenuto dalla posizione appropriata, anziché riscrivere gli URL e inviare i reindirizzamenti al browser.

Un buon esempio di contenuto proxy è il seguente:

#
#  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 questa configurazione, invece di reindirizzare le richieste static.domain.come aspettarsi che il browser faccia un'altra richiesta, nginx serve semplicemente il file dal relativo percorso locale. Se la richiesta è dinamica, il proxy si avvia e recupera la risposta da un server Apache (locale o remoto) senza che l'utente finale lo sappia.

Spero che aiuti


Grazie per il tempo dedicato a rispondere a questo. Installerò un banco di prova e vedrò come funziona. La cosa importante qui è spostare tutto il contenuto statico fuori dal server Apache. Quindi immagino di poter eseguire nginx sul server CDN e averlo proxy_passimpostato sul server Apache, ad esempio proxy_pass http://172.16.3.1:80? cioè spostiamo l'indirizzo IP pubblico del sito sul server nginx / CDN.
Kev

Sì, è corretto. E nessun problema: adesso mi sento troppo in ginocchio con nginx e lo adoro.
Prendi il

Non ho dimenticato la tua risposta :) Non ho ancora avuto modo di provarlo.
Kev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.