vários vhosts na instância amazon ec2: não pode acessar nenhum outro vhost do que o padrão

1

Eu tenho uma instância do Amazon EC2 executando o Ubuntu 14.04 com o Apache 2.4. Eu configurei o Apache com 3 hosts virtuais, todos apenas para HTTPS.

O problema é que quando eu tento acessar o servidor web da internet, o nome do host de alguma forma se perde e o apache tenta servir a página do host padrão, não importa qual hostname eu tenha acessado.

/etc/apache2/sites-enabled/default-ssl.conf:

<VirtualHost *:80>
    ServerName monitor.mydomain.net
    Redirect / https://monitor.mydomain.net
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName monitor.mydomain.net
    DocumentRoot /usr/share/nagios3/htdocs
    <Directory />
            Options FollowSymLinks
            AllowOverride None
            allow from all
    </Directory>
    <Directory /usr/share/nagios3/htdocs>
            Options Indexes FollowSymLinks MultiViews
            Options +ExecCGI
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>
    ScriptAlias /cgi-bin/nagios3 /usr/lib/cgi-bin/nagios3
    ScriptAlias /nagios3/cgi-bin /usr/lib/cgi-bin/nagios3
    Alias /stylesheets /etc/nagios3/stylesheets
    <DirectoryMatch (/usr/share/nagios3/htdocs|/usr/lib/cgi-bin/nagios3|/etc/nagios3/stylesheets)>
            Options FollowSymLinks
            DirectoryIndex index.php index.html
            AllowOverride AuthConfig
                <IfVersion < 2.3>
                    Order Allow,Deny
                    Allow From All
                </IfVersion>
                <IfVersion >= 2.3>
                    Require all denied
                </IfVersion>
                AuthName "Nagios Access"
            AuthType Basic
            AuthUserFile /etc/nagios3/htpasswd.users
            <RequireAny>
                    Require valid-user
            </RequireAny>
    </DirectoryMatch>
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/nagios_error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/nagios_access.log combined
    SSLEngine on

    SSLCertificateKeyFile /etc/ssl/private/a-wildcard.key
    SSLCertificateFile /etc/ssl/certs/a-wildcard+dhparam.pem
    SSLCertificateChainFile /etc/ssl/certs/gd_bundle-g2-g1.crt

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>
    BrowserMatch "MSIE [2-6]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>

/etc/apache2/sites-enabled/timetracker.conf:

<VirtualHost timetracker.mydomain.net:80>
    ServerName timetracker.mydomain.net
    Redirect / https://timetracker.mydomain.net
</VirtualHost>
<VirtualHost timetracker.mydomain.net:443>

    ServerAdmin [email protected]
    ServerName timetracker.mydomain.net

    DocumentRoot /var/www/kimai
    <Directory />
            Options FollowSymLinks
            AllowOverride None
    </Directory>
    <Directory /var/www/kimai>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/timetracker_error.log

    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/timetracker_access.log combined

    SSLEngine on

    SSLCertificateKeyFile /etc/ssl/private/a-wildcard.key
    SSLCertificateFile /etc/ssl/certs/a-wildcard+dhparam.pem
    SSLCertificateChainFile /etc/ssl/certs/gd_bundle-g2-g1.crt

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>

    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>

O domínio foi anonimizado, é claro.

Testar os URLs no navegador me dá:

monitor.mydomain.net - > Página Nagios do monitor.meudominio.net timetracker.mydomain.net - > IGUALMENTE a página do Nagios no monitor.meudominio.net , enquanto é suposto que ele sirva a página do Kimai em timetracker.mydomain.net.

Este é o arquivo de log nagios_acces.log depois que eu acessar a página através do monitor.meudominio.net:

 188.194.164.71 - nagiosadmin [10/Oct/2016:19:08:35 +0000] "GET / HTTP/1.1" 200 6389 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"
 188.194.164.71 - nagiosadmin [10/Oct/2016:19:08:36 +0000] "GET /side.php HTTP/1.1" 200 1429 "https://monitor.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"
 188.194.164.71 - nagiosadmin [10/Oct/2016:19:08:36 +0000] "GET /main.php HTTP/1.1" 200 1917 "https://monitor.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"

Quando eu acesso o site através do timetracker.mydomain.com, recebo essas linhas no mesmo arquivo de log:

188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:19 +0000] "GET / HTTP/1.1" 200 1018 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"
188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:20 +0000] "GET /side.php HTTP/1.1" 200 1429 "https://timetracker.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"
188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:20 +0000] "GET /main.php HTTP/1.1" 200 1917 "https://timetracker.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"
188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:20 +0000] "GET /images/favicon.ico HTTP/1.1" 200 1178 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0"

Observe que essas linhas também aparecem no arquivo de log do monitor ; o arquivo de log real para o timetracker permanece vazio .

Alguém me sugeriu que as instâncias do Amazon EC2 podem estar por trás de um proxy reverso que, de alguma forma, descarta o nome do host para o qual a solicitação HTTP original foi feita.

Isso é verdade? Se sim, como posso contornar isso?

Muito obrigado antecipadamente!

EDIT: Toda esta configuração foi migrada de outro servidor onde estava funcionando perfeitamente como esperado. Os diretórios / etc / apache2 em ambos os servidores são completamente idênticos, exceto pelo nome de domínio de segundo nível, é claro. A única outra diferença é que o servidor original é o Debian Jessie enquanto o novo servidor é o Ubuntu 14.04.

    
por ronin667 10.10.2016 / 21:48

1 resposta

0

É por causa do ambiente de rede da AWS. Sua instância do EC2 parece ter 2 IPs atribuídos (um privado e um público), mas, na realidade, o EC2 atribuiu somente o ip privado . O IP público aponta para algum dispositivo NAT enorme que está na frente do VPC e que sabe como mapear o IP público para sua instância do EC2. Essa é uma das estranhezas da AWS.

E esta é a causa raiz do seu problema. Como você pode ver, seu host virtual padrão é declarado como <VirtualHost *:80> ou <VirtualHost *:443> , o que significa para o apache algo como "solicitações de varredura em todas as interfaces onde o apache está ouvindo e procura por solicitação com cabeçalho de host igual a monitor.mydomain.net ( como definido na diretiva ServerName) ". Isso é ok, seus pedidos estão chegando através do seu IP privado (devido a esse dispositivo NAT) e tudo está funcionando.

Mas em seu segundo virtualhost, você declarou como <VirtualHost timetracker.mydomain.net:80> resp. como <VirtualHost timetracker.mydomain.net:443> , o que significa que na linguagem apache "verifica todos os pedidos que vêm através da interface com IP timetracker.mydomain.net e procura pelo cabeçalho do Host timetracker.mydomain.net". O problema é que seu EC2 não tem interface com IP de timetracker.mydomain.net porque esse IP aponta para o dispositivo NAT da AWS, não para a instância do EC2, portanto, essa regra nunca é usada.

Você tem que reconfigurar todos os seus VirtualHosts para ouvir em *: 80 e *: 443 e apenas definir seus sites com a diretiva ServerName . Infelizmente, não há como você ter seu IP público diretamente no seu EC2. A AWS tem isso porque deseja alterar dinamicamente o mapeamento de IPs e instâncias do EC2.

    
por 12.10.2016 / 09:33