У меня есть webserver1 за маршрутизатором, который в настоящее время обслуживает весь http-трафик на mydomain.com. Я только что добавил webserver2 и хочу перенаправить трафик mydomain.com/server2 в этот ящик. Для пользователя перенаправление должно быть незамеченным (т.е. URL-адрес должен быть просто mydomain.com/server2, а перенаправление происходит за кулисами). Как мне настроить это в конфигурации apache для webserver1 (я предполагаю, что конфигурация webserver2 не требует ничего особенного)?
Я попробовал данный совет Вот, используя mod_rewrite, но, похоже, это не помогло:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/server2/
RewriteRule ^/$ http://192.168.1.102/ [P,L]
Если это актуально, на webserver1 размещено приложение django, использующее mod_wsgi, с несколькими другими приложениями, которые перенаправляются. Вот конфиг виртуального хоста:
<VirtualHost *:80>
ServerAdmin admin@mydomain.com
ServerName www.mydomain.com
ServerAlias 127.0.0.1
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/server2/
RewriteRule ^/$ http://192.168.1.102 [P,L]
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
<Directory /var/www/mydomain>
Order allow,deny
Allow from all
</Directory>
...
WSGIDaemonProcess mydomain user=user group=user threads=25
WSGIProcessGroup mydomain
WSGIScriptAlias / /home/user/mydomain/apache/django.wsgi
Alias /phpmyadmin /usr/share/phpmyadmin/
</VirtualHost>
Заранее спасибо.
Mod_Rewrite более гибкий, чем mod_proxy. Раскомментируйте для него строку загрузки.
Простое сравнение здесь http://www.wellho.net/mouth/1376_Choosing-between-mod-proxy-and-mod-rewrite.html
<VirtualHost *:80>
RewriteEngine on
# just in case (don't want to accidentally expose all the internal servers) !
ProxyRequests off
# define a log file
RewriteLog /var/log/apache/server2.rewrite.log
RewriteLogLevel 1
# add the tailing / if not there
RewriteRule ^/server2$ http://www.mydomain.com/server2/ [R] [L]
# proxy the request to internal url
RewriteRule ^/server2/(.*) http://192.168.1.102/$1 [P]
Обратите внимание, что в этом примере учитывается регистр.
Использование:
ProxyPass /server2 http://192.168.1.102/server2
Вам также может понадобиться ProxyPassReverse. См. Документацию Apache:
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass
Обратите внимание, что backend mod_wsgi ДОЛЖЕН монтировать приложение по тому же вспомогательному URL-адресу, что и на внешнем интерфейсе.
Также имейте в виду, что может потребоваться настройка на серверной части, чтобы поиграть, на каком хосте / порту, по-видимому, работает серверное приложение, поэтому реконструкция URL-адреса в серверной части работает правильно при использовании. Так что исследуйте это, если вы обнаружите, что это проблема.