Apache przekierowuje na inny port

151

Od jakiegoś czasu zmagam się z tym i zdecydowanie robię coś złego.

Mam serwer Apache i serwer JBoss na tej samej maszynie. Chciałbym przekierować ruch dla mydomain.com do JBoss localhost: 8080 / example. DNS jest obecnie skonfigurowany dla mydomain.com i po wejściu do przeglądarki przejdzie bezpośrednio do portu 80.

Moje pytanie brzmi: jak przekierować do innego portu, gdy pewna nazwa domeny trafia do Apache (w tym przypadku „mojadomena.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> 

ZAKTUALIZOWANO z sugestiami - nadal nie przekazuje do portu 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
źródło
Wygląda całkiem nieźle. Jakie są Twoje objawy?
Martin Vilcans
Symptomy są takie, że umieszczam www.mydomain.com w przeglądarce, ale i to przechodzi do katalogu głównego apache. Zamiast tego chciałbym, aby przekierowywał do podkatalogu jboss localhost: 8080 / subdir. Obecnie pracuję nad przekierowywaniem różnych domen bezpośrednio na port 80, ale nie mogę go całkiem zmusić do przejścia do innego portu.
agentcurry
Mam dokładnie tę samą prośbę: czy znalazłeś rozwiązanie?
Cystack
1
@Cystack - nie mogłem zmusić go do pracy. Wypróbowałem tak wiele wariantów konfiguracji, że doprowadziło mnie to do szału. Zrezygnowałem z tego = / Jeśli znajdziesz rozwiązanie, napisz to tutaj, chciałbym wiedzieć, jak to działa. powodzenia przyjacielu!
agentcurry
To zadziałało dla mnie: serverfault.com/a/195831/111707
jjrv

Odpowiedzi:

224

Powinieneś opuścić domenę http://example.comw ProxyPass i ProxyPassReverse i pozostawić ją jako /. Dodatkowo musisz zostawić /na końcu miejsce, w example/którym następuje przekierowanie. Miałem też pewne problemy z http://example.comkontra http://www.example.com- tylko www działało, dopóki nie utworzyłem nazwy serwera www.example.com i ServerAlias ​​example.com. Spróbuj następujących.

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

Po wprowadzeniu tych zmian dodaj potrzebne moduły i zrestartuj apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
2AMTech
źródło
9
umożliwiają moduły apache przed ponownym uruchomieniem apache - digitalocean.com/community/tutorials/...
Pradyut Bhattacharya
1
Czy to będzie to samo dla serwera CentOS? (Nie rozumiem, dlaczego nie, po prostu się upewniam). Jaki byłby to plik konfiguracyjny? (gdzieś w / etc / httpd / conf zgaduję ...)
Jeremy
1
Zadziałało, ale zauważyłem, że na stronie powitalnej mojej aplikacji plik css nie został załadowany (co wcześniej działało na example.com:8080/example). a także kilka wyjątków. jakiś pomysł, czego mi brakuje?
Rajarshee Mitra
1
spowodowało to błąd „Usługa niedostępna” na moim httpd, dopóki tego nie zrobiłem/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras
@vladkras Wielkie dzięki za tę wskazówkę, bardzo pomocna!
mneute
28

Rozwiązałem ten problem za pomocą następującego kodu:

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>

Użyłem również:

a2enmod proxy_http
Renan Vizza
źródło
10

Chciałem zrobić dokładnie to, aby uzyskać dostęp do Jenkinsa z domeny głównej.

Okazało się, że muszę wyłączyć domyślną witrynę, aby to zadziałało. Oto dokładnie to, co zrobiłem.

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

I wstaw to do pliku:

<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>

Następnie musisz włączyć / wyłączyć odpowiednie strony:

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

Mam nadzieję, że to komuś pomoże.

Louth
źródło
Dziękujemy za udostępnienie @Louth. Dawno temu zrezygnowałem i nie mam już serwera. Wciąż przeszkadza mi, że nigdy nie działało, mogę uruchomić nowy serwer tylko po to, aby ponownie przetestować. Jeszcze raz dziękuję, na pewno zaktualizuję, jeśli spróbuję ponownie.
agentcurry
Wiki Jenkinsa wyjaśnia, jak uruchomić Jenkins za Apache: wiki.jenkins-ci.org/display/JENKINS/ ...
mneute
6

Odkryłem to metodą prób i błędów. Jeśli twoja konfiguracja określa ServerName, twoja dyrektywa VirtualHost będzie musiała zrobić to samo. W poniższym przykładzie awesome.example.com i amazing.example.com byłyby przekierowane do jakiejś lokalnej usługi działającej na porcie 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>

Wiem, że to nie odpowiada dokładnie na pytanie, ale umieszczam je tutaj, ponieważ jest to najlepszy wynik wyszukiwania dla przekierowania portów Apache. Więc myślę, że kiedyś komuś to pomoże.

Ethan B Martin
źródło
To jedyny, który działał dla mnie. Użycie *:80zamiast example.com:80oznaczało, że port nie zostanie przekierowany.
Seb123,
4

Musisz upewnić się, że proxy jest włączone na serwerze. Możesz to zrobić za pomocą następujących poleceń:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart
Aswin Mohanan
źródło
3

To może być stare pytanie, ale oto co zrobiłem:

W pliku .conf załadowanym przez Apache:

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

Objaśnienie: Nasłuchuj wszystkich żądań kierowanych do portu 80 komputera lokalnego. Jeśli zażądałem „ http://something.com/somethingorother”, przekaż to żądanie do „http://localhost:8080/somethingorother ”. Powinno to zadziałać dla zewnętrznego gościa, ponieważ zgodnie z dokumentacją mapuje zdalne żądanie do przestrzeni serwera lokalnego.

Używam Apache 2.4.6-2ubuntu2.2, więc nie jestem pewien, jak „-2ubuntu2.2” wpływa na szersze zastosowanie tej odpowiedzi.

Po wprowadzeniu tych zmian dodaj potrzebne moduły i zrestartuj apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej
źródło
2

Jeśli nie musisz używać proxy do JBoss, a mydomain.com:8080 możesz „ujawnić” światu, zrobię to.

<VirtualHost *:80>
  ServerName mydomain.com
  Redirect 301 / http://mydomain.com:8080/
</VirtualHost>
Michael Rice
źródło
Korzystanie z portu innego niż 80 nie tylko wygląda brzydko, ale może również powodować problemy z serwerami proxy lub dostawcami usług internetowych. W takim przypadku po prostu usuń Apache i zamiast tego uruchom JBoss na porcie 80!
Martin Vilcans,
Uruchamianie wszystkiego pod JBoss jest opcją, po prostu starałem się uniknąć przenoszenia stron apache do JBoss, ale nie powinno to być zbyt czasochłonne. Dziękujemy za opinię.
agentcurry
1

Mój apache nasłuchuje na 2 różnych portach,

Listen 8080
Listen 80  

Używam 80, gdy chcę przezroczystego adresu URL i nie umieszczam portu po adresie URL przydatnym dla usług Google, które nie zezwalają na lokalny adres URL?

Ale używam 8080 do wewnętrznego programowania, gdzie używam portu jako odniesienia dla „środowiska programistycznego”

Miguel
źródło
0

Apache obsługuje wirtualne hosty oparte na nazwach i IP. Wygląda na to, że używasz obu, co prawdopodobnie nie jest tym, czego potrzebujesz.

Myślę, że tak naprawdę próbujesz skonfigurować hosting wirtualny oparty na nazwach i do tego nie musisz określać adresu IP.

Wypróbuj <VirtualHost *: 80>, aby powiązać wszystkie adresy IP, chyba że naprawdę chcesz wirtualnego hostingu opartego na IP . Może tak być w przypadku, gdy serwer ma kilka adresów IP, a chcesz obsługiwać różne witryny pod różnymi adresami. Najczęstszą konfiguracją są (jak sądzę) wirtualne hosty oparte na nazwach.

Martin Vilcans
źródło
To ma sens, potrzebuję tylko nazwy. Zmieniłem to, ale nadal nie jest to routing do innego portu
agentcurry
0

Potrzebujesz 2 rzeczy:

  1. Dodaj ServerAlias www.mydomain.comdo swojej konfiguracji
  2. zmień proxypass na ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, aby prawdopodobnie nie przeszkadzały mod_dir i końcowe ukośniki.
Jon Lin
źródło
Dodałem ServerAlias, ale nadal bez powodzenia.
agentcurry
0

Wszystkie zapewniają doskonały wgląd w dostęp do portów za pośrednictwem nazw domen na serwerach wirtualnych. Nie zapomnij jednak o włączeniu serwerów wirtualnych; można to skomentować:

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

Uruchamiamy WSGI z serwerem Apache w domenie sxxxx.com i serwerem golang działającym na porcie 6800. Niektóre zapory wydają się blokować nazwy domen z portami. To było nasze rozwiązanie:

<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
źródło
0

Działa to również w ISPConfig. Na liście serwisów WWW wejdź do domeny, kliknij zakładkę Opcje, dodaj następujące linie:;

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

Następnie wejdź na stronę i wolaa :) To też działa protokół HTTPS.

kodmanyagha
źródło
0

Spróbuj tego-

<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> 
Ankit Kumar Rajpoot
źródło