Apache reindirizza a un'altra porta


151

Ho lottato con questo per qualche tempo e sto sicuramente facendo qualcosa di sbagliato.

Ho un server Apache e un server JBoss sulla stessa macchina. Vorrei reindirizzare il traffico da mydomain.com a JBoss localhost: 8080 / esempio. Il DNS è attualmente configurato per mydomain.com e andrà direttamente alla porta 80 quando inserito nel browser.

La mia domanda è come reindirizzare a una porta diversa quando un certo nome di dominio arriva ad apache (in questo caso, "miodominio.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> 

AGGIORNATO w / Suggerimenti - Ancora non inoltro alla porta 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> 

Sembra abbastanza buono. Quali sono i tuoi sintomi?
Martin Vilcans,

I sintomi sono che ho inserito www.mydomain.com nel browser, ma va alla directory principale di apache. Invece, vorrei che reindirizzasse a una sottodirectory localhost jboss: 8080 / subdir. Attualmente lo sto lavorando per reindirizzare vari domini direttamente alla porta 80, ma non riesco abbastanza a farlo andare in un'altra porta.
agentcurry

Ho la stessa identica richiesta: hai trovato una soluzione?
Cystack,

1
@Cystack - Non sono riuscito a farlo funzionare. Ho provato così tante varianti alla configurazione che mi ha fatto impazzire. Ho rinunciato = = Se ti capita di trovare una soluzione, per favore pubblicala qui, vorrei sapere come farlo funzionare. buona fortuna amico mio!
agentcurry,

Questo ha funzionato per me: serverfault.com/a/195831/111707
jjrv

Risposte:


224

Dovresti lasciare il dominio http://example.comin ProxyPass e ProxyPassReverse e lasciarlo come /. Inoltre, è necessario lasciare /alla fine di example/dove sta reindirizzando. Inoltre, ho avuto qualche problema con http://example.comvs. http://www.example.com- solo il www ha funzionato fino a quando non ho creato ServerName www.example.com e ServerAlias ​​example.com. Prova quanto segue.

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

Dopo aver apportato queste modifiche, aggiungi i moduli necessari e riavvia apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart

9
abilitare i moduli apache prima di riavviare apache - digitalocean.com/community/tutorials/…
Pradyut Bhattacharya,

1
Sarebbe lo stesso per un server CentOS? (Non vedo perché no, solo assicurandomi). E quale file di configurazione sarebbe? (da qualche parte in / etc / httpd / conf sto indovinando ...)
Jeremy

1
Ha funzionato, ma ho visto che nella pagina di benvenuto della mia applicazione, il CSS non è stato caricato (che prima funzionava su example.com:8080/example). e ha anche ottenuto alcune eccezioni. qualche idea di cosa mi manchi?
Rajarshee Mitra,

1
questo ha causato un errore "Servizio non disponibile" sul mio httpd fino a quando non l'ho fatto/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras

@vladkras Grazie mille per questo suggerimento, molto utile!
mneute il

28

Ho risolto questo problema con il seguente codice:

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>

Ho anche usato:

a2enmod proxy_http

10

Volevo fare esattamente questo per poter accedere a Jenkins dal dominio principale.

Ho scoperto che ho dovuto disabilitare il sito predefinito per farlo funzionare. Ecco esattamente quello che ho fatto.

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

E inserisci questo nel file:

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

Successivamente è necessario abilitare / disabilitare i siti appropriati:

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

Spero che aiuti qualcuno.


Grazie per aver contribuito a @Louth. Ho da tempo rinunciato e non ho più il server. Mi preoccupa ancora il fatto che non l'ho mai fatto funzionare, potrei avviare un nuovo server solo per testarlo di nuovo. Grazie ancora, sarò sicuro di aggiornare se / quando provo di nuovo.
agentcurry

La wiki di Jenkins spiega come eseguire Jenkins dietro Apache: wiki.jenkins-ci.org/display/JENKINS/…
mneute,

6

L'ho scoperto per tentativi ed errori. Se la configurazione specifica un ServerName, la direttiva VirtualHost dovrà fare lo stesso. Nel seguente esempio, awesome.example.com e amazing.example.com verrebbero entrambi inoltrati a un servizio locale in esecuzione sulla porta 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>

So che questo non risponde esattamente alla domanda, ma lo sto mettendo qui perché questo è il risultato di ricerca principale per il port forwarding di Apache. Quindi immagino che un giorno aiuterà qualcuno.


Questo è l'unico che ha funzionato per me. L'utilizzo *:80invece di example.com:80significa che la porta non verrebbe reindirizzata.
Seb123,

4

Devi assicurarti che il proxy sia abilitato sul server. Puoi farlo usando i seguenti comandi:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart

3

Questa potrebbe essere una vecchia domanda, ma ecco cosa ho fatto:

In un file .conf caricato da apache:

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

Spiegazione: Ascolta tutte le richieste sulla porta 80 della macchina locale. Se ho richiesto " http://something.com/somethingorother", inoltra la richiesta a " http://localhost:8080/somethingorother". Questo dovrebbe funzionare per un visitatore esterno perché, secondo i documenti, associa la richiesta remota allo spazio del server locale.

Sto eseguendo Apache 2.4.6-2ubuntu2.2, quindi non sono sicuro di come "-2ubuntu2.2" influenzi l'applicabilità più ampia di questa risposta.

Dopo aver apportato queste modifiche, aggiungi i moduli necessari e riavvia apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart

2

Se non è necessario utilizzare un proxy per JBoss e mydomain.com:8080 può essere "esposto" al mondo, allora lo farei.

<VirtualHost *:80>
  ServerName mydomain.com
  Redirect 301 / http://mydomain.com:8080/
</VirtualHost>

L'uso di una porta diversa da 80 non solo sembra brutto, ma può anche causare problemi con i server proxy o gli ISP. In tal caso, basta rimuovere Apache ed eseguire invece JBoss sulla porta 80!
Martin Vilcans,

Eseguire tutto sotto JBoss è un'opzione, stavo solo cercando di evitare di spostare i siti apache su JBoss, ma non dovrebbe richiedere troppo tempo. Grazie per il feedback.
agentcurry


1

Il mio apache ascolta 2 porte diverse,

Listen 8080
Listen 80  

Uso l'80 quando desidero un URL trasparente e non inserisco la porta dopo l'URL utile per i servizi di Google che non consentono l'URL locale?

Ma io uso l'8080 per lo sviluppo interno dove uso la porta come riferimento per un "ambiente di sviluppo"


0

Apache supporta host virtuali basati su nome e basati su IP. Sembra che tu stia usando entrambi, il che probabilmente non è quello di cui hai bisogno.

Penso che tu stia effettivamente provando a configurare l' hosting virtuale basato sul nome e per questo non è necessario specificare l'indirizzo IP.

Prova <VirtualHost *: 80> per collegarsi a tutti gli indirizzi IP, a meno che tu non voglia davvero l' hosting virtuale basato su ip . Questo può essere il caso se il server ha diversi indirizzi IP e si desidera servire siti diversi su indirizzi diversi. La configurazione più comune è (immagino) host virtuali basati sul nome.


Questo ha senso, basarsi sul nome è tutto ciò di cui ho bisogno. L'ho cambiato ma non sta ancora instradando verso l'altra porta
agentcurry il

0

Hai bisogno di 2 cose:

  1. Aggiungi a ServerAlias www.mydomain.comalla tua configurazione
  2. cambia il tuo proxy in ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, per evitare che mod_dir e le barre finali interferiscano.

Ho aggiunto ServerAlias ​​ma non ho ancora avuto fortuna.
agentcurry

0

Tutti sono eccellenti spunti per accedere alle porte tramite nomi di dominio su server virtuali. Non dimenticare, tuttavia, di abilitare i server virtuali; questo può essere commentato:

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

Eseguiamo WSGI con un server Apache sul dominio sxxxx.com e un server Golang in esecuzione sulla porta 6800. Alcuni firewall sembrano bloccare i nomi di dominio con le porte. Questa era la nostra soluzione:

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

0

Questo funziona anche in ISPConfig. Nell'elenco dei siti Web entra in un dominio, fai clic sulla scheda Opzioni, aggiungi queste righe:;

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

Quindi vai al sito Web e wolaa :) Funziona anche con il protocollo HTTPS.


0

Prova questo-

<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> 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.