(0)目次&概説
(1) 記事の目的
(1-1) 目的
(1-2) 前提条件
(2) Apacheの仮想ホストとは?
(3) IPベース仮想ホスト
(3-1) 方式の概要
(3-2) 設定方法
(3-2-1) リッスンポートの設定
(3-2-2) 仮想ホストの設定
(3-2-3) コンテンツの作成/配置
(3-2-4) ファイアウォール設定
(3-2-5) 疎通テスト
(4) 名前ベース仮想ホスト
(4-1) 方式の概要
(4-2) 設定方法
(4-2-1) リッスンポートの設定
(4-2-2) 仮想ホストの設定
(4-2-3) コンテンツの作成/配置
(4-2-4) ファイアウォール設定
(4-2-5) 疎通テスト
(5) 参考:Apacheのディレクトリ構造
(1) 記事の目的
1台のサーバにて複数のウェブサイトをホストする際に利用される技術であるApacheの「仮想ホスト」についての基礎知識や基本設定方法について理解すること。
(2) Apacheの仮想ホストとは?
・単一サーバ(1台)で複数ドメイン(≒複数ウェブサイト)をホストするためのApacheの機能を「仮想ホスト」と呼んでいます。
・この機能によりサーバの管理・運用負荷などを削減する事が可能です。
・”Virtual Host”はApacheの用語で、競合技術のNginxなどでは「Server Blocks」と呼ばれています。
・仮想ホストには「IPベース」と「名前ベース」の2種類の方式があり、それぞれの内容について3章と4章にて記述します。
(3) IPベース仮想ホスト
(3-1) 方式の概要
・1台のApache物理サーバに複数のIPアドレスを割り当てて、IPアドレス毎に異なるドメインを処理を担当します。
(図311)
・物理サーバに複数のIPアドレスを持たせる方法としては「方法①:物理サーバは2つのイーサネットカードを持ち、それぞれにIPアドレスが割り振られている(物理的に複数)」か「方法②:IPエイリアシング等の手法を用いて仮想的に複数のIPアドレスを持つ(仮想的に複数)」などして、IP毎に異なるWebサイトをホストします。
(参考)IPエイリアシング
・一つのホストで複数のIPを持つためには「IPエイリアシング」という技術を使います。
・この技術を用いると1つのネットワークインタフェースに複数のIPアドレスを紐付ける事ができます。
・特にNIC(LANを指すポートが付いてる部品)が一つしか無い場合に効力を発揮します。
(3-2) 設定方法
本来はIPエイリアシング(IP Aliasing) 等で物理サーバに対して複数のIPアドレスを付与しますが、今回はもう少し簡易的な方式で「IPアドレス×ポート」の単位で一意となるようにします。つまり、IPアドレスは同じだが異なるポートに対して、それぞれ異なる仮想ホスト(≒ウェブサイト)を割り当てる方法を試した結果をご紹介します。
今回の構造は(図320)のようになっており、1つのIPアドレスと2つのポート(8080、8081)で2通りの組み合わせを作り、それぞれに対して別のウェブサイトをホストさせています。
(図320)
(3-2-1) リッスンポートの設定
Apacheの設定ファイルにてリッスンするポートを設定します。今回は8080、8081ポートを利用するため、そのための記載を追記します。
①設定ファイル(httpd.conf)を編集
cd /etc/httpd/conf/ vi httpd.conf
(図321)①
※下図は既にcd後にpwdで現在ディレクトリを確認しており、上記と若干異なります。
②設定を追記
Listen 8080 Listen 8081
(図321)②
(3-2-2) 仮想ホストの設定
仮想ホストを作るためには「/etc/httpd/conf.d/」ディレクトリ配下に「.conf」の拡張子を持った任意の名前のconfファイルを作成し、そこに仮想ホストの情報を追記していきます。
ちなみに、デフォルトではconfファイルは「/etc/httpd/conf.d/」に配置する設定になっていますが、これは「/etc/httpd/conf/httpd.conf」内でそこのディレクトリに置いた設定ファイルを読み込むよう定義していて、そこに別のパスも読み込むよう設定を追記すればご自身のカスタムディレクトリにconfファイルを配置して有効化させる事もできます。
①viエディタで設定ファイル編集
cd /etc/httpd/conf.d/ vi [Your File Name].conf
(図322)①
※下図は既にcd後にpwdで現在ディレクトリを確認しており、上記と若干異なります。
②仮想ホストの設定を追記
<VirtualHost *:8080> ServerName rainbow-planet-t1.xyz DocumentRoot /var/www/rainbow-planet-t1.xyz/ ServerAdmin xxxxxx@gmail.com ErrorLog /var/log/httpd/rainbow-planet-t1-error_log CustomLog /var/log/httpd/rainbow-planet-t1-access_log combined </VirtualHost> <Directory /var/www/rainbow-planet-t1.xyz> Require all granted </Directory> <VirtualHost *:8081> ServerName rainbow-planet-t2.xyz DocumentRoot /var/www/rainbow-planet-t2.xyz/ ServerAdmin xxxxxx@gmail.com ErrorLog /var/log/httpd/rainbow-planet-t2-error_log CustomLog /var/log/httpd/rainbow-planet-t2-access_log combined </VirtualHost> <Directory /var/www/rainbow-planet-t2.xyz> Require all granted </Directory>
(図322)②
(3-2-3) コンテンツの作成/配置
実際のコンテンツ(フォルダ構成やページのhtmlファイル)を作成していきます。
①ウェブサイトのROOTフォルダの作成
作成するディレクトリは「仮想ホストファイル」にて設定した「DocumentRoot」のパスを指定します。
(構文)
mkdir [DocumentRoot Directory]
(例)1つ目の仮想ホストのROOTディレクトリを作ります。
mkdir /var/www/rainbow-planet-t1.xyz/
(図323)①
②htmlファイルの配置
ウェブサイトの最初のページとなるindex.htmlを作成し、そこに簡単なHTMLを記述します。
(図323)②
・ウェブサイト①
・ウェブサイト②
③パーミッション設定/設定反映
作成したディレクトリ配下に対して権限を付与し「apachectl restart」コマンドで設定を反映させます。
(図323)③
(3-2-4) ファイアウォール設定
今回はポート8080・8081を利用しているため、そのポートの外部アクセスを許可する設定に変更する必要があります。
①ポートのアクセス許可設定
$ sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent $ sudo firewall-cmd --zone=public --add-port=8081/tcp --permanent
②設定反映
$ sudo firewall-cmd --reload
(図324)
(3-2-5) 疎通テスト
ブラウザに「http://[IP Address]:[Port]」と入力して、疎通確認を行います。もし正常に処理されると、作成した「index.html」の内容が表示されます。ポート「8080」と「8081」とで異なるページが表示されれば疎通成功です。
(図325)
(4) 名前ベース仮想ホスト
(4-1) 方式の概要
・「名前ベース」は「IP1つ」:「ドメイン複数」が紐づきます。
・実現方法のポイントとして、クライアントのHTTPリクエストヘッダに含まれる「ホスト名」の情報を利用する事で、複数ドメインで1つのIPを共有する事を可能にしています(どのドメインへの要求かを判断する)
・IPv4のアドレスが枯渇している背景もあり、複数のIPアドレスを使うIPベースよりも、一つのIPで複数ウェブサイトをホスト出来る名前ベースの方が、主流として利用されています。
・Apacheがリクエストを受けると、マッチする仮想ホストを探しますが、もしマッチが無い場合は「最初に定義された”VirtualHost”をフォールバック(=異常時に制限付き機能に切り替え)として用います
・「名前ベース」のメリットとして同じIPアドレスで複数のWebサイトを運営できる点です。
(図411)
(4-2) 設定方法
今回は2つのドメイン「rainbow-planet-t1.xyz」と「rainbow-planet-t2.xyz」を用意し、それぞれが異なるウェブサイトをホストする様に設定します。
(4-2-1) リッスンポートの設定
⇒「不要」
(今回はデフォルトの80番を複数サイトで共有するため、ポート関連の設定は不要)
(4-2-2) 仮想ホストの設定
仮想ホストを作るためには「/etc/httpd/conf.d/」ディレクトリ配下に「.conf」の拡張子を持った任意の名前のconfファイルを作成し、そこに仮想ホストの情報を追記していきます。
IPベースの時は仮想ホスト1号と2号とでポート番号が異なる設定でしたが、今回は両方とも「*:80」で待ち受けるため、1つの「IP×ドメイン」の組合せに対してドメインが2つ紐付く形になっています。
①viエディタで設定ファイル編集
cd /etc/httpd/conf.d/ vi [Your File Name].conf
(図422)①
②仮想ホストの設定を追記
<VirtualHost *:80> ServerName rainbow-planet-t1.xyz DocumentRoot /var/www/rainbow-planet-t1.xyz/ ServerAdmin xxxxxx@gmail.com ErrorLog /var/log/httpd/rainbow-planet-t1-error_log CustomLog /var/log/httpd/rainbow-planet-t1-access_log combined </VirtualHost> <Directory /var/www/rainbow-planet-t1.xyz> Require all granted </Directory> <VirtualHost *:80> ServerName rainbow-planet-t2.xyz DocumentRoot /var/www/rainbow-planet-t2.xyz/ ServerAdmin xxxxxx@gmail.com ErrorLog /var/log/httpd/rainbow-planet-t2-error_log CustomLog /var/log/httpd/rainbow-planet-t2-access_log combined </VirtualHost> <Directory /var/www/rainbow-planet-t2.xyz> Require all granted </Directory>
(4-2-3) コンテンツの作成/配置
⇒IPベースと同じ手順
※「(3-2-3) コンテンツの作成/配置」を参照
(4-2-4) ファイアウォール設定
⇒「不要」
(今回はデフォルトの80番を複数サイトで共有するため、ポート関連の設定は不要)
(4-2-5) 疎通テスト
ブラウザに「http://[Domain Name]」と入力して、疎通確認を行います。もし正常に処理されると、作成した「index.html」の内容が表示されます。2つのドメインで異なるページが表示されれば疎通成功です。
(5) 参考:Apacheのディレクトリ構造
Apacheの主要なディレクトリ構造です。
ディレクトリ | 説明 |
/ | |
―∟etc | – |
――∟httpd | – |
―――∟conf | – |
――――∟httpd.conf | Apache設定ファイルで大きく分けて3つの大項目に関する設定が行えます。 ・Section 1:グローバル環境 Apache全般に影響する設定項目のセクション。例えば同時接続数の設定や各種設定ファイルの格納場所など。 ・Section 2:メインサーバ設定 メインサーバに関する設定のセクションです。メインサーバは仮想サーバが処理するリクエスト以外のものを全て処理するサーバです。またメインサーバの設定値は仮想サーバを作る時のデフォルト値にもなります。 ・Section 3:仮想ホスト設定 仮想ホストに関する設定です。 |
―――∟conf.d | Apacheの個別設定ファイルが格納されています。リバースプロキシや仮想ホストなど、用途に応じてご自身で命名したファイルを配備して設定を行います。 (例) ①r_proxy.conf リバースプロキシの設定用ファイルです。 ②welcome.conf デフォルトページが存在しない場合のウェルカムページの設定用ファイル。 ③[YourIP].conf 仮想ホストの設定用ファイルです。 |
―――∟conf.modules.d | ・ロードするモジュールを定義したファイル(例:00-proxy.conf)等が格納されている |
――∟logrotate.d | ・ログファイル管理に関する設定ファイルが格納されています。 ・ログの最小化やバックアップ、新規作成などを行います。 |
―――∟httpd | ・logrotate.dの中の「httpd」がApache用のログファイル設定になります。 (例) /var/log/httpd/*log { missingok notifempty sharedscripts delaycompress postrotate /sbin/service httpd reload > /dev/null 2>/dev/null || true endscript } |
―∟var | – |
――∟log | – |
―――∟httpd | ・ログの出力先ディレクトリです。 |
――∟www | ・各コンテンツのROOTディレクトリ(コンテンツのトップディレクトリ)のフォルダを作成、配置します |
―――∟cgi-bin | ・cgiプログラム用 |
―――∟html | ・htmlファイルの格納用ディレクトリ |
凄く些細な話かもしれませんが、(図322)①のlsの結果部分のIPを消し忘れていませんか?
貴重なフィードバックを頂きありがとうございます。また確認およびご返信が遅れ申し訳ございませんでした。
IPアドレスが出てるの完全に見落としておりました、ありがとうございます。図のマスキングを修正して再アップ致しました。