Como servir arquivos estáticos com Apache e conteúdo dinâmico com o Morbo no mesmo servidor?

1

Eu tenho o Apache httpd na porta 80 e o servidor Morbo httpd na porta 3000 que serve código Mojolicious perl. O Morbo está disponível apenas no host local.

Agora, quero configurar o host virtual com o proxy para que os arquivos estáticos sejam servidos pelo Apache e o conteúdo dinâmico seja serverd pelo Morbo.

Esta é minha configuração de host virtual:

<VirtualHost *:80>
    ServerName    mojo.myhost.com
    DocumentRoot  /opt/mojo/public
    RewriteEngine on
    RewriteCond   %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteCond   %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    RewriteRule   ^(.*)  http://localhost:3000$1 [NS,P,L]
    ProxyPassReverse  /  http://mojo.myhost.com
</VirtualHost>

O problema é que quando tento acessar o http://mojo.myhost.com/ , o sub-requisito do Apache é emitido pelo Apache e o pedido enviado ao Morbo é http://localhost:3000/error/noindex.html e não http://localhost:3000/ .

Aqui faz parte do log da mod-rewrite:

[rid#2b20905c58e0/initial] (2) init rewrite engine with requested uri /
[rid#2b20905c58e0/initial] (3) applying pattern '^(.*)' to uri '/'
[rid#2b20905c58e0/initial] (4) RewriteCond: input='/opt/mojo/public/' pattern='!-f' => matched
[rid#2b20905c58e0/initial] (4) RewriteCond: input='/opt/mojo/public/' pattern='!-d' => not-matched
[rid#2b20905c58e0/initial] (1) pass through /
[rid#2b20905cb910/subreq] (2) init rewrite engine with requested uri /index.php
[rid#2b20905cb910/subreq] (1) pass through /index.php
[rid#2b20905cd920/subreq] (2) init rewrite engine with requested uri /index.html
[rid#2b20905cd920/subreq] (1) pass through /index.html
[rid#2b20905cb910/subreq] (2) init rewrite engine with requested uri /index.html.var
[rid#2b20905cb910/subreq] (1) pass through /index.html.var
[rid#2b20905cd920/subreq] (2) init rewrite engine with requested uri /index.htm
[rid#2b20905cd920/subreq] (1) pass through /index.htm
[rid#2b20905caf40/initial/redir#1] (2) init rewrite engine with requested uri /error/noindex.html
[rid#2b20905caf40/initial/redir#1] (3) applying pattern '^(.*)' to uri '/error/noindex.html'
[rid#2b20905caf40/initial/redir#1] (4) RewriteCond: input='/opt/mojo/public/error/noindex.html' pattern='!-f' => matched
[rid#2b20905caf40/initial/redir#1] (4) RewriteCond: input='/opt/mojo/public/error/noindex.html' pattern='!-d' => matched
[rid#2b20905caf40/initial/redir#1] (2) rewrite '/error/noindex.html' -> 'http://localhost:3000/error/noindex.html'
[rid#2b20905caf40/initial/redir#1] (2) forcing proxy-throughput with http://localhost:3000/error/noindex.html
[rid#2b20905caf40/initial/redir#1] (1) go-ahead with proxy request proxy:http://localhost:3000/error/noindex.html [OK]

Eu adicionei NS flag a RewriteRule , mas o subreq ainda modifica o URL antes de ser passado para o Morbo. Como posso obter o Apache para passar / em vez de /error/noindex.html para o Morbo?

Se os dois RewriteCond forem removidos da configuração virtualhost, isso funciona, mas os arquivos estáticos também são serverd pelo Morbo (o que eu não gosto muito).

    
por MSF 24.03.2013 / 12:13

1 resposta

1

Veja o que acontece, passo a passo:

  1. O servidor recebe uma solicitação para /
  2. O servidor verifica a condição -f e descobre que / não é um arquivo, portanto, corresponde à condição.
  3. O servidor verifica a condição -d e descobre que / é um diretório, portanto, não corresponde à condição.
  4. Como não corresponde à segunda condição, o servidor tenta processá-lo como um arquivo / diretório local. Um recurso terminado em / deve ter um arquivo de índice; por isso, procura por todos os arquivos de índice listados.
  5. Como não é possível encontrar um arquivo de índice, ele deseja mostrar /error/noindex.html .
  6. Agora voltamos a verificar as condições de reescrita e, desta vez, combinamos os dois - não há nem um arquivo nem um diretório chamado /error/noindex.html , então, desta vez, a solicitação de proxy é feita

A solução:

Adicione um RewriteRule que corresponda apenas ao / vazio e faça com que esse faça o Rewrite. Exemplo:

RewriteRule   ^/$  http://localhost:3000 [NS,P,L]
ProxyPassReverse  /  http://mojo.myhost.com

Isso corresponde a uma solicitação apenas para / .

    
por 25.03.2013 / 10:20