Redirection Apache vers un autre port


151

J'ai du mal avec ça pendant un certain temps et je fais définitivement quelque chose de mal.

J'ai un serveur Apache et un serveur JBoss sur la même machine. Je voudrais rediriger le trafic de mydomain.com vers JBoss localhost: 8080 / exemple. Le DNS est actuellement configuré pour mydomain.com et il ira directement au port 80 une fois entré dans le navigateur.

Ma question est de savoir comment rediriger vers un port différent lorsqu'un certain nom de domaine arrive à apache (dans ce cas, "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> 

MISE À JOUR avec suggestions - Toujours pas de transfert vers le port 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> 

Cela semble plutôt bien. Quels sont tes symptômes?
Martin Vilcans

Sympotms sont que je mets www.mydomain.com dans le navigateur mais et il va dans apache root dir. Au lieu de cela, j'aimerais qu'il redirige vers un sous-répertoire jboss localhost: 8080 / subdir. Je le fais actuellement travailler pour rediriger divers domaines directement vers le port 80, mais je ne peux pas tout à fait le faire aller vers un autre port.
agentcurry

J'ai exactement la même demande: avez-vous trouvé une solution?
Cystack

1
@Cystack - Je ne pouvais pas tout à fait le faire fonctionner. J'ai essayé tellement de variations de configuration que cela m'a rendu fou. J'ai abandonné = / Si vous trouvez une solution, veuillez la poster ici, j'aimerais savoir comment faire fonctionner cela. bonne chance mon ami!
agentcurry

Cela a fonctionné pour moi: serverfault.com/a/195831/111707
jjrv

Réponses:


224

Vous devez laisser de côté le domaine http://example.comdans ProxyPass et ProxyPassReverse et le laisser tel quel /. De plus, vous devez laisser le /à la fin de l' example/endroit où il redirige. De plus, j'ai eu des problèmes avec http://example.comvs http://www.example.com- seul le www fonctionnait jusqu'à ce que je crée le ServerName www.example.com et le ServerAlias ​​example.com. Essayez ce qui suit.

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

Après avoir effectué ces modifications, ajoutez les modules nécessaires et redémarrez apache

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

9
activer les modules apache avant de redémarrer apache - digitalocean.com/community/tutorials/…
Pradyut Bhattacharya

1
Serait-ce la même chose pour un serveur CentOS? (Je ne vois pas pourquoi pas, je m'assure juste). Et quel fichier de configuration serait-ce? (quelque part dans / etc / httpd / conf, je suppose ...)
Jeremy

1
Cela a fonctionné, mais j'ai vu que dans la page d'accueil de mon application, le css n'était pas chargé (ce qui fonctionnait auparavant sur example.com:8080/example). et a également obtenu quelques exceptions. une idée de ce qui me manque?
Rajarshee Mitra

1
cela a causé une erreur "Service indisponible" sur mon httpd jusqu'à ce que je le fasse/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras

@vladkras Merci beaucoup pour cette astuce, très utile!
mneute

28

J'ai résolu ce problème avec le code suivant:

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>

J'ai également utilisé:

a2enmod proxy_http

10

Je voulais faire exactement cela pour pouvoir accéder à Jenkins à partir du domaine racine.

J'ai trouvé que je devais désactiver le site par défaut pour que cela fonctionne. Voici exactement ce que j'ai fait.

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

Et insérez ceci dans le fichier:

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

Ensuite, vous devez activer / désactiver les sites appropriés:

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

J'espère que ça aide quelqu'un.


Merci d'avoir contribué @Louth. J'ai abandonné cela depuis longtemps et je n'ai plus le serveur. Cela me dérange toujours que je ne l'ai jamais fait fonctionner, je peux démarrer un nouveau serveur juste pour tester à nouveau. Merci encore, je ne manquerai pas de mettre à jour si / quand je réessayerai.
agentcurry

Le wiki Jenkins explique comment exécuter Jenkins derrière Apache: wiki.jenkins-ci.org/display/JENKINS/…
mneute

6

J'ai découvert cela par essais et erreurs. Si votre configuration spécifie un ServerName, votre directive VirtualHost devra faire de même. Dans l'exemple suivant, awesome.example.com et amazing.example.com seraient tous deux redirigés vers un service local fonctionnant sur le port 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>

Je sais que cela ne répond pas exactement à la question, mais je la mets ici car c'est le premier résultat de recherche pour la redirection de port Apache. Alors je pense que ça aidera quelqu'un un jour.


C'est le seul qui a fonctionné pour moi. Utiliser *:80au lieu de example.com:80signifiait que le port ne serait pas redirigé.
Seb123

4

Vous devez vous assurer que le proxy est activé sur le serveur. Vous pouvez le faire en utilisant les commandes suivantes:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart

3

C'est peut-être une vieille question, mais voici ce que j'ai fait:

Dans un fichier .conf chargé par apache:

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

Explication: Écoutez toutes les demandes sur le port 80 de la machine locale. Si j'ai demandé " http://something.com/somethingorother", transmettez cette demande à " http://localhost:8080/somethingorother". Cela devrait fonctionner pour un visiteur externe car, selon la documentation, il mappe la demande distante à l'espace du serveur local.

J'utilise Apache 2.4.6-2ubuntu2.2, donc je ne suis pas sûr de savoir comment le "-2ubuntu2.2" affecte l'applicabilité plus large de cette réponse.

Après avoir effectué ces modifications, ajoutez les modules nécessaires et redémarrez apache

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

2

Si vous n'avez pas besoin d'utiliser un proxy pour JBoss et que mydomain.com:8080 peut être "exposé" au monde, alors je le ferais.

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

L'utilisation d'un port autre que 80 semble non seulement moche, mais peut également causer des problèmes avec les serveurs proxy ou les FAI. Dans ce cas, supprimez simplement Apache et exécutez JBoss sur le port 80 à la place!
Martin Vilcans

Tout exécuter sous JBoss est une option, j'essayais simplement d'éviter de déplacer les sites Apache vers JBoss, mais cela ne devrait pas prendre trop de temps. Merci pour les commentaires.
agentcurry


1

Mon apache écoute 2 ports différents,

Listen 8080
Listen 80  

J'utilise le 80 quand je veux une URL transparente et ne mets pas le port après l'URL utile pour les services Google qui n'autorisent pas l'URL locale?

Mais j'utilise le 8080 pour le développement interne où j'utilise le port comme référence pour un "environnement de développement"


0

Apache prend en charge les hôtes virtuels basés sur les noms et les adresses IP. Il semble que vous utilisiez les deux, ce qui n'est probablement pas ce dont vous avez besoin.

Je pense que vous essayez en fait de configurer un hébergement virtuel basé sur le nom , et pour cela, vous n'avez pas besoin de spécifier l'adresse IP.

Essayez <VirtualHost *: 80> pour vous lier à toutes les adresses IP, sauf si vous voulez vraiment un hébergement virtuel basé sur IP . Cela peut être le cas si le serveur a plusieurs adresses IP et que vous souhaitez desservir différents sites sur des adresses différentes. La configuration la plus courante est (je suppose) des hôtes virtuels basés sur le nom.


Cela a du sens, tout ce dont j'ai besoin est basé sur le nom. Je l'ai changé mais il n'est toujours pas acheminé vers l'autre port
agentcurry

0

Vous avez besoin de 2 choses:

  1. Ajoutez un ServerAlias www.mydomain.comà votre configuration
  2. changez votre proxypass en ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, pour éventuellement empêcher mod_dir et les barres obliques de fin d'interférer.

J'ai ajouté ServerAlias ​​mais toujours pas de chance.
agentcurry

0

Tous sont d'excellents renseignements sur l'accès aux ports via des noms de domaine sur des serveurs virtuels. N'oubliez pas, cependant, d'activer les serveurs virtuels; cela peut être commenté:

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

Nous exécutons WSGI avec un serveur Apache sur le domaine sxxxx.com et un serveur golang fonctionnant sur le port 6800. Certains pare-feu semblent bloquer les noms de domaine avec des ports. C'était notre solution:

<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

Cela fonctionne également dans ISPConfig. Dans la liste de sites Web, entrez dans un domaine, cliquez sur l'onglet Options, ajoutez ces lignes:;

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

Ensuite, allez sur le site Web et wolaa :) Cela fonctionne également avec le protocole HTTPS.


0

Essaye celui-là-

<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> 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.