ほとんどの人は、クラウドサーバーで複数のドメインにサービスを提供しています。同じドメインの異なるドメインまたは異なるサブドメインにサービスを提供するかどうかにかかわらず、手順は同じです。この記事では、複数のドメインにサービスを提供する仮想ホストを作成する方法と、Apacheの名前ベースの仮想ホスト構成に関する問題のトラブルシューティング方法について説明します。
ブラウザがサーバーのIPアドレスにドメイン名の内容を要求するリクエストを送信したとき(たとえば、https://yourexampledomain.com
)、WebサーバーはサイトのHTTP表現を提供します。サーバーが1つのWebサイトのみを提供している場合は、/var/www/html
のHTMLを提供します。 index.html
で始まるディレクトリ 。ただし、提供するWebサイトごとに一意のサーバーを使用すると、コストがかかり、リソースを非効率的に使用できます。
名前ベースの仮想ホスト 1つのサーバーから複数のWebサイトにコンテンツを提供できるようにします。
仮想ホスト構成ファイルの最初の行の1つは、仮想ホストに関連付けられているドメイン名を指定します。以下は、domain1.com
にサービスを提供するApacheの仮想ホスト構成の例です。 :
<VirtualHost \*:80>
ServerName domain1.com
ServerAlias www.domain1.com
</VirtualHost>
次の例は、NGINXの仮想ホスト構成を示しています。
server {
server_name www.domain1.com;
rewrite ^/(.\*) https://domain1.com/$1 permanent;
各構成の開始方法は少し異なりますが、同じ原則が適用されます。つまり、特定の仮想ホストがdomain1.com
のクエリに応答します。 およびwww.domain1.com
。
ドメインごとに異なるコンテンツを提供するには、別の仮想ホストを追加します。
たとえば、ブログを提供しているblog.domain1.comというサブドメインがあります。
まず、ブログに関連するファイル(WordPressのインストールなど)を含むフォルダーをpublic_htmlフォルダーに作成します。
次に、server_name
を使用して仮想ホストを作成します またはServerName
blog.domain1.com
として指定 public_html
内のブログファイルとフォルダーを指すように構成します フォルダ。
仮想ホストの詳細については、ApacheドキュメントのName-base Virtual Hosts
を使用してください。このセクションでは、Apacheの名前ベースの仮想ホスト構成に関する問題のトラブルシューティング方法を示します。仮想ホスト構成をテストするための便利なコマンドを提供し、それらの出力を解釈する方法を説明し、一般的な仮想ホスト構成の問題を修正するのにどのように役立つかを説明します。
問題を診断する前に、Apache構成ファイルに最後に変更を加えてからApacheを再起動したことを確認してください。
-
Red Hatディストリビューションの場合:
sudo /usr/sbin/httpd -k restart
-
Debianディストリビューションの場合:
sudo /usr/sbin/apache2 -k restart
Apacheから警告またはエラーメッセージが表示された場合は、後で注意してください。次のステップは、仮想ホストの構成に関する情報を取得することです。
-S
を実行します Webサーバーでコマンドを実行して、仮想ホストの構成を確認します
-
Red Hat派生ディストリビューションの場合:
sudo /usr/sbin/httpd -S
-
Debian派生ディストリビューションの場合:
sudo /usr/sbin/apache2 -S
出力には、構成ファイルからの仮想ホスト設定が表示されます。次の例は、2つの名前ベースの仮想ホストvh1.example.comとvh2.example.comで構成されたサーバーの構成レポートを示しています。番号付きの行は、例に従って説明されています。
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
[1] \*:80 is a NameVirtualHost
[2] default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[3] port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[4] port 80 namevhost vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
[5] Syntax OK
-
行[1]は、WebサーバーがApacheがリッスンしているすべてのIPアドレスのデフォルトポート80でリッスンしており、名前ベースの仮想ホスティングがオンになっていることを報告しています。 *は、すべてのIPアドレスを指定するワイルドカードです。
-
行[2]は、特定のホスト名が要求されていない要求に対してWebサーバーServerAliasがデフォルトの仮想ホストを報告します。また、構成ファイルへのパスと、この構成が設定されている行番号も表示されます。
-
行[3]は、最初に見つかった仮想ホスト構成のポートと名前、構成されているファイル、および構成が開始される行番号を報告します。
-
行[4]は、検出された2番目の仮想ホスト構成のポートと名前、構成されているファイル、および構成が開始される行番号を報告します。
-
[5]行目は、構成構文が正しいかどうかを報告していますが、それは必ずしもサイトが機能していることを意味するわけではありません
次の出力は、仮想ホストファイルの構成に従って生成されました。
NameVirtualHost \*:80 Turns on name-based host resolution and binds the virtual server to IP addresses and ports as in [1] above. The \* is a wildcard specifying all IP addresses.
<VirtualHost \*:80> Configures the first and default virtual host in [2] & [3] above. It is the default because it is the first virtual host whose IP and port matches those in the NameVirtualHost directive before it.
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80> Configures the second virtual host in [4] above.
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
基本的な仮想ホスト構成の外観と、それがApache独自の構成レポートにどのようにマップされるかを確認したので、これらのレポートを使用して、一般的な構成の問題を確認できます。次のセクションでは、これらの問題のいくつかについて説明し、それらを修正する方法についてのガイダンスを提供します。
httpd -S
を実行している場合 次の警告を報告します:
[Wed May 18 15:24:51 2011] [warn] \_default\_ VirtualHost overlap on port 80, the first has precedence
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:80 vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
\*:80 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
Syntax OK
この警告は、複数の仮想ホストが名前ベースの仮想ホストとして設定されずに同じ「ソケット」を使用しようとしていることを示しています。このエラーは、デフォルトのNameVirtualHost
が原因で、Apache仮想ホストが最初に作成されたときによく発生します。 ディレクティブはハッシュ記号でコメント化されています。その記号は、Apacheにディレクティブを無視するように指示します。
デフォルトのApache構成ファイルでこの問題を修正するには、NameVirtualHost *:80
を確認します。 ディレクティブはコメント化されていません。最小限のApache構成ファイルを使用している場合は、NameVirtualHost *:80
を追加します。 個々の仮想ホスト構成の上のディレクティブ。
次の例は、エラーの原因となったコメント付きディレクティブを示しています。
#NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
VirtualHostディレクティブに要素がありません
httpd -S
を実行している場合 次のエラーメッセージを報告します:
Syntax error on line 8 of /etc/httpd/conf/custom/virtualhost.conf:
<VirtualHost> directive requires additional arguments
このメッセージは、仮想ホストのVirtualHost
を意味します ディレクティブに必要な要素がありません。 VirtualHost
ディレクティブは、個々の仮想ホスト構成の最初の行です。この場合、エラーは構成ファイル/etc/httpd/conf/custom/virtualhost.conf
の8行目にあります。 。
上記のエラーを引き起こしたApache構成は次のとおりです。
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
2番目のVirtualHost
に注意してください ディレクティブにIPアドレスまたはポートが指定されていないため、エラーが発生します。
以下は、\*:80
を追加した、前の例の修正バージョンです。 仮想ホストのディレクティブに。いつものように、\*
すべてのIPアドレスを指定するワイルドカードです。
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
httpd -S
を実行している場合 は、仮想ホストがis a NameVirtualHost
の上にリストされていることを示しています 行:
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:800 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
\*:80 is a NameVirtualHost
default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
Syntax OK
この例では、構成テストでvh2.example.com
が報告されます。 NameVirtualHost
を報告する前の構成 構成。 VirtualHostのIPアドレスまたはポートがWebサーバーのNameVirtualHost
のIPアドレスまたはポートと一致しない場合、このエラーが表示されることがあります 指令。この例では、レポートはvh2.example.com
ポート80ではなくポート800を使用します。vh2.example.com
のときに、ポート番号の入力ミスがありました 仮想ホストのリスニングポートが構成されました。その結果、Apacheはvh2.example.com
を扱います 個別のポートベースの仮想ホストとして。
httpd -S
テストコマンドは警告しません この問題については、同じサーバー上の名前ベースの仮想ホスト構成の一部でなくても、800などの任意のポートを使用するように仮想ホストを構成することが許可されているためです。
このエラーが発生した場合は、デフォルトの仮想ホスト(vh1.example.com
)のコンテンツが表示される可能性があります。 この例では)Webブラウザでサイトを表示しようとしたとき。
上記の出力を構成ファイルにマップするのに役立つように、このエラーを引き起こした仮想ホスト構成は次のとおりです。
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:800>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
httpd -S
を実行している場合 次のエラーを報告します:
Warning: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] does not exist
このエラーは、vh2.example.com
のWebサイトファイルを含むように指定されたディレクトリを示しています 仮想ホストが存在しないか、Apacheが仮想ホストにアクセスできません。同様のエラーは、仮想ホストのログファイルへのパスなど、仮想ホスト構成で指定されたファイルパスのいずれにも表示される可能性があります。
このエラーを修正するには、ディレクトリを作成したことを確認してください。作成した場合は、DocumentRoot
に間違いがないことを確認してください 指令。よくある間違いは、パスの最初のスラッシュ(/)を省略することです。スラッシュを省略すると、Apacheにパス(DocumentRoot
)を読み取るように指示されます。 この場合のパス-相対パスとして、つまり、メインのApache構成のServerRoot
からの相対パスとして パス。
次の例は、このエラーが発生する方法の1つにすぎません。 DocumentRoot
のパス 最初の仮想ホストのディレクティブはスラッシュで始まりますが、2番目のディレクティブはスラッシュではありません。
ServerRoot /etc/httpd
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot var/www/vhosts/vh2
</VirtualHost>
cURLを使用してサイトをテストする
仮想ホストの構成ファイルとhttpd -S
を確認した後 コマンドは問題を報告しません。cURLを使用してサイトにアクセスしてみてください:
curl -I www.example.com
出力は次のようになります。
HTTP/1.1 200 OK
Date: Sat, 07 May 2011 15:09:50 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Mon, 25 Apr 2011 11:07:43 GMT
ETag: "2c32e-77-4a1bc37723dc0"
Accept-Ranges: bytes
Content-Length: 119
Content-Type: text/html; charset=UTF-8
最初の行はステータスコードを示しています。 200 OK
を見たい 、例に示すように。それが表示された場合は、ブラウザでWebサーバーをテストしますが、ブラウザにキャッシュされたページが表示される可能性があることを考慮してください。
200 OK
が表示されない場合 、次の一般的なメッセージのいずれかが表示される場合があります。
-
curl: (6) Couldn't resolve host vh1.example.com
cURLがホストを見つけられないと報告した場合は、サーバーの正しいIPアドレスを指すドメインのAレコードがあることを確認してください。 digを使用してこれを行うことができます:
dig vh1.example.com
-
curl: (7) couldn't connect to host
Apache構成ファイルに必要な
Listen
が含まれていることを確認します ディレクティブとそれらがコメントアウトされていないこと。Listen 80
が必要です 少なくとも。これを確認する別の方法は、エラーログを確認することです。デフォルトのエラーログは
/var/log/httpd/error_log
にあります RedHatシステムおよび/var/log/apache2/error_log
Debianシステムで。 Apacheがリッスンするポートが指定されていない場合、Apacheが再起動を試みた後、「リッスンソケットがありません。シャットダウンします」というメッセージが表示されます。[notice] SIGHUP received. Attempting to restart no listening sockets available, shutting down Unable to open logs
-
HTTP/1.1 403 Forbidden
この応答は、要求しているページへのApacheアクセスを許可する権限が正しくないことを示しています。おそらく、ディレクトリのアクセス許可が正しくないか、ページ自体である可能性があります。
次の状況でも403応答が表示される場合があります。
- The `DocumentRoot` contains no index file—-typically named `index.html` or `index.php`. Note that the file name is case sensitive.
- The virtual host doesn't contain a `DirectoryIndex` directive specifying the default index file.
Apacheエラーログには通常、アクセス許可が正しく設定されていないディレクトリまたはファイルが表示されます。個々の仮想ホストは、構成されている場合、独自のログにエラーを書き込む可能性があるため、これらのログも確認してください。
ビジー状態のサーバーのログファイルにあるデータの量に落胆しないでください。代わりに、tailコマンドを使用して、ログの最新の10行だけを選択的に表示します。例:
tail /var/log/apache2/error\_log
tail
に指示すると、サーバーをテストしているときに、エラーログまたは任意のログに追加された新しいエントリを確認できます。 ログを「フォロー」するコマンド。例:
tail -f /var/log/httpd/error\_log
以下は、Apacheのログに表示される可能性のある一般的な権限関連の構成エラーの例です。
-
次のログエントリは、
index.html
の権限を示していますvh2.example.com
のファイル Apacheへのアクセスを拒否しています。[error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
-
次のログエントリは、
/var/www/vhosts/vh2
の権限を示しています ディレクトリがApacheの読み取り要求をブロックしています。[error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
-
次のログエントリは、Apacheが
DocumentRoot
の上のディレクトリの1つに実行または読み取り権限を持っていないことを示しています 。[error] [client 203.0.113.96] (13)Permission denied: access to / denied