У нас есть клиент с сайтом, работающим на Apache. В последнее время на сайте наблюдается повышенная нагрузка, и мы хотим переместить весь статический контент на сайте в домены без файлов cookie, например http://static.thedomain.com
.
Приложение не совсем понятно. Таким образом, чтобы дать разработчикам время внести поправки в код, чтобы они указывали свои ссылки на сервер статического содержимого (http://static.thedomain.com
) Я подумал о проксировании сайта через nginx и переписывании исходящих ответов так, чтобы ссылки на /images/...
переписаны как http://static.thedomain.com/images/...
.
Так, например, в ответе Apache на nginx есть блоб заголовков + HTML. В HTML, возвращенном из Apache, мы имеем <img>
теги, которые выглядят так:
<img src="/images/someimage.png" />
Я хочу преобразовать это в:
<img src="http://static.thedomain.com/images/someimage.png" />
Таким образом, браузер после получения HTML-страницы запрашивает изображения непосредственно с сервера статического содержимого.
Возможно ли это с помощью nginx (или HAProxy)?
Я бегло просмотрел документы, но ничего не бросилось мне в глаза, кроме как переписать входящие URL-адреса.
Eсть 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;
}
Лучше всего использовать функцию прокси и получать контент из подходящего места, а не переписывать 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 (локального или удаленного) без ведома конечного пользователя.
Надеюсь, это поможет