GNU/Linux >> Linux の 問題 >  >> Linux

仮想ホストを使用して複数のドメインにサービスを提供

ほとんどの人は、クラウドサーバーで複数のドメインにサービスを提供しています。同じドメインの異なるドメインまたは異なるサブドメインにサービスを提供するかどうかにかかわらず、手順は同じです。この記事では、複数のドメインにサービスを提供する仮想ホストを作成する方法と、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構成ファイルに最後に変更を加えてから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
    

Linux
  1. phpMyAdminで複数のホストを追加する方法

  2. 複数のドメインをホストする方法は?

  3. SNIを使用してApacheで複数のSSL証明書をホストする

  1. Ansibleを使用したマルチパス仮想マシン

  2. Ssh –複数のホストを介したScp?

  3. 単一ホスト上の複数の glibc ライブラリ

  1. 検索を使用して複数のファイルの名前を変更するにはどうすればよいですか?

  2. Linuxサーバーでnginxを使用してサブドメインまたは複数のドメインをホストする方法

  3. CentOSで仮想ホストを設定する