Pergunta

Quais são algumas boas maneiras de fazer isso? Será que é mesmo possível fazer de forma limpa?

Idealmente, eu gostaria de usar cabeçalhos dos pacotes para decidir qual servidor deve tratar os pedidos. No entanto, se há uma melhor maneira mais fácil / deixe-me saber.

Foi útil?

Solução

É impossível para ambos os servidores para escutar na mesma porta no mesmo endereço IP: uma vez que um único soquete só pode ser aberto por um único processo, apenas o primeiro servidor configurado para uma determinada combinação IP / porto vai com sucesso bind, e o segundo falhará.

Você vai, portanto, precisa de uma solução alternativa para conseguir o que deseja. Mais fácil é provavelmente a correr Apache em sua combinação IP / porta principal, e tê-lo encaminhar pedidos para o IIS (que devem ser configurados para um IP diferente e / ou porto) a ele usando mod_rewrite .

Tenha em mente que o IP alternativo e porta IIS é executado em deve ser acessível para os clientes que se conectam ao seu servidor: se você tiver apenas um único endereço IP disponível, você deve tomar cuidado para escolher uma porta que não é geralmente o IIS bloqueados por firewalls (8080 pode ser uma boa opção, ou 443, mesmo que você está correndo HTTP regular e não SSL)

P.S. Além disso, observe que você precisa fazer para modificar a configuração padrão usando httpcfg IIS antes que ele irá permitir que outros servidores para rodar na porta 80 em qualquer endereço IP no mesmo servidor: veja a resposta de Micky McQuade para o procedimento para fazer isso ...

Outras dicas

Eu encontrei este post que sugeriu a ter dois endereços IP separados de modo que tanto podia escutar na porta 80.

Houve uma ressalva de que você tinha que fazer uma mudança no IIS por causa de pooling socket. Aqui estão as instruções com base no link acima:

  1. Extrair o utilitário httpcfg.exe da área de ferramentas de suporte no CD Win2003.
  2. parar todos os serviços do IIS: net stop http /y
  3. Tem IIS escutar apenas o endereço IP que tinha designado para IIS: httpcfg set iplisten -i 192.168.1.253
  4. Certifique-se de: (. Os IPs listados são os únicos endereços IP que o IIS será escutando e nenhum outro) httpcfg query iplisten
  5. reiniciar o IIS Serviços: net start w3svc
  6. Inicie o serviço Apache

Para as pessoas apenas com um endereço IP e vários sites em um servidor, você pode configurar o IIS para escutar em uma porta diferente da 80, por exemplo 8080 definindo o TCP porta nas propriedades de cada um dos seus locais (incluindo a um padrão).

Em Apache, ative mod_proxy e mod_proxy_http, em seguida, adicione um get catch-all VirtualHost (depois de todos os outros) para que os pedidos Apache não é explicitamente manipulação "encaminhado" para IIS.

<VirtualHost *:80>
    ServerName foo.bar
    ServerAlias *
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
</VirtualHost>

Agora você pode ter Apache servir alguns sites e IIS servir os outros, sem diferença visível para o usuário.

Editar:. o seu IIS sites não deve incluir o seu número de porta em quaisquer URLs dentro de suas respostas, incluindo cabeçalhos

Você precisa de pelo menos mod_proxy e mod_proxy_http que ambos são parte da distribuição (ainda não toda construída automaticamente). Então você pode olhar aqui: http://httpd.apache.org/docs/ 2.2 / mod / mod_proxy.html

mais simples de configuração em um virtualhost contexto é:

ProxyPass         /winapp http://127.0.0.1:8080/somedir/

ProxyPassReverse  /winapp http://127.0.0.1:8080/somedir/

(Dependendo do seu webapp, a configuração real pode se tornar mais sofisticado.) Isso transparente redireciona todos os pedidos no winapp caminho / para o servidor Windows e transfere parte de trás saída resultante para o cliente.

Atenção: Cuide dos links nas páginas entregues: eles não são reescritos, para que você possa salvar-se lotsa aborrecimento se você geralmente usam links relativos em seu aplicativo, como

<a href=../pics/mypic.jpg">

em vez do pesadelo integração usual de cada ligação ser absoluto:

<a href="http://myinternalhostname/somedir/crappydesign.jpg">

O último é BAD QUASE cada vez!

Para reescrever os links nas páginas há mod_proxy_html (não confundir com mod_proxy_http!), Mas isso é outra história e um cruel assim.

De qualquer dois endereços diferentes do IP (como recomendado) ou um servidor web é inversa-proxy o outro (que está escutando uma porta <> 80).

Por exemplo: Apache escuta a porta 80, o IIS na porta 8080. Cada pedido http vai para Apache primeiro (é claro). Você pode então decidir de transmitir a todos os pedidos para um domínio específico (chamado virtual) ou a cada solicitação que contém um diretório específico (por exemplo, http://www.example.com/winapp/ ) para o IIS.

A vantagem deste conceito é que você tem apenas uma escuta servidor para o público em vez de dois, que são mais flexíveis quanto com dois servidores distintos.

Inconvenientes: alguns webapps estão crappily projetado e uma verdadeira dor na bunda de integrar em uma infra-estrutura reverse-proxy. Um trabalho IIS webapp é dependente de um Apache trabalhar, por isso temos algumas interdependências.

Eu vejo isso é bastante um post antigo, mas deparei com esta procurando uma resposta para este problema. Depois de ler algumas das respostas que parecem muito prolixo, então depois de cerca de 5 minutos eu consegui resolver o problema de maneira muito simples como se segue:

httpd.conf para Apache deixar a porta de escuta como 80 e 'Nome do Servidor' como FQDN / IP:. 80

Agora, para IIS ir para Serviços Administrativos> Gerenciador do IIS> 'Sites' na mão esquerda nav suspensa> na janela da direita, selecione a linha superior (site padrão), então as ligações à direita.

Agora, selecione http> editar e alterar para 81 e digite seu IP local para o servidor / pc e no domínio inserir o seu FQDN (www.domain.com) ou IP perto externo.

Restart tanto servidores garantir que suas portas estão abertas em ambos router e firewall, feito.

Isto soa prolixo, mas literalmente levou 5 minutos de jogar sobre. funciona perfeitamente.

Sistema: Windows 8, o IIS 8, Apache 2.2

A instalação do Windows 10 Eu tive esse problema:. Apache (IPv4) e serviço de spooler (IPv6) ouvindo a mesma porta 80

resolvi arquivo edição apache httpd.conf mudando a linha

Ouça 80

para

Ouça 127.0.0.1:80

Isso não é bem verdade. Por exemplo. para HTTP do Windows suporta o compartilhamento de porta com base URL, permitindo que vários processos para usar o mesmo endereço IP e porta.

Você vai precisar usar endereços IP diferentes. O servidor, se o Apache ou IIS, agarra o tráfego com base no IP e porta, que nunca eles são obrigados a ouvir. Uma vez que começa ouvir, em seguida, ele usa os cabeçalhos, como o nome do servidor para filtrar e determinar o site está sendo acessado. Você não pode fazê-lo simplesmente mudando o nome do servidor no pedido

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top