Apache redirige a otro puerto

151

He luchado con esto por algún tiempo y definitivamente estoy haciendo algo mal.

Tengo un servidor apache y un servidor JBoss en la misma máquina. Me gustaría redirigir el tráfico de mydomain.com a JBoss localhost: 8080 / example. El DNS está actualmente configurado para midominio.com e irá directamente al puerto 80 cuando se ingrese en el navegador.

Mi pregunta es, ¿cómo redirijo a un puerto diferente cuando un determinado nombre de dominio llega a Apache (en este caso, "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> 

ACTUALIZADO con Sugerencias - Todavía no se reenvía al puerto 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> 
agente
fuente
Eso se ve bastante bien. ¿Cuáles son tus síntomas?
Martin Vilcans
Los símbolos son que pongo www.midominio.com en el navegador pero va al directorio raíz de apache. En cambio, me gustaría que redirija a un subdirectorio jboss localhost: 8080 / subdir. Actualmente lo tengo funcionando para redirigir varios dominios directamente al puerto 80, pero no puedo conseguir que vaya a otro puerto.
agentcurry
Tengo exactamente la misma solicitud: ¿encontraste una solución?
Cystack
1
@Cystack: no pude conseguir que funcionara. Intenté tantas variaciones en la configuración que me volvió loco. Me di por vencido = / Si encuentra una solución, publíquela aquí, me gustaría saber cómo hacer que esto funcione. ¡buena suerte mi amigo!
agentcurry
Esto funcionó para mí: serverfault.com/a/195831/111707
jjrv

Respuestas:

224

Debe omitir el dominio http://example.comen ProxyPass y ProxyPassReverse y dejarlo como /. Además, debe dejar /al final de example/donde se está redirigiendo. Además, tuve algunos problemas con http://example.comvs. http://www.example.com- solo el www funcionó hasta que hice ServerName www.example.com y el ServerAlias ​​example.com. Prueba lo siguiente.

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

Después de realizar estos cambios, agregue los módulos necesarios y reinicie apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
2AMTech
fuente
9
habilite los módulos de Apache antes de reiniciar Apache - digitalocean.com/community/tutorials/…
Pradyut Bhattacharya
1
¿Sería lo mismo para un servidor CentOS? (No veo por qué no, solo asegurándome). ¿Y qué archivo de configuración sería este? (en algún lugar en / etc / httpd / conf, supongo ...)
Jeremy
1
Funcionó, pero vi que en la página de bienvenida de mi aplicación, no se cargó el CSS (que anteriormente funcionaba en example.com:8080/example). y también tengo algunas excepciones. alguna idea de lo que me estoy perdiendo?
Rajarshee Mitra
1
esto causó un error "Servicio no disponible" en mi httpd hasta que lo hice/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras
@ vladkras Muchas gracias por ese consejo, ¡muy útil!
Mneute
28

Resolví este problema con el siguiente código:

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>

También usé:

a2enmod proxy_http
Renan Vizza
fuente
10

Quería hacer exactamente esto para poder acceder a Jenkins desde el dominio raíz.

Descubrí que tenía que deshabilitar el sitio predeterminado para que esto funcionara. Esto es exactamente lo que hice.

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

E inserte esto en el archivo:

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

A continuación, debe habilitar / deshabilitar los sitios apropiados:

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

Espero que ayude a alguien.

Boca
fuente
Gracias por contribuir @Louth. Hace mucho que renuncié a esto y ya no tengo el servidor. Todavía me molesta que nunca lo hice funcionar, puedo iniciar un nuevo servidor solo para probar nuevamente. Gracias de nuevo, me aseguraré de actualizar si / cuando intente esto nuevamente.
agentcurry
El wiki de Jenkins explica cómo ejecutar Jenkins detrás de Apache: wiki.jenkins-ci.org/display/JENKINS/…
mneute el
6

Descubrí esto por prueba y error. Si su configuración especifica un ServerName, entonces su directiva VirtualHost tendrá que hacer lo mismo. En el siguiente ejemplo, awesome.example.com y amazing.example.com se enviarían a algún servicio local que se ejecute en el puerto 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>

Sé que esto no responde exactamente a la pregunta, pero lo estoy poniendo aquí porque este es el principal resultado de búsqueda para el reenvío de puertos Apache. Así que supongo que algún día ayudará a alguien.

Ethan B Martin
fuente
Este es el único que funcionó para mí. Usar en *:80lugar de example.com:80significaba que el puerto no sería redirigido.
Seb123
4

Debe asegurarse de que el proxy esté habilitado en el servidor. Puede hacerlo utilizando los siguientes comandos:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart
Aswin Mohanan
fuente
3

Esta podría ser una vieja pregunta, pero esto es lo que hice:

En un archivo .conf cargado por apache:

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

Explicación: escuche todas las solicitudes al puerto 80 de la máquina local. Si solicité " http://something.com/somethingorother", reenvíe esa solicitud a " http://localhost:8080/somethingorother". Esto debería funcionar para un visitante externo porque, de acuerdo con los documentos, asigna la solicitud remota al espacio del servidor local.

Estoy ejecutando Apache 2.4.6-2ubuntu2.2, así que no estoy seguro de cómo el "-2ubuntu2.2" afecta la aplicabilidad más amplia de esta respuesta.

Después de realizar estos cambios, agregue los módulos necesarios y reinicie apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej
fuente
2

Si no tiene que usar un proxy para JBoss y mydomain.com:8080 puede estar "expuesto" al mundo, entonces haría esto.

<VirtualHost *:80>
  ServerName mydomain.com
  Redirect 301 / http://mydomain.com:8080/
</VirtualHost>
Michael Rice
fuente
Usar un puerto que no sea 80 no solo se ve feo, sino que también puede causar problemas con servidores proxy o ISP. En ese caso, simplemente elimine Apache y ejecute JBoss en el puerto 80.
Martin Vilcans
Ejecutar todo bajo JBoss es una opción, solo estaba tratando de evitar mover los sitios apache a JBoss, pero no debería llevar demasiado tiempo. Gracias por la respuesta.
agentcurry
1

Mi apache escucha 2 puertos diferentes,

Listen 8080
Listen 80  

Uso el 80 cuando quiero una URL transparente y no pongo el puerto después de la URL útil para los servicios de Google que no permiten la URL local.

Pero uso el 8080 para desarrollo interno donde uso el puerto como referencia para un "entorno de desarrollo"

Miguel
fuente
0

Apache admite hosts virtuales basados ​​en nombre y basados ​​en IP. Parece que está utilizando ambos, lo que probablemente no sea lo que necesita.

Creo que en realidad está tratando de configurar un alojamiento virtual basado en nombres , y para eso no necesita especificar la dirección IP.

Intente <VirtualHost *: 80> para enlazar a todas las direcciones IP, a menos que realmente desee un alojamiento virtual basado en IP . Este puede ser el caso si el servidor tiene varias direcciones IP y desea servir diferentes sitios en diferentes direcciones. La configuración más común es (supongo) hosts virtuales basados ​​en nombres.

Martin Vilcans
fuente
Eso tiene sentido, el nombre basado es todo lo que necesito. Lo cambié pero todavía no es enrutamiento hacia el otro puerto
agentcurry
0

Necesitas 2 cosas:

  1. Agregue un ServerAlias www.mydomain.coma su configuración
  2. cambie su proxypass a ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, para evitar que mod_dir y las barras inclinadas interfieran.
Jon Lin
fuente
Agregué ServerAlias ​​pero aún no tuve suerte.
agentcurry
0

Todos son excelentes conocimientos para acceder a los puertos a través de nombres de dominio en servidores virtuales. Sin embargo, no olvide habilitar servidores virtuales; esto puede ser comentado:

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

Ejecutamos WSGI con un servidor Apache en el dominio sxxxx.com y un servidor golang que se ejecuta en el puerto 6800. Algunos cortafuegos parecen bloquear los nombres de dominio con puertos. Esta fue nuestra solución:

<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>
usuario2099484
fuente
0

Esto también funciona en ISPConfig. En la lista de sitios web, ingrese a un dominio, haga clic en la pestaña Opciones, agregue estas líneas:;

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

Luego vaya al sitio web y wolaa :) Esto también está funcionando el protocolo HTTPS.

kodmanyagha
fuente
0

Prueba este

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