Utilisation de nginx pour réécrire les URL dans les réponses sortantes

8

Nous avons un client avec un site fonctionnant sur Apache. Récemment, le site a vu une charge accrue et comme un espace d'arrêt, nous voulons déplacer tout le contenu statique du site vers des domaines sans cookies, par exemple http://static.thedomain.com.

L'application n'est pas bien comprise. Donc, pour donner aux développeurs le temps de modifier le code pour pointer leurs liens vers le serveur de contenu statique ( http://static.thedomain.com), j'ai pensé à mandater le site via nginx et à réécrire les réponses sortantes de telle sorte que les liens vers /images/...soient réécrits comme http://static.thedomain.com/images/....

Ainsi, par exemple, dans la réponse d'Apache à nginx, il y a un blob Headers + HTML. Dans le code HTML renvoyé par Apache, nous avons des <img>balises qui ressemblent à:

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

Je veux transformer cela en:

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

De sorte que le navigateur lors de la réception de la page HTML demande alors les images directement au serveur de contenu statique.

Est-ce possible avec nginx (ou HAProxy)?

J'ai jeté un coup d'œil rapide dans les documents, mais rien ne m'a sauté dessus, sauf la réécriture des URL entrantes.

Kev
la source

Réponses:

5

Il y a http://wiki.nginx.org/HttpSubModule - "Ce module peut rechercher et remplacer du texte dans la réponse nginx."

copier le passé des documents:

Syntaxe:

sub_filter string replacement

Exemple:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}
Oleg Neumyvakin
la source
Y a-t-il quelque chose comme ça pour l'haproxy?
bradvido
@bradvido Je n'ai pas trouvé une telle fonctionnalité dans haproxy.
Oleg Neumyvakin
3

Il est préférable d'utiliser la fonction proxy et de récupérer le contenu à l'endroit approprié, au lieu de réécrire des URL et de renvoyer des redirections vers le navigateur.

Un bon exemple de proxy de contenu ressemble à ceci :

#
#  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;
        }
}

Dans cette configuration, au lieu de rediriger les demandes vers static.domain.comle navigateur et de s'attendre à ce que le navigateur fasse une autre demande, nginx sert simplement le fichier à partir du chemin local approprié. Si la demande est dynamique, le proxy entre en jeu et récupère la réponse d'un serveur Apache (local ou distant) sans que l'utilisateur final ne le sache.

J'espère que ça aide

Tak
la source
Merci pour le temps passé à y répondre. Je vais mettre en place un banc d'essai et voir comment cela fonctionne. L'important ici est de retirer tout le contenu statique du serveur Apache. Je suppose donc que je pourrais exécuter nginx sur le serveur CDN et avoir proxy_passdéfini le serveur Apache, par exemple proxy_pass http://172.16.3.1:80? c'est-à-dire que nous déplaçons l'adresse IP publique du site vers le serveur nginx / CDN.
Kev
Oui c'est correct. Et pas de problème - je suis aussi profondément dans le genou en ce moment et j'adore ça.
Tak
Vous n'avez pas oublié votre réponse :) Vous n'avez pas encore eu l'occasion d'essayer cela.
Kev