Usando o nginx para reescrever URLs nas respostas de saída

8

Temos um cliente com um site em execução no Apache. Recentemente, o site tem recebido um aumento de carga e, como uma lacuna de interrupção, queremos mudar todo o conteúdo estático do site para domínios sem culinária, por exemplo http://static.thedomain.com.

A aplicação não está bem compreendida. Então, para dar aos desenvolvedores tempo para alterar o código e apontar seus links para o servidor de conteúdo estático ( http://static.thedomain.com), pensei em fazer o proxy do site através do nginx e reescrever as respostas de saída para que os links /images/...sejam reescritos como http://static.thedomain.com/images/....

Por exemplo, na resposta do Apache ao nginx, há um blob de Cabeçalhos + HTML. No HTML retornado do Apache, temos <img>tags parecidas com:

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

Eu quero transformar isso em:

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

Para que o navegador, ao receber a página HTML, solicite as imagens diretamente do servidor de conteúdo estático.

Isso é possível com nginx (ou HAProxy)?

Eu tive uma rápida olhada nos documentos, mas nada me ocorreu, exceto a reescrita de URLs de entrada.

Kev
fonte

Respostas:

5

Existe um http://wiki.nginx.org/HttpSubModule - "Este módulo pode pesquisar e substituir texto na resposta nginx".

copiar passado dos documentos:

Sintaxe:

sub_filter string replacement

Exemplo:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}
Oleg Neumyvakin
fonte
Existe algo assim para haproxy?
Bradvido
@bradvido Eu não encontrei esse recurso no haproxy.
Oleg Neumyvakin
3

É melhor usar o recurso de proxy e buscar o conteúdo no local apropriado, em vez de reescrever URLs e enviar redirecionamentos de volta ao navegador.

Um bom exemplo de proxy de conteúdo é semelhante a:

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

Nessa configuração, em vez de redirecionar solicitações static.domain.come esperar que o navegador faça outra solicitação, o nginx simplesmente serve o arquivo a partir do caminho local relevante. Se a solicitação for dinâmica, o proxy entra em ação e busca a resposta de um servidor Apache (local ou remoto) sem que o usuário final saiba.

Espero que ajude

Tak
fonte
Obrigado pelo tempo gasto em responder a isso. Vou montar uma plataforma de teste e ver como isso funciona. O importante aqui é mover todo o conteúdo estático do servidor Apache. Então, eu acho que poderia executar o nginx no servidor CDN e ter proxy_passdefinido o servidor Apache, por exemplo proxy_pass http://172.16.3.1:80? ou seja, movemos o endereço IP público do site para o servidor nginx / CDN.
Kev
Sim, está correto. E não há probs - estou com o joelho no nginx muito agora e adorando.
Tak
Não esqueci sua resposta :) Ainda não tive a chance de tentar isso ainda.
Kev