Apache redireciona para outra porta

151

Eu luto com isso há algum tempo e definitivamente estou fazendo algo errado.

Eu tenho um servidor apache e um servidor JBoss na mesma máquina. Eu gostaria de redirecionar o tráfego do mydomain.com para o JBoss localhost: 8080 / example. O DNS está atualmente configurado para mydomain.com e irá direto para a porta 80 quando inserido no navegador.

Minha pergunta é como redirecionar para uma porta diferente quando um determinado nome de domínio chega ao apache (neste caso, "meudominio.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> 

ATUALIZADO com sugestões - ainda não encaminhando para a 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> 
agentcurry
fonte
Isso parece muito bom. Quais são os seus sintomas?
Martin Vilcans
Os sintomas são que eu coloquei www.mydomain.com no navegador, mas ele vai apache root dir. Em vez disso, gostaria que ele fosse redirecionado para um subdiretório jboss localhost: 8080 / subdir. Atualmente, tenho-o trabalhando para redirecionar vários domínios diretamente para a porta 80, mas não consigo fazê-lo ir para outra porta.
agentcurry
Tenho exatamente o mesmo pedido: você encontrou uma solução?
Cystack
1
@Cystack - Eu não consegui fazê-lo funcionar. Eu tentei tantas variações na configuração que me deixou louco. Desisti = / Se você encontrar uma solução, poste-a aqui, gostaria de saber como fazer isso funcionar. boa sorte meu amigo!
agentcurry
Isso funcionou para mim: serverfault.com/a/195831/111707
jjrv

Respostas:

224

Você deve deixar de fora o domínio http://example.comem ProxyPass e ProxyPassReverse e deixá-lo como /. Além disso, você precisa deixar o /no final de example/onde ele está redirecionando. Além disso, tive alguns problemas com o http://example.comvs. http://www.example.com- apenas o www funcionou até criar o ServerName www.example.com e o ServerAlias ​​example.com. Experimente o seguinte.

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

Depois de fazer essas alterações, adicione os módulos necessários e reinicie o apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
2AMTech
fonte
9
permitir apache módulos antes de reiniciar o apache - digitalocean.com/community/tutorials/...
Pradyut Bhattacharya
1
Seria o mesmo para um servidor CentOS? (Não vejo por que não, apenas certificando-me). E qual seria o arquivo de configuração? (em algum lugar no / etc / httpd / conf Eu estou supondo ...)
Jeremy
1
Funcionou, mas vi que na página de boas-vindas do meu aplicativo, o css não estava carregado (o que anteriormente funcionava em example.com:8080/example). e também tenho algumas exceções. alguma idéia do que estou perdendo?
Rajarshee Mitra
1
isso causou um erro "Serviço Indisponível" no meu httpd até que eu fiz/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras
@vladkras Muito obrigado por essa dica, muito útil!
Mnute #
28

Resolvi esse problema com o seguinte 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>

Eu também usei:

a2enmod proxy_http
Renan Vizza
fonte
10

Eu queria fazer exatamente isso para acessar o Jenkins a partir do domínio raiz.

Descobri que tinha que desativar o site padrão para que isso funcionasse. Aqui está exatamente o que eu fiz.

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

E insira isso no arquivo:

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

Em seguida, você precisa ativar / desativar os sites apropriados:

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

Espero que ajude alguém.

Louth
fonte
Obrigado por contribuir com @Louth. Há muito tempo desisti disso e não tenho mais o servidor. Ainda me incomoda que eu nunca tenha funcionado, talvez inicie um novo servidor apenas para testar novamente. Mais uma vez obrigado, atualizaremos se / quando tentar novamente.
agentcurry
O wiki do Jenkins explica como executar o Jenkins por trás do Apache: wiki.jenkins-ci.org/display/JENKINS/…
mneute
6

Descobri isso por tentativa e erro. Se sua configuração especificar um ServerName, sua diretiva VirtualHost precisará fazer o mesmo. No exemplo a seguir, awesome.example.com e amazing.example.com seriam encaminhados para algum serviço local em execução na 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>

Sei que isso não responde exatamente à pergunta, mas estou colocando aqui porque este é o principal resultado da pesquisa de encaminhamento de porta Apache. Então, acho que ajudará alguém algum dia.

Ethan B Martin
fonte
Este é o único que funcionou para mim. Usar em *:80vez de example.com:80significava que a porta não seria redirecionada.
Seb123
4

Você deve certificar-se de que o proxy esteja ativado no servidor. Você pode fazer isso usando os seguintes comandos:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart
Aswin Mohanan
fonte
3

Esta pode ser uma pergunta antiga, mas eis o que eu fiz:

Em um arquivo .conf carregado pelo apache:

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

Explicação: Ouça todas as solicitações na porta 80 da máquina local. Se eu solicitei " http://something.com/somethingorother", encaminhe essa solicitação para " http://localhost:8080/somethingorother". Isso deve funcionar para um visitante externo, pois, de acordo com os documentos, ele mapeia a solicitação remota para o espaço do servidor local.

Estou executando o Apache 2.4.6-2ubuntu2.2, por isso não tenho certeza de como o "-2ubuntu2.2" afeta a maior aplicabilidade desta resposta.

Depois de fazer essas alterações, adicione os módulos necessários e reinicie o apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart
Teeeeeeeeeeeeeeeeeeeeeeeeeej
fonte
2

Se você não precisar usar um proxy para o JBoss e o mydomain.com:8080 puder ser "exposto" ao mundo, eu faria isso.

<VirtualHost *:80>
  ServerName mydomain.com
  Redirect 301 / http://mydomain.com:8080/
</VirtualHost>
Michael Rice
fonte
O uso de uma porta diferente de 80 não apenas parece feio, mas também pode causar problemas com servidores proxy ou ISPs. Nesse caso, basta remover o Apache e executar o JBoss na porta 80!
Martin Vilcans
A execução de tudo no JBoss é uma opção, eu estava apenas tentando evitar a transferência dos sites apache para o JBoss, mas não deveria consumir muito tempo. Obrigado pelo feedback.
agentcurry
1

Meu apache ouve 2 portas diferentes,

Listen 8080
Listen 80  

Eu uso o 80 quando quero um URL transparente e não coloco a porta após o URL útil para os serviços do Google que não permitem o URL local?

Mas eu uso o 8080 para desenvolvimento interno, onde uso a porta como referência para um "ambiente de desenvolvimento"

Miguel
fonte
0

O Apache suporta hosts virtuais baseados em nome e IP. Parece que você está usando os dois, o que provavelmente não é o que você precisa.

Acho que você está realmente tentando configurar uma hospedagem virtual baseada em nome e, para isso, não precisa especificar o endereço IP.

Tente <VirtualHost *: 80> para vincular a todos os endereços IP, a menos que você realmente queira hospedagem virtual baseada em IP . Pode ser esse o caso se o servidor tiver vários endereços IP e você desejar servir sites diferentes em endereços diferentes. A configuração mais comum é (eu acho) os hosts virtuais baseados em nome.

Martin Vilcans
fonte
Isso faz sentido, tudo o que preciso é baseado em nome. Eu mudei, mas ele ainda não está roteando para a outra porta
agentcurry
0

Você precisa de 2 coisas:

  1. Adicione um ServerAlias www.mydomain.comà sua configuração
  2. mude seu proxypass para ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, para possivelmente impedir que mod_dir e as barras finais interfiram.
Jon Lin
fonte
Adicionei ServerAlias, mas ainda não tive sorte.
agentcurry
0

Todos são excelentes idéias para acessar portas por meio de nomes de domínio em servidores virtuais. Não se esqueça, no entanto, de habilitar servidores virtuais; isto pode ser comentado:

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

Executamos o WSGI com um servidor Apache no domínio sxxxx.com e um servidor golang executando na porta 6800. Alguns firewalls parecem bloquear nomes de domínio com portas. Esta foi a nossa solução:

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

Isso também está funcionando no ISPConfig. Na lista de sites, entre em um domínio, clique na guia Opções e adicione estas linhas:;

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

Então vá ao site e wolaa :) Este também está funcionando com o protocolo HTTPS.

kodmanyagha
fonte
0

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