У меня есть сервер производства, тестирования и разработки для сайта, который я поддерживаю. Все три сервера работают под управлением Apache 2.2.16 в Debian 6 GNU / Linux. Я установил новую версию сайта нашей компании на тестовом сервере, и моя команда определила, что она достаточно стабильна для перехода в производственную среду. Однако я хочу сделать этот переход максимально плавным. Я хотел бы иметь возможность перенаправлять запросы на производственный сервер, чтобы они обрабатывались тестовым сервером. Таким образом, я могу протестировать эту новую реализацию, не внося никаких сложных изменений конфигурации на производственном сервере.
В идеале я могу использовать Apache mod_proxy
модуль для настройки обратного прокси-сервера, чтобы я мог обслуживать страницы непосредственно с тестового сервера для рабочих клиентов. Я прочитал документацию на http://httpd.apache.org/docs/2.0/mod/mod_proxy.html, который мне очень помог. Я включил mod_proxy
и mod_proxy_http
, то я установил на своем сервере разработки следующие правила.
<VirtualHost *:80>
ServerName dev.example.com
# ... other <VirtualHost>-specific settings ...
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://test.example.com/
ProxyPassReverse / http://test.example.com
# ... various <Directory> directives ...
</VirtualHost>
Это сработало очень хорошо. Когда я обратился к серверу разработки, сайт обслуживал все страницы непосредственно с тестового сервера, и казалось, что эти ответы пришли непосредственно с сервера, к которому я подключился. Более того, эти запросы были довольно быстрыми, и я мог делать запросы GET и POST, как если бы я разговаривал напрямую с тестовым сервером.
К сожалению, это не соответствует всем моим потребностям. Поскольку тестовый сервер запускает Apache только с новой версией сайта, я не могу размещать веб-почту или каталоги пользователей с тестового сервера. Эти запросы должны обрабатываться производственным сервером.
Я хочу, чтобы мой рабочий сервер мог использовать обратный прокси для всех страниц. Кроме /webmail
и пользовательские каталоги (любой каталог, начинающийся с тильды). Теоретически это возможно с <ProxyMatch>
директива. Однако у меня нет достаточного количества регулярных выражений для этого. Существует ли единое правило, позволяющее исключить оба этих типа запросов из отправки на прокси-сервер?
Бонусные очки: Я ищу хорошее вводное руководство по PCRE, чтобы я мог написать свои собственные правила. Есть ли у кого-нибудь рекомендации для новичка в регулярных выражениях?
В директиве не может быть более одного регулярного выражения, но вы можете иметь регулярное выражение, реализующее сложную логику:
/http:\/\/test.example.com\/\/(?!webmail)/
Я бы порекомендовал книгу О'Рейли Освоение регулярных выражений но это не вводный текст.
В Интернете есть множество материалов, с которых можно начать. Есть базовый учебник здесь. Но я бы посоветовал обзавестись хорошей книгой по этой теме (но я не могу порекомендовать, исходя из личного опыта).