web-dev-qa-db-ja.com

再起動時にVirtualHostがデフォルトで誤った展開に

7つのドメイン/サブドメインを実行しているサーバーがあります。ここでは可能な限り最小限に抑えるために、そのうちの4つを含めます。

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

サーバーは90%の時間で正常に動作しますが、リクエストの数が多くなり、データベースサーバーがダウンすることがあります。すべてのdb接続がタイムアウトを待機しているため、これによりApache接続が最大になります。 DBを強制的に再起動すると、接続が回復します。ただし、リクエストはdfw.example.com構成に送られます。そのデプロイメントにはコードベースがありません。これは大きな問題であり、なぜそれが起こっているのか理解できません。また、これが発生した場合も一貫してその展開に移行し、他の5つはありません。

私が読んだドキュメントから、Apacheがhttpd.confファイルを読んで、最初のNamedVirtualHostの一致を探したと思いました。

これで、リクエストが到着すると、サーバーは最初にNameVirtualHostと一致するIPアドレスを使用しているかどうかを確認します。そうである場合は、IPアドレスが一致する各<VirtualHost>セクションを調べ、ServerNameまたはServerAliasが要求されたホスト名と一致するセクションを見つけようとします。見つかった場合は、そのサーバーの構成を使用します。一致する仮想ホストが見つからない場合は、IPアドレスに一致する最初にリストされた仮想ホストが使用されます。

Apache2.2.15を実行しています。

Httpd.confファイルから関連すると思う部分:

Listen 80
Listen 255.255.255.255:443

.。

ServerName www.example.com

...(これは正確な順序です。www(https/http)、dfw、その他すべてのバージョン)

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>

Sudo service httpd restartを実行すると、正しいデプロイメントが再び提供されます。

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
5
chris85

複数のNameVirtualHost *ディレクティブがあるのが良いかどうかはわかりません。私があなたの質問を理解しているように、あなたは純粋なNAME仮想ホストが必要であり、すべてのポートのすべてのインターフェースがNameVirtualホストによって処理されることを望んでいます。

次のようなホストを作成することをお勧めします。

# 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>

また、複数のホスト名(example.comやwww.example.comなど)に同じ設定を使用する場合は、すべてのホスト名がリストされているServerAliasディレクティブを簡単に追加できます(「* .example.com」などのワイルドカードも可能です)。

例えば「example.com」と「www.example.com」に一致する仮想ホストは、次のように実行できます。

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

p.s. DirectoryIndexLogLevelのような設定は、グローバル構成で1回定義できます。仮想ホストはグローバル構成を取得するため、各ホストに同じ値を追加する必要はありません。

1つのホストでグローバル値とは異なる構成が必要な場合にのみ、このホストに特別な設定を追加する必要があります。

1
Radon8472