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> 

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

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

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.


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.


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

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

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>

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"


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.


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.

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>

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.


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> 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.