Использование nginx для перезаписи URL внутри исходящих ответов

8

У нас есть клиент с сайтом, работающим на Apache. В последнее время сайт испытывает повышенную нагрузку, и в качестве пробела мы хотим перенести весь статический контент сайта на домены без файлов cookie, например http://static.thedomain.com.

Приложение не очень хорошо понято. Поэтому, чтобы дать разработчикам время внести изменения в код, чтобы они указывали свои ссылки на статический сервер содержимого ( http://static.thedomain.com), я подумал о прокси-сайте через nginx и переписывании исходящих ответов, чтобы ссылки /images/...переписывались как http://static.thedomain.com/images/....

Так, например, в ответе Apache на nginx есть бланк Headers + HTML. В HTML, возвращаемом из Apache, у нас есть <img>теги, которые выглядят так:

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

Я хочу преобразовать это в:

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

Таким образом, браузер при получении HTML-страницы запрашивает изображения непосредственно с сервера статического контента.

Возможно ли это с помощью nginx (или HAProxy)?

У меня был беглый взгляд на документы, но ничего не выскочило на меня, кроме переписывания входящих URL-адресов.

Кев
источник

Ответы:

5

Существует http://wiki.nginx.org/HttpSubModule - «Этот модуль может искать и заменять текст в ответе nginx».

скопировать прошлое из документов:

Синтаксис:

sub_filter string replacement

Пример:

location / {
  sub_filter      </head>
  '</head><script language="javascript" src="$script"></script>';
  sub_filter_once on;
}
Олег Неумывакин
источник
Есть ли что-нибудь подобное для haproxy?
Брадвидо
@bradvido Я не нашел такой функции в haproxy.
Олег Неумывакин
3

Лучше всего использовать прокси-функцию и извлекать контент из соответствующего места, а не переписывать URL-адреса и отправлять перенаправления обратно в браузер.

Хороший пример прокси-контента выглядит так:

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

В этой конфигурации вместо того, чтобы перенаправлять запросы static.domain.comи ожидать, что браузер сделает другой запрос, nginx просто обслуживает файл с соответствующего локального пути. Если запрос является динамическим, то прокси подключается и получает ответ от сервера Apache (локального или удаленного), о котором конечный пользователь никогда не узнает.

Надеюсь, это поможет

Tak
источник
Спасибо за потраченное на это время. Я установлю испытательный стенд и посмотрю, как это работает. Здесь важно удалить весь статический контент с сервера Apache. Итак, я думаю, я мог бы запустить nginx на сервере CDN и proxy_passустановить на сервер Apache, например proxy_pass http://172.16.3.1:80? т.е. мы перемещаем публичный IP-адрес сайта на сервер nginx / CDN.
Кев
Да, это правильно. И никаких проблем - я тоже по колено в nginx и люблю его.
Так
Не забыли свой ответ :) Еще не было возможности попробовать это еще.
Кев