7つのドメイン/サブドメインを実行しているサーバーがあります。ここでは可能な限り最小限に抑えるために、そのうちの4つを含めます。
サーバーは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
複数の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. DirectoryIndex
やLogLevel
のような設定は、グローバル構成で1回定義できます。仮想ホストはグローバル構成を取得するため、各ホストに同じ値を追加する必要はありません。
1つのホストでグローバル値とは異なる構成が必要な場合にのみ、このホストに特別な設定を追加する必要があります。