VirtualHost Padronizando para Implantação Errada ao Reiniciar

5

Temos um servidor executando sete domínios / subdomínios. Para tentar ir o mínimo possível, incluirei quatro deles.

  1. example.com
  2. www.example.com
  3. dwf.example.com
  4. chris.example.com

O servidor funciona muito bem 90% do tempo, mas ocasionalmente recebemos um número maior de solicitações e o servidor de banco de dados fica inativo. Este, em seguida, max sai as conexões do apache, porque todas as conexões db estão aguardando o tempo limite. Tudo bem, nós forçamos uma reinicialização no DB, e as conexões voltam. No entanto, as solicitações chegam à configuração dfw.example.com. Essa implantação não tem nossa base de código, o que é um grande problema e não entendo por que isso está acontecendo. Ele também vai consistentemente para essa implantação quando isso acontece e nunca para os outros 5 que temos.

Na documentação que li, achei que o Apache lesse o arquivo httpd.conf e procurava pela primeira correspondência NamedVirtualHost:

Now when a request arrives, the server will first check if it is using an IP address that matches the NameVirtualHost. If it is, then it will look at each <VirtualHost> section with a matching IP address and try to find one where the ServerName or ServerAlias matches the requested hostname. If it finds one, then it uses the configuration for that server. If no matching virtual host is found, then the first listed virtual host that matches the IP address will be used.

Estamos executando o Apache 2.2.15.

Partes que considero relevantes no arquivo httpd.conf:

Listen 80
Listen 255.255.255.255:443

...

ServerName www.example.com

... (esta é a ordem exata, www (https / http), dfw, depois todas as outras versões)

NameVirtualHost www.example.com:80
<VirtualHost    www.example.com:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/www.example.com
    ServerName www.example.com
    DirectoryIndex index.html
    DirectoryIndex index.php
    LogLevel notice
    ErrorLog /var/log/httpd/www.example.com/error.log
    CustomLog /var/log/httpd/www.example.com/access.log w3c_extended
</VirtualHost>

NameVirtualHost www.example.com:443
<VirtualHost www.example.com:443>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/www.example.com
    ServerName www.example.com
    #certificate stuff
    DirectoryIndex index.html
    DirectoryIndex index.php
    LogLevel notice
    ErrorLog /var/log/httpd/www.example.com/error.log
    CustomLog /var/log/httpd/www.example.com/access.log w3c_extended 
</VirtualHost>

NameVirtualHost dfw.example.com:80
<VirtualHost    dfw.example.com:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/dfw.example.com
    ServerName dfw.example.com
    DirectoryIndex index.html
    DirectoryIndex index.php
    LogLevel notice
    ErrorLog /var/log/httpd/dfw.example.com/error.log
    CustomLog /var/log/httpd/dfw.example.com/access.log w3c_extended
</VirtualHost>
NameVirtualHost chris.example.com:443
<VirtualHost    chris.example.com:443>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/chris.example.com
#cert stuff
    ServerName chris.example.com
    DirectoryIndex index.html
    DirectoryIndex index.php
    LogLevel notice
    ErrorLog  /var/log/httpd/chris.example.com/error.log
    CustomLog /var/log/httpd/chris.example.com/access.log w3c_extended
</VirtualHost>

NameVirtualHost chris.example.com:80
<VirtualHost    chris.example.com:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/chris.example.com
    ServerName chris.example.com
    DirectoryIndex index.html
    DirectoryIndex index.php
    LogLevel notice
    RewriteLog /home/chris/writinglog.log
    RewriteLogLevel 8
    ErrorLog /var/log/httpd/chris.example.com/error.log
    CustomLog /var/log/httpd/chris.example.com/access.log w3c_extended
    CheckSpelling on
</VirtualHost>

A execução de um sudo service httpd restart faz a implantação correta ser veiculada novamente.

Saída de apachectl -S :

VirtualHost configuration:
[IPV6ADDRESS]:443 is a NameVirtualHost
         default server chris.example.com (/etc/httpd/conf/httpd.conf:1077)
         port 443 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1077)
[IPV6ADDRESS]:80 is a NameVirtualHost
         default server chris.example.com (/etc/httpd/conf/httpd.conf:1095)
         port 80 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1095)
         port 80 namevhost cory.example.com (/etc/httpd/conf/httpd.conf:1128)
IPV4Address:80      is a NameVirtualHost
         default server www.example.com (/etc/httpd/conf/httpd.conf:1035)
         port 80 namevhost dfw.example.com (/etc/httpd/conf/httpd.conf:1065)
        port 80 namevhost www.example.com (/etc/httpd/conf/httpd.conf:1035)
         port 80 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1095)
IPV4Address:443     is a NameVirtualHost
         default server www.example.com (/etc/httpd/conf/httpd.conf:1047)
         port 443 namevhost www.example.com (/etc/httpd/conf/httpd.conf:1047)
         port 443 namevhost chris.example.com (/etc/httpd/conf/httpd.conf:1077)
wildcard NameVirtualHosts and _default_ servers:
_default_:443          www.example.com (/etc/httpd/conf.d/ssl.conf:74)
Syntax OK
    
por chris85 31.05.2016 / 17:17

1 resposta

1

Não tenho certeza se é bom que você tenha várias diretivas NameVirtualHost * . Pelo que entendi sua pergunta, você quer um NAME Virtual Host puro e deseja que todas as interfaces em todas as portas sejam tratadas pelo Host NameVirtual.

Eu recomendo que você crie seus hosts assim:

# Use Virtual hosts for all interfaces on all ports
NameVirtualHost *


<VirtualHost *>
  ServerName example.com
  # all other settings for this hostname
</VirtualHost>

<VirtualHost *>
  ServerName www.example.com
  # all other settings for this hostname
</VirtualHost>

<VirtualHost *>
  ServerName dfw.example.com
  # all other settings for this hostname
</VirtualHost>

<VirtualHost *>
  chris.example.com
  # all other settings for this hostname
</VirtualHost>



## ssl.conf
<VirtualHost _default_:443>
  ServerName www.example.com
  # all other settings for this hostname
  SSLEngine on
  #certificate stuff
</VirtualHost>

E se você quiser usar as mesmas configurações para vários nomes de host (por exemplo, example.com e www.example.com), você pode simplesmente adicionar diretiva ServerAlias onde todos os nomes de hosts são listados (curingas como "* .example.com" são possíveis também).

por exemplo. um host virtual que corresponde a "example.com" e "www.example.com" poderia ser feito assim:

<VirtualHost *>
  ServerName example.com
  ServerAlias example.com www.example.com
  # all other settings for this hostname
</VirtualHost>

p.s. Configurações como DirectoryIndex ou LogLevel você pode definir uma vez em sua configuração global. Seu host virtual terá a configuração global e você não precisará adicionar o mesmo valor a cada host.

Somente se um host precisar de uma configuração diferente dos valores globais, você deverá adicionar as configurações especiais neste host.

    
por 11.07.2018 / 16:22