5 Apache HTTP Webサービスの構成

この章では、基本的なHTTPサーバーの構成方法について説明します。

Apache HTTP Serverについて

Oracle Linuxには、Apache Software Foundationによって開発されたオープン・ソースWebサーバーであるApache HTTPサーバーが用意されています。ApacheサーバーはWebコンテンツをホストし、FirefoxなどのWebブラウザからこのコンテンツに対するリクエストに応答します。

Apache HTTPサーバーのインストール

Apache HTTPサーバーをインストールするには:

  1. 次のコマンドを入力します。

    sudo yum install httpd
  2. サーバーを起動し、システムの再起動後に起動するように構成します。

    sudo apachectl start
    sudo systemctl enable httpd
  3. 構成エラーをチェックします。

    sudo apachectl configtest
  4. HTTPサーバーがリスニングするポートへのアクセスを許可するファイアウォール・ルールを作成します。たとえば:
    sudo firewall-cmd --zone=zone --add-service=http
    sudo firewall-cmd --permanent --zone=zone --add-service=http

Apache HTTPサーバーの構成

ノート:

Apache HTTPサーバーの構成に適用した変更は、サーバーを再起動するまでは有効になりません。

sudo apachectl restart

Apache HTTPサーバーのメイン構成ファイルは/etc/httpd/conf/httpd.confです。このファイルのディレクティブを変更し、ユーザーの環境にあわせてApacheをカスタマイズできます。

次のディレクティブがあります。

Allow from client [client ...] | all

コンテンツにアクセスできるクライアントのリストを指定するか、allを指定してあらゆるクライアントにコンテンツを供給します。Orderディレクティブにより、httpdAllowディレクティブとDenyディレクティブを評価する順序が決まります。

Deny from client [client ...] | all

コンテンツにアクセスできないクライアントのリストを指定するか、allを指定してすべてのクライアントを禁止します。Orderディレクティブにより、httpdAllowディレクティブとDenyディレクティブを評価する順序が決まります。

DocumentRoot directory-path

Apacheサーバー・コンテンツの最上位レベルのディレクトリ。apacheユーザーには、ファイルの読取りアクセス権と、ディレクトリおよびそのサブディレクトリへの読取りおよび実行アクセス権が必要です。ディレクトリ・パスの最後にはスラッシュを付けないでください。

次に例を示します。

DocumentRoot /var/www/html

/var/www/htmlの下にはない別のドキュメント・ルートまたはコンテンツへのリンクを指定し、SELinuxがシステム上で強制モードで有効になっている場合、コンテンツを含むディレクトリ階層のデフォルト・ファイル・タイプをhttpd_sys_content_tに変更します。

  1. semanageコマンドを使用して、コンテンツ・ディレクトリのデフォルト・ファイル・タイプをhttpd_sys_content_tとして定義します。

    sudo /usr/sbin/semanage fcontext -a -t httpd_sys_content_t " content_dir (/.*)?"
  2. restoreconコマンドを使用して、コンテンツ・ディレクトリ階層全体にファイル・タイプを適用します。
    sudo /sbin/restorecon -R -v content_dir
ErrorLog filename | syslog[:facility]

ファイル名に設定する場合は、httpdがエラー・メッセージを送信する宛先であるServerRootに相対的にファイルを指定します。

syslogに設定する場合は、httpdがエラーをrsyslogdに送信するように指定します。facility引数で、rsyslogdファシリティを指定します。デフォルトのファシリティはlocal7です。

次に例を示します。

ErrorLog logs/error_log 
Listen [IP_address:]port

指定されたポート、またはIPアドレスとポートの組合せで着信リクエストを受け入れます。デフォルトでは、httpdサーバーは、すべてのネットワーク・インタフェースについてポート80でリクエストを受け入れます。80以外のポート番号では、サーバーに対するHTTPリクエストにポート番号を含める必要があります。

次に例を示します。

Listen 80
Listen 192.168.2.1:8080
LoadModule module path

Apache HTTPサーバーは、外部モジュール(動的共有オブジェクトまたはDSO)をロードして機能を拡張できます。module引数はDSOの名前で、filenameServerRootへのモジュールの相対パス名です。

次に例を示します。

LoadModule auth_basic_module modules/mod_auth_basic.so
Order deny,allow | allow,deny

httpdがAllowおよびDenyディレクティブを評価する順序を指定します。

たとえば、mydom.comドメインからのクライアントにのみアクセスを許可します:

Order deny,allow
Deny from all
Allow from .mydom.com

次のディレクティブでは、クライアントによるアクセスは許可されません。

Order allow,deny
Deny from all
Allow from .mydom.com
ServerName FQDN[:port]

httpdサーバーの完全修飾ドメイン名またはIPアドレス、およびサーバーがリスニングするポート(オプション)を指定します。FQDNをIPアドレスに解決する必要があります。FQDNを指定しなかった場合は、IPアドレスに対する逆引き名前参照がサーバーで実行されます。ポートを指定しなかった場合は、着信リクエストに相当するポートがサーバーで使用されます。

次に例を示します。

ServerName www.mydom.com:80
ServerRoot directory-path

httpdサーバーがその構成ファイル、エラー・ファイルおよびログ・ファイルを保持するディレクトリ階層の最上位。ディレクトリ・パスの最後にはスラッシュを付けないでください。

次に例を示します。

ServerRoot /etc/httpd 
Timeout seconds

タイムアウト・エラーを報告するまでに、httpdがネットワーク操作の終了を待機する秒数を指定します。デフォルト値は60秒です。

UserDir directory-path ... | disabled [user ...] | enabled user ...

disabledに設定すると、スペースで区切ったuser引数で特定されたユーザーは、各自のホーム・ディレクトリからコンテンツを公開できません。ユーザーを指定しないと、すべてのユーザーが禁止されます。

enabledに設定すると、スペースで区切ったuser引数で特定されたユーザーは、引数がdisabledに指定されていないかぎり、各自のホーム・ディレクトリからコンテンツを公開できます。

directory-pathは、httpdがコンテンツを公開するディレクトリの名前です。相対パスは、ユーザーのホーム・ディレクトリに対する相対パスとみなされます。複数のディレクトリ・パスを指定すると、Webページが見つかるまで各選択肢がhttpdにより順番に試みられます。directory-pathを定義しなかった場合、デフォルトは~/public_htmlとなります。ディレクトリ・パスの最後にはスラッシュを付けないでください。

次に例を示します。

UserDir disabled root guest
UserDir enabled oracle alice
UserDir www http://www.mydom.com/

rootおよびguestユーザーはコンテンツを公開できません。ServerNamewww.mydom.comに設定されたと仮定した場合、http://www.example.com/~aliceを参照すると、aliceのWebページが表示され、この場合、このページは~alice/wwwまたはhttp://www.example.com/alice (つまり、ServerRootと相対的なaliceディレクトリ)に位置している必要があります。

ノート:

ユーザーにユーザー・コンテンツの公開を許可するには、通常は<IfModule mod_userdir.c>コンテナで設定を変更することになります。

詳細は、https://httpd.apache.org/docs/current/mod/directives.htmlを参照してください。

Apache HTTPサーバーのテスト

Apache HTTPサーバーが機能していることをテストするには:

  • ローカル・システムから、http://localhostをローカル・システムのブラウザに入力します。

  • リモート・システムから、http://に続けて構成ファイル(/etc/httpd/conf/httpd.conf)に指定されているServerNameディレクティブの値をブラウザに入力します。

ブラウザにApache 2のテスト・ページが表示された場合は、サーバーが正常に機能しています。

サーバーがコンテンツを配信できることをテストするには、DocumentRootディレクティブに指定されたディレクトリ(デフォルトでは/var/www/html)に、index.htmlというHTMLファイルを作成します。ページをリロードすると、ブラウザには、このHTMLファイルがApache 2のテスト・ページにかわって表示されます。

Apacheコンテナの構成

Apacheコンテナは他のディレクティブをグループ化する特別なディレクティブであり、多くの場合、特性が異なる個別のWebディレクトリ階層を作成します。コンテナは、<type></type> (typeはコンテナ・タイプ)のXML形式のタグで区切られます。

次にコンテナ・タイプの例を示します。

<Directory directory-path>

指定されたディレクティブをdirectory-pathの下のディレクトリに適用します。次の例では、DenyAllowおよびAllowOverrideのディレクティブを/var/www/html/sandboxの下のすべてのファイルおよびディレクトリに適用します。

<Directory /var/www/html/sandbox>
  Deny from all
  Allow from 192.168.2.
  AllowOverride All
</Directory>

AllowOverrideディレクティブはDirectoryコンテナでのみ使用され、.htaccessファイルで許可されているディレクティブのクラスを指定します。(.htaccess構成ファイルには、通常、Webディレクトリのユーザー認証ディレクティブが格納されます。)ディレクティブ・クラスは、認証、クライアントのアクセス、ディレクトリの索引付けなどの側面を制御します。.htaccessファイルのすべてのディレクティブ・クラスを許可する場合はAll引数を指定し、特定のクラスのみを許可する場合はディレクティブ・クラスをスペースで区切ったリストを指定し、サーバーが.htaccessファイルを完全に無視するようにする場合はNoneを指定します。

ノート:

システムでSELinuxが有効になっており、<Directory>で指定されたファイル・システム階層が/var/www/htmlにない場合は、デフォルトのファイル・タイプを変更する必要があります。

<IfModule [!]module>

指定のモジュールがロードされた場合に、あるいは感嘆符(!)が指定されたときは指定のモジュールがロードされていない場合に、ディレクティブを適用します。

次の例は、mod_userdir.cがロードされた場合に、ユーザーによるコンテンツの公開を禁止します。

<IfModule mod_userdir.c>
  UserDir disabled
</IfModule>
<Limit method ...>

Uniform Resource Identifier (URI)の操作に対して、指定のHTTPメソッドのみ(GET、OPTIONS、POST、PUTなど)を使用するように制限します。

次の例は、HTTPのダウンロードおよびアップロードの実行にGETメソッドとPUTメソッドのみを使用するように、mydom.comのシステムを制限します。

<Limit GET PUT>
  Order deny,allow
  Deny from all
  Allow from .example.com
</Limit>

mydom.com外部のシステムでは、GETおよびPUTを使用してURIを操作できません。

<LimitExcept method ...>

Uniform Resource Identifier (URI)の操作に対して、指定のHTTPメソッドを除くすべてを制限します。

次の例は、すべてのシステムがGETおよびPOST以外のメソッドを使用できないようにします。

<LimitExcept GET POST>
  Order deny,allow
  Deny from all
</Limit>
VirtualHost IP_address:port ...

仮想ホストのコンテナを定義するディレクティブのグループを指定します。Apache仮想ホストの構成を参照してください。

ネストしたコンテナについて

次の例に、GETPOSTおよびOPTIONSを使用して/home/*/public_htmlにあるユーザー・ディレクトリを操作できるように、<Limit>および<LimitExcept>コンテナを使用してコンテナをネストする方法を示します。

<Directory /home/*/public_html>
  AllowOverride FileInfo AuthConfig Limit
  Options MultiViews Indexes SymLinksIfOwnerMatch \
  IncludesNoExec
  <Limit GET POST OPTIONS>
    Order allow,deny
    Allow from all
  </Limit>
  <LimitExcept GET POST OPTIONS>
    Order deny,allow
    Deny from all
  </LimitExcept>
</Directory>

この例では、次のディレクティブ・クラスがAllowOverrideディレクティブで指定されています。

AuthConfig

認証ディレクティブの使用を許可します。

FileInfo

ドキュメント・タイプを制御するディレクティブの使用を許可します。

Limit

ホスト・アクセスを制御するディレクティブの使用を許可します。

Optionsディレクティブは、ディレクトリ階層に対するサーバーの機能を制御します。たとえば:

FollowSymLinks

ディレクトリ階層でシンボリック・リンクを追跡します。

Includes

サーバーサイド・インクルードを許可します。

IncludesNoExec

#exec cmdおよび#exec cgiのサーバーサイド・インクルードの実行を防止します。

Indexes

DirectoryIndexディレクティブが設定されていない場合は、Webディレクトリの一覧を生成します。

MultiViews

拡張子が異なる複数のバージョンのファイルがある場合は、MIMEに基づいてクライアントの要件に最も適したファイルを使用するようにサーバーで判断することを許可します。

SymLinksIfOwnerMatch

シンボリック・リンクの参照先ファイルまたはディレクトリの所有者がシンボリック・リンクの所有者と同じ場合は、サーバーによるシンボリック・リンクの追跡を許可します。

詳細は、https://httpd.apache.org/docs/current/mod/directives.htmlを参照してください。

Apache仮想ホストの構成

Apache HTTPサーバーは仮想ホストをサポートしており、これは、同じホスト・マシンに対応する複数のIPアドレスまたはホスト名に転送されたリクエストに応答できることを意味します。各仮想ホストは、異なるコンテンツを提供したり、異なる動作をするように構成できます。

仮想ホストは次の2つの方法で構成できます。

  • IPベースの仮想ホスト(host-by-IP)

    各仮想ホストには、IPアドレスとポートの独自の組合せがあります。サーバーは、IPアドレスに応答してホスト名を解決します。SSL (Secure Sockets Layer)プロトコルでの制限があるため、サーバーのHTTPSリクエストに対してHost-by-IPが必要です。

  • 名前ベースの仮想ホスト(host-by-name)

    すべての仮想ホストが1つの共通IPアドレスを共有します。Apacheは、リクエスト内のホスト名を、構成ファイル内の仮想ホストのServerNameおよびServerAliasディレクティブにマップして、リクエストに応答します。

仮想ホストを構成するには、<VirtualHost hostname>コンテナを使用します。また、構成した仮想ホスト間で、提供されたすべてのコンテンツを分割する必要があります。

次に、2つの仮想ホストに対する単純な名前ベース構成の例を示します。

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName websvr1.mydom.com
  ServerAlias www.mydom-1.com
  DocumentRoot /var/www/http/websvr1
  ErrorLog websvr1.error_log
</VirtualHost>

<VirtualHost *:80>
  ServerName websvr2.mydom.com
  ServerAlias www.mydom-2.com
  DocumentRoot /var/www/http/sebsvr2
  ErrorLog websvr2.error_log
</VirtualHost> 

詳細は、https://httpd.apache.org/docs/2.2/vhosts/を参照してください。