Apache перенаправить на другой порт

151

Я боролся с этим в течение некоторого времени и определенно делаю что-то не так.

У меня есть сервер Apache и сервер JBoss на одной машине. Я хотел бы перенаправить трафик для mydomain.com на JBoss localhost: 8080 / пример. DNS в настоящее время настроен для mydomain.com, и он будет идти прямо к порту 80 при входе в браузер.

У меня вопрос, как мне перенаправить на другой порт, когда определенное доменное имя приходит в Apache (в данном случае, "mydomain.com")?

<VirtualHost ip.addr.is.here> 
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName mydomain.com
  ProxyPass http://mydomain.com http://localhost:8080/example
  ProxyPassReverse http://mydomain.com http://localhost:8080/example
</VirtualHost> 

ОБНОВЛЕНО w / Предложения - Все еще не переадресация на порт 8080

<VirtualHost *:80> 
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName mydomain.com
  ServerAlias www.mydomain.com
  ProxyPass http://mydomain.com http://localhost:8080/example
  ProxyPassReverse http://mydomain.com http://localhost:8080/example
</VirtualHost> 
agentcurry
источник
Это выглядит довольно хорошо. Какие у Вас симптомы?
Мартин Вилканс
Симптомы в том, что я помещаю www.mydomain.com в браузер, но он идет в корневой каталог Apache. Вместо этого я бы хотел, чтобы он перенаправлял в подкаталог jboss localhost: 8080 / subdir. В настоящее время он работает для перенаправления различных доменов прямо на порт 80, но не могу заставить его перейти на другой порт.
agentcurry
У меня точно такая же просьба: вы нашли решение?
Cystack
1
@Cystack - я не мог заставить его работать. Я пробовал так много вариантов конфигурации, что сводил меня с ума. Я отказался от этого = / Если вы нашли решение, пожалуйста, опубликуйте его здесь, я хотел бы знать, как заставить это работать. удачи мой друг!
agentcurry
Это сработало для меня: serverfault.com/a/195831/111707
JJRV

Ответы:

224

Вы должны оставить домен http://example.comв ProxyPass и ProxyPassReverse и оставить его как /. Кроме того, вам нужно оставить /в конце, example/куда он перенаправляет. Кроме того, у меня были некоторые проблемы с « http://example.comпротив» http://www.example.com- только www работал, пока я не сделал ServerName www.example.com и ServerAlias ​​example.com. Дайте следующий ход.

<VirtualHost *:80> 
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName www.example.com
  ServerAlias example.com
  ProxyPass / http://localhost:8080/example/
  ProxyPassReverse / http://localhost:8080/example/
</VirtualHost> 

После внесения этих изменений добавьте необходимые модули и перезапустите apache.

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
2AMTech
источник
9
включить модули Apache перед перезапуском апач - digitalocean.com/community/tutorials/...
Pradyut Бхаттачария
1
Будет ли это то же самое для сервера CentOS? (Я не понимаю, почему нет, просто убедившись). И какой файл конфигурации это будет? (где-то в / etc / httpd / conf я догадываюсь ...)
Джереми
1
Это сработало, но я увидел, что на странице приветствия моего приложения css не был загружен (что ранее работало на example.com:8080/example). а также получил некоторые исключения. Есть идеи, что мне не хватает?
Раджарши Митра
1
это вызвало ошибку «Служба недоступна» на моем httpd, пока я не сделал/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras
@vladkras Большое спасибо за этот совет, очень полезно!
mneute
28

Я решил эту проблему с помощью следующего кода:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName myhost.com
ServerAlias ww.myhost.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Я также использовал:

a2enmod proxy_http
Ренан Вицца
источник
10

Я хотел сделать именно это, чтобы получить доступ к Jenkins из корневого домена.

Я обнаружил, что должен был отключить сайт по умолчанию, чтобы заставить это работать. Вот именно то, что я сделал.

$ sudo vi /etc/apache2/sites-available/jenkins

И вставьте это в файл:

<VirtualHost *:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName mydomain.com
  ServerAlias mydomain
  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
  <Proxy *>
        Order deny,allow
        Allow from all
  </Proxy>
</VirtualHost>

Далее нужно включить / отключить соответствующие сайты:

$ sudo a2ensite jenkins
$ sudo a2dissite default
$ sudo service apache2 reload

Надеюсь, это кому-нибудь поможет.

Лаут
источник
Спасибо за помощь @Louth. Я давно отказался от этого и больше не имею сервера. Меня все еще беспокоит, что у меня так и не получилось, я могу запустить новый сервер, чтобы еще раз протестировать. Еще раз спасибо, я обязательно обновлюсь, если / когда я попробую это снова.
Agentcurry
Вики Дженкинс объясняет , как запустить Дженкинс за Apache: wiki.jenkins-ci.org/display/JENKINS/...
mneute
6

Выяснил это методом проб и ошибок. Если в вашей конфигурации указано ServerName, то ваша директива VirtualHost должна будет сделать то же самое. В следующем примере как awesome.example.com, так и amazing.example.com будут перенаправлены на некоторые локальные службы, работающие через порт 4567.

ServerName example.com:80

<VirtualHost example.com:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName awesome.example.com
  ServerAlias amazing.example.com
  ProxyPass / http://localhost:4567/
  ProxyPassReverse / http://localhost:4567/
</VirtualHost>

Я знаю, что это не совсем отвечает на вопрос, но я помещаю его здесь, потому что это лучший результат поиска для переадресации портов Apache. Так что я думаю, это когда-нибудь кому-нибудь поможет.

Этан Б Мартин
источник
Это единственный, который работал на меня. Использование *:80вместо example.com:80означало, что порт не будет перенаправлен.
Seb123 25.12.16
4

Вы должны убедиться, что прокси включен на сервере. Вы можете сделать это с помощью следующих команд:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart
Асвин Моханан
источник
3

Это может быть старый вопрос, но вот что я сделал:

В файле .conf, загруженном apache:

<VirtualHost *:80>
  ServerName something.com
  ProxyPass / http://localhost:8080/
</VirtualHost>

Объяснение: Прослушайте все запросы к порту 80 локальной машины. Если я запросил " http://something.com/somethingorother", перешлите этот запрос на " http://localhost:8080/somethingorother". Это должно работать для внешнего посетителя, потому что, согласно документам, он отображает удаленный запрос в пространство локального сервера.

Я использую Apache 2.4.6-2ubuntu2.2, поэтому я не уверен, как «-2ubuntu2.2» влияет на более широкую применимость этого ответа.

После внесения этих изменений добавьте необходимые модули и перезапустите apache.

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej
источник
2

Если вам не нужно использовать прокси для JBoss и mydomain.com:8080 может быть «выставлен» миру, то я бы сделал это.

<VirtualHost *:80>
  ServerName mydomain.com
  Redirect 301 / http://mydomain.com:8080/
</VirtualHost>
Майкл Райс
источник
Использование порта, отличного от 80, не только выглядит уродливо, но и может вызвать проблемы с прокси-серверами или интернет-провайдерами. В этом случае просто удалите Apache и запустите JBoss на порту 80!
Мартин Вилканс
Запуск всего под JBoss - вариант, я просто пытался избежать перемещения сайтов Apache на JBoss, но это не должно занимать слишком много времени. Спасибо за ответ.
agentcurry
1

Мой апач слушает 2 разных порта,

Listen 8080
Listen 80  

Я использую 80, когда хочу прозрачный URL-адрес и не помещаю порт после URL-адреса, полезного для сервисов Google, которые не разрешают локальный URL-адрес?

Но я использую 8080 для внутренней разработки, где я использую порт в качестве эталона для "среды разработки"

Miguel
источник
0

Apache поддерживает виртуальные хосты на основе имен и IP. Похоже, вы используете оба, что, вероятно, не то, что вам нужно.

Я думаю, что вы на самом деле пытаетесь настроить виртуальный хостинг на основе имен , и для этого вам не нужно указывать IP-адрес.

Попробуйте <VirtualHost *: 80> привязать все IP-адреса, если вы действительно не хотите виртуальный хостинг на основе IP . Это может быть в том случае, если сервер имеет несколько IP-адресов, и вы хотите обслуживать разные сайты по разным адресам. Самая распространенная установка - это (я бы предположил) виртуальные хосты на основе имени.

Мартин Вилканс
источник
Это имеет смысл, имя на основе это все, что мне нужно. Я изменил его, но он все еще не маршрутизируется на другой порт
agentcurry
0

Вам нужно 2 вещи:

  1. Добавить ServerAlias www.mydomain.comв свой конфиг
  2. измените ваш proxypass на ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, чтобы возможно предотвратить mod_dir и конечные слеши от вмешательства.
Джон Лин
источник
Я добавил ServerAlias, но все равно не повезло.
Agentcurry
0

Все это отличное понимание доступа к портам через доменные имена на виртуальных серверах. Не забудьте, однако, включить виртуальные серверы; это может быть закомментировано:

NameVirtualHost *:80
<Directory "/home/dawba/www/">
 allow from all
</Directory>

Мы запускаем WSGI с сервером Apache в домене sxxxx.com и сервером golang, работающим на порту 6800. Некоторые брандмауэры, кажется, блокируют доменные имена с портами. Это было наше решение:

<VirtualHost *:80>
 ProxyPreserveHost On
 ProxyRequests Off
 ServerName wsgi.sxxxx.com
 DocumentRoot "/home/dxxxx/www"
  <Directory "/home/dxxx/www">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
 ScriptAlias /py/ "/home/dxxxx/www/py/"
 WSGIScriptAlias /wsgiprog /home/dxxxx/www/wsgiprog/Form/Start.wsgi
</VirtualHost>

<VirtualHost *:80>
 ProxyPreserveHost On
 ProxyRequests Off
 ServerName sxxxx.com 
 ServerAlias www.sxxxx.com
 ProxyPass / http://localhost:6800/
 ProxyPassReverse / http://localhost:6800/
</VirtualHost>
user2099484
источник
0

Это работает и в ISPConfig. В списке сайтов попасть внутрь домена, перейти на вкладку «Параметры» и добавить следующие строки:;

ProxyPass / http://localhost:8181/
ProxyPassReverse / http://localhost:8181/

Затем зайдите на сайт и wolaa :) Это работает протокол HTTPS тоже.

kodmanyagha
источник
0

Попробуй это-

<VirtualHost *:80> 
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName www.adminbackend.example.com
  ServerAlias adminbackend.example.com
  ProxyPass / http://localhost:6000/
  ProxyPassReverse / http://localhost:6000/
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost> 
Анкит Кумар Раджпут
источник