Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.6

24 Apache HTTP サーバ Edit source

概要

https://www.netcraft.com/https://w3techs.com/ の調査によると、 Apache HTTP サーバ (Apache) は世界で最も有名な Web サーバのうちの 1 つです。この Web サーバは Apache Software Foundation ( https://www.apache.org/ ) によって開発されているソフトウエアで、ほとんどのオペレーティングシステムで動作します。 openSUSE® Leap では Apache バージョン 2.4 が同梱されています。本章では Apache のインストールから設定/運用のほか、 SSL や CGI などの追加モジュールの設定方法やトラブルシューティングまでの範囲を説明しています。

24.1 クイックスタート Edit source

本章では、 Apache を簡単に設定して起動するまでの手順を説明しています。なお、 Apache のインストールと設定は、 root で行わなければなりません。

24.1.1 要件 Edit source

Apache Web サーバを設定しようとする前に、まずは下記の要件全てを満たしていることをご確認ください:

  1. 対象となるマシンのネットワークが正しく設定されている必要があります。ネットワークの設定について、詳しくは 第13章 「ネットワークの基礎 をお読みください。

  2. 対象となるマシンのシステム時刻が、タイムサーバとの間で正しく同期している必要があります。 HTTP プロトコルでは、時刻をベースにした仕組みを利用しているものがあるためです。詳しくは 第18章 「NTP を利用した時刻同期 をお読みください。

  3. 最新のセキュリティ更新を適用しておく必要があります。何か不安な点があれば、念のため YaST オンライン更新を実行しておいてください。

  4. 既定の Web サーバのポート ( 80 ) をファイアウオールで開く必要があります。ファイアウオールでポートを開くには、 firewalldhttp サービスを公開ゾーンで許可する必要があります。詳しくは 23.4.1項 「コマンドラインからのファイアウオール設定」 をお読みください。

24.1.2 インストール Edit source

openSUSE Leap では、 Apache は既定ではインストールされません。インストールを行い、標準的な 出荷時設定 で開始したい場合は、下記の手順を実施します:

手順 24.1: 既定の設定による Apache のインストール
  1. YaST を起動して、 ソフトウエア › ソフトウエア管理 を選択します。

  2. 表示 › パターン を選択し、 Web および LAMP サーバ にチェックを入れます。

  3. あとは 了解 を押して、インストール処理を完了します。依存関係のパッケージ一覧が表示されますので、こちらでも 続行 を押してください。

24.1.3 起動 Edit source

Apache はシステムの起動時に自動的に開始することができるほか、手作業で開始することもできます。

Apache をシステムの起動時に自動的に開始したい場合は、 multi-user.targetgraphical.target のターゲット内に Apache を追加します。具体的には、下記のコマンドを実行します:

> sudo systemctl enable apache2.service

openSUSE Leap における systemd のターゲットに関する説明や、 YaST の サービスマネージャ の説明について、詳しくは 10.4項 「YaST を利用したサービスの管理」 をお読みください。

シェルを利用して Apache を手作業で開始したい場合は、 systemctl start apache2.service を実行します。

手順 24.2: Apache が動作しているかどうかの確認

Apache の開始時に何もエラーメッセージが表示されない場合は、 Web サーバが問題なく起動して動作していることを表しています。動作確認を行うには、下記の手順で行います:

  1. ブラウザを起動して http://localhost/ を開きます。

    Apache が開始されていて動作していれば、 It works! というメッセージが表示されるはずです。

  2. このようなページが表示されない場合は、 24.9項 「トラブルシューティング」 をご覧ください。

Web サーバが動作していることを確認できたら、あとは必要な文書を追加したり、必要に応じて設定を調整したり、モジュールを追加して機能を追加したりすることができるようになります。

24.2 Apache の設定 Edit source

openSUSE Leap では 2 種類の設定方法を用意しています:

手作業で設定を行うと、より細かいところまで設定を行うことができますが、 YaST GUI ほどの利便性はありません。

重要
重要: 設定変更後の Apache の再読み込みもしくは再起動について

設定を変更した場合は、設定を反映させるために Apache の再読み込み (場合によっては再起動) が必要となります。手作業で再読み込みを行いたい場合は、 systemctl reload apache2.service を実行してください。また、再起動は 24.3項 「Apache の開始と停止」 に示されているいずれかの方法を実行してください。

YaST で Apache を設定した場合は、 HTTP サービス有効 に設定されていると、再読み込みを自動的に実施するようになっています。詳しくは 24.2.3.2項 「HTTP サーバの設定」 をお読みください。

24.2.1 Apache の設定ファイル Edit source

本章では、 Apache の設定ファイルに関する概要説明を行っています。設定にあたって YaST を使用している場合は、これらのファイルを直接編集する必要はありません。しかしながら、あとから手作業で編集するように切り替える場合に備えて、あらかじめいくつかの情報を知っておくと良いでしょう。

Apache の設定ファイルは、下記の 2 箇所に配置されています:

24.2.1.1 /etc/sysconfig/apache2 Edit source

/etc/sysconfig/apache2 では、 Apache 全体のグローバル設定を行います。たとえば読み込むべきモジュールや取り込むべき追加の設定ファイルや、サーバを起動する際のフラグやコマンドラインに追加すべき設定などがあります。このファイル内での全ての設定オプションは、設定ファイル内にコメントで説明しているため、ここでは詳しく説明しません。一般的な Web サーバであれば、 /etc/sysconfig/apache2 を設定するだけで、要件に十分対応することができるはずです。

24.2.1.2 /etc/apache2/ Edit source

/etc/apache2/ には Apache に対する全ての設定ファイルが含まれています。下記ではそれぞれのファイルの用途を説明しています。各ファイルにはいくつかの設定オプション (ディレクティブ と呼びます) が用意されていますが、同様にこれらのファイルのコメント内に説明が書かれています。そのため、こちらもここでは詳しく説明しません。

Apache の設定ファイルは、下記のような構成になっています:

/etc/apache2/
     |
     |- charset.conv
     |- conf.d/
     |   |
     |   |- *.conf
     |
     |- default-server.conf
     |- errors.conf
     |- global.conf
     |- httpd.conf
     |- listen.conf
     |- loadmodule.conf
     |- magic
     |- mime.types
     |- mod_*.conf
     |- protocols.conf
     |- server-tuning.conf
     |- ssl-global.conf
     |- ssl.*
     |- sysconfig.d
     |   |
     |   |- global.conf
     |   |- include.conf
     |   |- loadmodule.conf . .
     |
     |- uid.conf
     |- vhosts.d
     |   |- *.conf
/etc/apache2/ 内の Apache 設定ファイル
charset.conv

様々な言語でどの文字セットを使用するのかを指定しています。このファイルについては編集してはなりません。

conf.d/*.conf

他のモジュールによって追加された設定ファイルが保存されます。これらの設定ファイルは、必要に応じて仮想ホストの設定ファイルから取り込むことができます。使用例について、詳しくは vhosts.d/vhost.template をお読みください。また、これを行うことで、それぞれの仮想ホストに対して別々のモジュールセットを提供することができるようになります。

default-server.conf

適切な既定値が設定された、全ての仮想ホスト向けのグローバル設定です。ここに書かれている値を書き換えるのではなく、仮想ホストの設定ファイル内で値を指定して変更するようにしてください。

errors.conf

Apache のエラー応答方法を定義しています。全ての仮想ホストに対してエラーメッセージをカスタマイズしたい場合は、このファイルを編集してください。それぞれの仮想ホストで別々のエラーメッセージを設定したい場合は、それぞれの仮想ホストの設定内で設定を行ってください。

global.conf

Web サーバのメインプロセスに対する一般的な設定を記述するファイルです。アクセスパスやエラーログ、ログレベルなどの設定が含まれています。

httpd.conf

Apache のメインの設定ファイルです。このファイルを変更することは避けてください。主にステートメントとグローバル設定が含まれています。設定を変更したい場合は、対応する設定ファイル内で設定を行ってください。また、ホスト固有の設定 (たとえばドキュメントルートなど) を行いたい場合は、仮想ホストの設定で行ってください。

listen.conf

Apache がどの IP アドレスやポートで待ち受けるかを設定するファイルです。名前ベースの仮想ホストについても、ここで設定を行います。詳しくは 24.2.2.1.1項 「名前ベースの仮想ホスト」 をお読みください。

magic

Apache が未知のファイルに対して MIME タイプを自動判別する際に使用する、 mime_magic モジュール向けのデータファイルです。このファイルを変更してはなりません。

mime.types

システム側で既知の MIME タイプを一覧で示しているファイルです (/etc/mime.types へのリンクになっています) 。このファイルを変更してはなりません。ここに書かれていない MIME タイプを追加したい場合は、 mod_mime-defaults.conf ファイルに記述してください。

mod_*.conf

既定でインストールされるモジュール向けの設定ファイルです。詳しくは 24.4項 「モジュールのインストール/有効化/設定」 をお読みください。なお、オプションモジュール向けの設定ファイルは、 conf.d ディレクトリ内に存在しています。

protocols.conf

HTTP2 でページを提供するための設定ディレクティブが含まれるファイルです。

server-tuning.conf

様々な MPM (詳しくは 24.4.4項 「マルチプロセッシングモジュール (MPM)」 をお読みください) に対する設定ディレクティブと、 Apache の性能を制御するための一般的な設定オプションが含まれています。このファイル内の設定を変更するにあたっては、お使いの Web サーバで十分なテストを行ってください。

ssl-global.conf および ssl.*

SSL の全体設定と SSL の証明書ファイルが含まれています。詳しくは 24.6項 「SSL を利用した暗号化機能付き Web サーバの設定」 をお読みください。

sysconfig.d/*.conf

/etc/sysconfig/apache2 から自動生成された設定ファイルです。これらのファイルについては変更せず、 /etc/sysconfig/apache2 を変更して対応してください。また、このディレクトリには他の設定ファイルを配置しないでください。

uid.conf

Apache を動作させる際のユーザ ID とグループ ID を指定しています。このファイルについても変更してはなりません。

vhosts.d/*.conf

仮想ホストの設定は、この形式で保存する必要があります。このディレクトリ内には、 SSL ありの場合と無しの場合に対応する、仮想ホストの設定テンプレート (雛形) が用意されています。また、 Apache の設定ファイルとして自動的に取り込むには、ファイル名の末尾が .conf で終わっていなければなりません。詳しくは 24.2.2.1項 「仮想ホストの設定」 をお読みください。

24.2.2 Apache の手作業での設定 Edit source

Apache を手作業で設定するにあたっては、純粋なテキストファイルで書かれている設定ファイルを root で編集する必要があります。

24.2.2.1 仮想ホストの設定 Edit source

Apache における 仮想ホスト とは、同一の物理マシン内で複数の統一資源識別子 (URI) を賄う仕組みです。たとえば www.example.com や www.example.net などの異なるドメイン名の Web サーバを、 1 台の物理マシン内にある 1 つの Web サーバで提供することができます。

仮想ホストの使用は、管理費用の削減 (管理すべき Web サーバを 1 台にまとめることができる) やハードウエア費用の削減 (それぞれのドメインに対して別々の専用サーバを用意する必要が無くなる) などの効果がある実践的な方法です。仮想ホストは名前 (ドメイン名, ホスト名) ベースのほか、 IP ベースやポートベースでも設定することができます。

設定済みの仮想ホストを一覧表示したい場合は、 apache2ctl -S を実行します。これにより、既定のサーバと全ての仮想ホストが一覧表示することができるほか、待ち受ける IP アドレスとポートも表示することができます。これに加えて、それぞれの仮想ホストが指定されている設定ファイル内の場所も表示することができます。

仮想ホストは 24.2.3.1.4項 「仮想ホスト」 で説明しているとおり YaST で設定することができるほか、設定ファイルを直接編集して設定することもできます。既定では、 openSUSE Leap 内の Apache は /etc/apache2/vhosts.d/ ディレクトリ内にある 1 つのファイルで 1 つの仮想ホストを設定します。また、 Apache の設定ファイルとして自動的に取り込むには、ファイル名の末尾が .conf で終わっていなければなりません。また、このディレクトリ内には、仮想ホストを設定するためのテンプレート (雛形) も用意されています。 SSL 無しの場合は vhost.template を、 SSL ありの場合は vhost-ssl.template をご覧ください。

ヒント
ヒント: 仮想ホストの作成について

お使いの Web サーバに 1 つのドメインしか存在しないような場合であっても、仮想ホストの設定ファイルを作成しておくことをお勧めします。これにより、ドメイン固有の設定を 1 つのファイルにまとめることができるだけでなく、仮想ホストの設定ファイルを移動したり削除したり名前変更したりするだけで、容易に元の設定に戻すことができるようになるためです。複数のドメインが存在する場合も同じ理由により、それぞれの仮想ホストに対してそれぞれ設定ファイルを個別に作成することをお勧めします。

名前ベースの仮想ホストを使用する場合は、どの仮想ホストの設定にも該当しなかった場合に備えて、その他のドメインの場合 (既定の仮想ホスト) の設定ファイルを作成しておくことをお勧めします。 Apache では、設定ファイルの中で最初に読み込まれる仮想ホストが既定の仮想ホストに設定されますが、読み込みの順序はファイル名で判断される仕組みになっていますので、たとえばファイル名の最初に ( _ ) 文字を入れるなど (例: _default_vhost.conf) して、最初に読み込まれるようにすると良いでしょう。

<VirtualHost> から </VirtualHost> までのブロックには、特定のドメイン (仮想ホスト) にのみ適用される設定を記述します。 Apache が設定済みの仮想ホストに対する要求を受け取ると、対応するセクション内に書かれた設定を利用して要求を処理します。仮想ホストのブロックには、ほとんど全てのディレクティブを記述することができます。 Apache の設定ディレクティブについて、詳しくは https://httpd.apache.org/docs/2.4/mod/quickreference.html をお読みください。

24.2.2.1.1 名前ベースの仮想ホスト Edit source

名前ベースの仮想ホストを使用すると、複数の Web サイトを 1 つの IP アドレスで提供できるようになります。 Apache では、クライアントが送信する HTTP ヘッダ内の Host フィールドを、それぞれの仮想ホスト設定の ServerName と比較して、一致する仮想ホストを使用するようになっています。該当する ServerName が見つからない場合は、最初に設定された仮想ホストを既定で使用するようになっています。

<VirtualHost> ブロックを作成するにあたって最初にやるべきことは、提供する名前ベースの仮想ホストの名前設定です。それぞれの <VirtualHost> ブロック内に ServerName ディレクティブを指定してドメイン名を指定し、そのドメイン名にアクセスがあった場合に、どのディレクトリからファイルを提供するのかを DocumentRoot ディレクティブで指定します。

例 24.1: 名前ベースの仮想ホスト (VirtualHost) の設定例
<VirtualHost *:80>
# 最初に記述された仮想ホストが既定のホストになります
ServerName www.example.com
ServerAlias example.com
DocumentRoot /srv/www/htdocs/domain
</VirtualHost>

<VirtualHost *:80>
ServerName other.example.com
DocumentRoot /srv/www/htdocs/otherdomain
</VirtualHost>

名前ベースの仮想ホストを設定する場合、開く側の VirtualHost タグには IP アドレス (もしくは完全修飾ドメイン名) をパラメータとして指定します。ポート番号は指定しても指定していなくてもかまいません。

なお、 IP アドレスの代わりにワイルドカード * を指定することもできます。 IPv6 アドレスを指定する場合、アドレスは角括弧で括らなければなりません。

例 24.2: 名前ベースの仮想ホスト (VirtualHost) の設定
<VirtualHost 192.168.3.100:80>
  ...
</VirtualHost>

<VirtualHost 192.168.3.100>
  ...
</VirtualHost>

<VirtualHost *:80>
  ...
</VirtualHost>

<VirtualHost *>
  ...
</VirtualHost>

<VirtualHost [2002:c0a8:364::]>
  ...
</VirtualHost>
24.2.2.1.2 IP ベースの仮想ホスト Edit source

IP ベースの仮想ホストを設定するにあたっては、マシンに対して複数の IP アドレスを設定しておかなければなりません。 IP ベースの仮想ホストでも、 Apache は 1 つのインスタンスで複数のドメインに対応することができます (それぞれ異なる IP アドレスに対応する必要があります) 。

言い換えると、 IP ベースの仮想ホストを使用するにあたっては、物理サーバ側に仮想ホストの数と同じだけの IP アドレスを設定する必要があります。ただし、ネットワークカードについては、仮想ホストの数と同じだけ存在する必要はありません。 1 つのネットワークカードに複数の IP アドレスを設定すれば十分です。

下記の例では、 192.168.3.100 の IP アドレスを持つマシンで Apache を動作させ、追加で設定した 2 つの IP アドレスを利用して 192.168.3.101192.168.3.102 のドメインを動作させています。それぞれの仮想ホストに対して、別々の VirtualHost を指定していることに注意してください。

例 24.3: IP ベースの仮想ホスト (VirtualHost) の設定
<VirtualHost 192.168.3.101>
  ...
</VirtualHost>

<VirtualHost 192.168.3.102>
  ...
</VirtualHost>

なお、この例では VirtualHost ディレクティブで 192.168.3.100 の IP アドレスを設定していません。 Listen ディレクティブで 192.168.3.100 の IP アドレスに対するアクセスを受け入れるように設定している場合は、 192.168.3.100 向けの仮想ホストの設定も必要となります。設定を行わない場合は、既定のサーバ設定 ( /etc/apache2/default-server.conf ) が適用されます。

24.2.2.1.3 基本的な仮想ホストの設定 Edit source

仮想ホストを設定するにあたっては、少なくともそれぞれの仮想ホストの設定内に下記のディレクティブを設定する必要があります。それ以外のオプションについては /etc/apache2/vhosts.d/vhost.template をお読みください。

ServerName

その仮想ホストに対応する完全修飾ドメイン名を指定します。

DocumentRoot

その仮想ホストが提供すべきファイルのあるディレクトリパスを指定します。また、セキュリティ上の理由から、既定ではファイルシステム全体へのアクセスが禁止されていますので、 Directory コンテナを利用して、ディレクトリに対するアクセスを許可しなければなりません。

ServerAdmin

サーバ管理者の電子メールアドレスを指定します。このアドレスはたとえば、 Apache がエラーページを表示する際などに使用されます。

ErrorLog

この仮想ホストに対するエラーログファイルを指定します。各仮想ホストに対して、それぞれ別々のエラーログファイルを用意する必要はありませんが、エラーへの対応を容易にする目的から、それぞれ別々にしておくことをお勧めします。なお、 Apache のログファイルの既定ディレクトリは、 /var/log/apache2/ になっています。

CustomLog

この仮想ホストに対するアクセスログファイルを指定します。各仮想ホストに対して、それぞれ別々のアクセスログを用意する必要はありませんが、それぞれの仮想ホストに対するアクセス解析を容易にする目的から、それぞれ別々にしておくことをお勧めします。なお、 Apache のログファイルの既定ディレクトリは、 /var/log/apache2/ になっています。

上述のとおり、ファイルシステム全体に対するアクセスは、セキュリティ上の理由から、規定で禁止されるようになっています。そのため、 Apache がファイルを提供するディレクトリに対しては、明示的に指定して許可を与える必要があります。たとえば DocumentRoot の場合は、下記のように設定します:

<Directory "/srv/www/www.example.com/htdocs">
  Require all granted
</Directory>
注記
注記: Require all granted

Apache の以前のバージョンでは、 Require all granted と同じ意味を持つ設定は下記のとおりです:

Order allow,deny
Allow from all

この古い書式は、 mod_access_compat モジュールを読み込むことによって、現在も使用することができます。

これらを組み合わせると、完全な設定ファイルは下記のようになります:

例 24.4: 基本的な VirtualHost の設定
<VirtualHost 192.168.3.100>
  ServerName www.example.com
  DocumentRoot /srv/www/www.example.com/htdocs
  ServerAdmin webmaster@example.com
  ErrorLog /var/log/apache2/www.example.com_log
  CustomLog /var/log/apache2/www.example.com-access_log common
  <Directory "/srv/www/www.example.com/htdocs">
  Require all granted
  </Directory>
</VirtualHost>

24.2.3 YaST による Apache の設定 Edit source

YaST を利用して Web サーバを管理するには、 YaST を起動して ネットワークサービス › HTTP サーバ と選択していきます。初めてモジュールを起動した場合は HTTP サーバウイザード が起動し、サーバの管理に関わるいくつかの基本設定を行うことになります。ウイザードを完了すると、 HTTP サーバの設定 ダイアログが表示されるようになり、これ以降は、 HTTP サーバ モジュールを起動すると、このダイアログが表示されるようになります。詳しくは 24.2.3.2項 「HTTP サーバの設定」 をお読みください。

24.2.3.1 HTTP サーバウイザード Edit source

HTTP サーバウイザードは 5 つのステップから構成されています。ダイアログの最後のステップでは、熟練者向け設定モードに入ることができますので、ここからさらに細かい設定を行うことができます。

24.2.3.1.1 ネットワークデバイスの選択 Edit source

ここでは、 Apache がリクエストを待ち受けるネットワークインターフェイスとポートを指定します。ここでは既存のネットワークインターフェイスと IP アドレスの組み合わせのうち、任意のものを選択することができます。なお、ポートについては、他のサービスが利用していないことを前提に、任意のポート (いわゆる well-known ポートや registered ポート、もしくは動的なポートや独自のポートなど) を設定することができます。既定では全てのネットワークインターフェイス (IP アドレス) に対して、ポート 80 で待ち受けるようになっています。

Web サーバが待ち受けるポートに対して、ファイアウオールでポートを開きたい場合は、 ファイアウオールでポートを開く を選択します。これは LAN や WAN のほか、インターネットから Web サーバへのアクセスを受け付ける際に必要な設定です。ポートを閉じたままにしておいた場合は Web サーバ自身からしかアクセスできなくなりますので、テスト用途にのみ有用です。また、複数のネットワークインターフェイスを設定している場合は、 ファイアウオールの詳細 を押して、どのネットワークインターフェイスを利用してポートを開くのかを選択することができます。

次へ を押すと設定を続けることができます。

24.2.3.1.2 モジュール Edit source

モジュール 設定オプションでは、 Web サーバ側で動作させるスクリプト言語の有効化と無効化を行うことができます。他のモジュールを有効化もしくは無効化したい場合は、 24.2.3.2.2項 「サーバモジュール」 をお読みください。 次へ を押すと次のダイアログに進みます。

24.2.3.1.3 既定のホスト Edit source

この設定画面では、既定の Web サーバに関する設定を行います。 24.2.2.1項 「仮想ホストの設定」 でも説明しているとおり、 Apache では複数の仮想ホストを単一の物理マシンで賄うことができます。設定ファイル内で最初に設定した仮想ホストが 既定のホスト として設定され、それぞれの仮想ホストでは、その既定のホスト設定を引き継いで動作するようになります。

ホストの設定 (ディレクティブ とも呼びます) を編集するには、表内で対応する項目を選択して 選択 を押します。新しいディレクティブを追加するには、 追加 を押します。ディレクティブを削除するには、削除したい項目を選んで 削除 を押します。

HTTP サーバウイザード: 既定のホスト
図 24.1: HTTP サーバウイザード: 既定のホスト

ここではサーバに対する既定の設定を行います:

ドキュメントルート

このホストに対するアクセスが届いた場合、 Apache が提供すべきファイルのディレクトリを指定します。既定値は /srv/www/htdocs です。

Alias

Alias ディレクティブを使用することで、 URL を物理的なファイルシステムの場所に割り当てることができます。これにより、ファイルシステム内の ドキュメントルート 以外の場所を、 URL に割り当てることができるようになります。

既定の openSUSE Leap では、 /icons/usr/share/apache2/icons を指すように Alias の設定が行われていて、これによってディレクトリ一覧を表示した場合に、 Apache が提供するアイコンを表示するようになっています。

ScriptAlias

Alias ディレクティブと同様に、 ScriptAlias ではファイルシステムと URL との間の対応付けを設定します。ただし、 ScriptAlias では CGI のディレクトリを設定する点が異なり、そのディレクトリの中ではスクリプトを動作させることができるようになります。

Directory

Directory 設定を指定することで、特定のディレクトリにのみ適用する設定オプションを定義することができるようになります。

ここでは、それぞれ /srv/www/htdocs , /usr/share/apache2/icons , /srv/www/cgi-bin の各ディレクトリに対するアクセスおよび表示オプションが設定されています。これらの値は特に変更する必要はないはずです。

Include

Include ディレクティブを指定することで、追加の設定ファイルを指定することができます。既定では 2 種類の Include ディレクティブが設定されています。 1 つは /etc/apache2/conf.d/ ディレクトリに対する設定で、こちらは外部モジュールが提供する設定ファイルを取り込むためのものです。このディレクティブを使用することで、そのディレクトリ内に存在していて .conf で終わるファイル全てを取り込むことができます。もう 1 つは /etc/apache2/conf.d/apache2-manual.conf の指定で、こちらは apache2-manual の設定ファイルを取り込むためのものです。

サーバ名

ここでは、 Web サーバがアクセスする際にクライアントが使用する既定の URL を指定します。http://FQDN/ の形式でアクセスできる完全修飾ドメイン名 (FQDN) を指定するか、もしくは IP アドレスで指定してください。なお、ここでは任意の名前を指定することはできません。サーバ名には 既知の 名前を指定しなければなりません。

サーバ管理者のメールアドレス

サーバ管理者の電子メールアドレスを指定します。このアドレスは、たとえば Apache が生成するエラーページなどに記載されます。

既定のホスト のステップを完了したら、 次へ を押して設定を続けてください。

24.2.3.1.4 仮想ホスト Edit source

このステップでは、ウイザードは既に設定済みの仮想ホストの一覧を表示します (詳しくは 24.2.2.1項 「仮想ホストの設定」 をお読みください) 。 YaST の HTTP ウイザードを起動するまでに何も手作業で設定していない場合は、仮想ホストが何も表示されません。

仮想ホストを追加するには、 追加 を押してダイアログを表示させ、 サーバ名 , サーバコンテンツのルート ( DocumentRoot ), 管理者のメールアドレス など、仮想ホストに関する基本設定を行ってください。また、 サーバの解決 では、ホストの識別方法を指定することができます (名前ベースまたは IP アドレスベース) 。また、 仮想ホスト ID の変更 では、名前もしくは IP アドレスを指定することができます。

次へ を押すと、仮想ホストの設定ダイアログの 2 番目に移動することができます。

仮想ホストに対する 2 番目の設定ダイアログでは、 CGI スクリプトの有効化を行うかどうかや、これらのスクリプトの配置先ディレクトリをなどを設定することができます。また、 SSL の有効化についても設定を行うことができます。 SSL を設定する場合は、証明書のパスについても設定を行わなければなりません。 SSL と証明書について、詳しくは 24.6.2項 「SSL を利用する場合の Apache の設定」 をお読みください。また、 ディレクトリインデックス では、クライアントからディレクトリに対してアクセスがあった場合に、表示するファイルを指定することができます (既定では index.html を表示します) 。必要であれば、スペース区切りで複数のファイルを指定することもできます。また、 公開 HTML を有効にする を選択すると、各ユーザの公開ディレクトリ (( ~ユーザ名/public_html/ ) の内容を、 http://www.example.com/~ユーザ名 のような URL で提供することができるようになります。

重要
重要: 仮想ホストの作成について

仮想ホストは完全に自由に作成できるというものではありません。名前ベースの仮想ホストを使用する場合、それぞれのホスト名はネットワーク内で解決可能な名前でなければなりません。 IP ベースの仮想ホストを使用する場合は、それぞれの IP アドレスに対して 1 つの仮想ホストを割り当てることができます。

24.2.3.1.5 概要 Edit source

これがウイザードの最後のステップです。ここでは、 Apache サーバの開始方法 (システム起動時に自動的に開始するか、もしくは手作業で開始するか) を指定することができます。また、ここまでに設定してきた内容の概要も表示されます。ここに表示された設定で問題か無ければ、 完了 を押して設定を完了させてください。何らかの項目を変更したい場合は、 戻る を押して、対応するダイアログまで戻っていってください。また、 HTTP サーバの熟練者向け設定 を押すと、 24.2.3.2項 「HTTP サーバの設定」 で示されているダイアログを表示することができます。

HTTP サーバウイザード: 概要
図 24.2: HTTP サーバウイザード: 概要

24.2.3.2 HTTP サーバの設定 Edit source

HTTP サーバの設定 ダイアログでは、ウイザードで提示されるものよりも細かい設定を行うことができます (ウイザードは、お使いの Web サーバを初めて設定しようとした場合にのみ表示されます) 。このダイアログは、下記に説明する 4 つのタブから構成されています。ここで設定した内容は即時には反映されず、 完了 を押すことによって反映されるようになっています。また、 中止 を押すと、設定モジュールを終了して変更点を破棄することができます。

24.2.3.2.1 待ち受けるポートとアドレス Edit source

HTTP サービス の枠内では、 Apache を動作させる (有効) のか、もしくは停止させる (無効) のかを選択することができます。また、 待ち受けるポート では、サーバが待ち受けるべきアドレスやポートを 追加 , 編集 , 削除 することができます。既定では全てのインターフェイスに対して、ポート 80 で待ち受けるように設定されています。また、外部から Web サーバに対してアクセスができるようにするため、 ファイアウオールでポートを開く についてもチェックしておくべきでしょう。ポートを閉じたままにしておくと、外部から Web サーバに対してアクセスすることができなくなりますので、テスト用途の場合にのみ役立ちます。また、複数のネットワークインターフェイスを設定している場合は、 ファイアウオールの詳細 を押して、どのインターフェイスのどのポートを開くべきなのかを設定することもできます。

ログファイル では、アクセスログファイルやエラーログファイルを表示することができます。これは設定のテストを行う場合に有用な機能です。ログファイルは異なるウインドウ内に表示され、ここから Web サーバを再起動したり再読み込みさせたりすることができます。詳しくは 24.3項 「Apache の開始と停止」 をお読みください。これらのコマンドはその場で動作しますので、ログメッセージについても最新のものを読むことができます。

HTTP サーバの設定: 待ち受けポートとアドレスの設定
図 24.3: HTTP サーバの設定: 待ち受けポートとアドレスの設定
24.2.3.2.2 サーバモジュール Edit source

ここでは 状態の切り替え を押すことで、 Apache2 モジュールの状態を変更 (有効もしくは無効) することができます。既にインストールされているものの、一覧には表示されないモジュールがある場合は、 モジュールの追加 を押してください。モジュールに関する詳細は、 24.4項 「モジュールのインストール/有効化/設定」 をお読みください。

HTTP サーバの設定: サーバモジュール
図 24.4: HTTP サーバの設定: サーバモジュール
24.2.3.2.3 メインホストとホスト Edit source

これらのダイアログは説明済みのものと同じです。それぞれ 24.2.3.1.3項 「既定のホスト」24.2.3.1.4項 「仮想ホスト」 をお読みください。

24.3 Apache の開始と停止 Edit source

24.2.3項 「YaST による Apache の設定」 で説明している手順に従って YaST で設定を行った場合、 Apache は multi-user.targetgraphical.target 内で、システムの起動時に自動的に開始されるようになります。この動作を変更したい場合は、 YaST の サービスマネージャ を使用するか、もしくは systemctl コマンドラインツールをお使いください (systemctl enable もしくは systemctl disable を実行します) 。

Apache の開始と停止、もしくは動作中の Apache に対して何らかの処理を行わせたい場合は、下記のようにして systemctl もしくは apachectl コマンドをご利用ください。

systemctl コマンドに関する一般的な情報については、 10.2.1項 「動作中のシステムにおけるサービスの管理」 をお読みください。

systemctl status apache2.service

Apache が動作しているかどうかを調べます。

systemctl start apache2.service

Apache が動作していない場合、 Apache を開始します。

systemctl stop apache2.service

親プロセスを終了させることで Apache を終了します。

systemctl restart apache2.service

Apache を一旦停止して起動し直します。 Apache が動作中でなかった場合は、単純に開始のみを行います。

systemctl try-restart apache2.service

動作中の場合にのみ、 Apache をいったん停止して起動し直します。

systemctl reload apache2.service

全ての起動済み Apache プロセスに対して、現在処理中のリクエストの処理を完了してから終了するように促します。それぞれのプロセスが終了したタイミングで新しいプロセスを起動して入れ替えていき、最終的に Apache が完全に 再起動 できるようにします。

ヒント
ヒント: 本番環境における Apache の再起動について

このコマンドを実行することで、クライアントから Apache への接続を強制的に終了させることなく、 Apache の設定変更を反映させることができるようになります。

systemctl stop apache2.service

Web サーバを停止しますが、その際に GracefulShutdownTimeout で指定された長さの時間だけ終了を待機します。これにより、既存のリクエスト処理を正常に終了させることができるようになります。

apachectl configtest

現在動作中の Web サーバに影響を与えずに、設定ファイルの文法をチェックします。このチェックはサーバの開始時や再読み込み時、再起動時にそれぞれ実行されるように設定されているため、このコマンドを明示的に実行する必要はありません (何らかの設定エラーが検出されると、開始/再読み込み/再起動を行わないようになっています) 。

apachectl status および apachectl fullstatus

それぞれ現在の Apache サーバに関する情報を、短くもしくは長く表示します。この情報を表示するには、 mod_status モジュールを有効化する必要があるほか、テキストベースのブラウザ (たとえば linksw3m など) をインストールしておく必要があります。さらに、 /etc/sysconfig/apache2 ファイル内の APACHE_SERVER_FLAGS に対して、 STATUS を追加しなければなりません。

ヒント
ヒント: 追加フラグについて

コマンドに対して追加のフラグを指定すると、それらは Web サーバにそのまま渡されます。

24.4 モジュールのインストール/有効化/設定 Edit source

Apache ソフトウエアはモジュール型の構造になっているため、いくつかの中枢機能を除くと、ほとんどの機能はモジュールとして作られています。 HTTP 自身でさえも、モジュールとして作られ処理されています (http_core) 。

Apache のモジュールは構築時に Apache バイナリ内に組み込むことができるほか、実行時に動的に読み込むことができます。モジュールを動的に読み込む方法について、詳しくは 24.4.2項 「有効化と無効化」 をお読みください。

Apache のモジュールは、下記の 4 種類の分野に分かれています:

基本モジュール

基本モジュールは、既定で Apache 内に組み込まれます。 openSUSE Leap での Apache では、 mod_so (他のモジュールを読み込むためのモジュール) と http_core のみが組み込まれます。それ以外のモジュールは共有オブジェクトとして提供され、サーバのバイナリファイルそのものに組み込まれずに、実行時に別途読み込む仕組みになっています。

拡張モジュール

拡張として位置づけられているモジュールは、 Apache ソフトウエア内に同梱されているものの、通常はサーバのバイナリファイル内に組み込まないものを意味します。 openSUSE Leap では、これらについても共有オブジェクトとして提供され、実行時に別途読み込む仕組みになっています。

外部モジュール

外部モジュールとして位置づけられているモジュールは、公式の Apache ソフトウエア内には含まれていないものを意味します。 openSUSE Leap では、これらのうちのいくつかを提供しています。

マルチプロセッシングモジュール (MPM)

MPM は Web サーバに対するリクエストを受け付け、処理するためのモジュールです。 Web サーバソフトウエアの中枢部分でもあります。

24.4.1 モジュールのインストール Edit source

24.1.2項 「インストール」 の手順に従って既定のインストール作業を行うと、全ての基本モジュールと拡張モジュールのほか、マルチプロセッシングモジュールである Prefork MPM と、外部モジュール mod_python がそれぞれインストールされます。

追加の外部モジュールをインストールしたい場合は、 YaST を起動して ソフトウエア › ソフトウエア管理 を選択し、 表示 › 検索 を選択して apache と入力し、検索を行ってください。これにより、利用可能な全ての外部 Apache モジュールなどを表示することができます。

24.4.2 有効化と無効化 Edit source

モジュールの有効化と無効化は、手作業で実施することができるほか、 YaST でも設定することができます。 YaST では、 24.2.3.1項 「HTTP サーバウイザード」 で説明しているとおり、スクリプト言語モジュール (PHP 8 および Python) を有効化もしくは無効化することができます。その他のモジュールの有効化と無効化については、 24.2.3.2.2項 「サーバモジュール」 で説明しています。

モジュールの有効化や無効化を手作業で実施したい場合は、 a2enmod モジュール名 もしくは a2dismod モジュール名 のコマンドをお使いください。 a2enmod -l と入力して実行すると、現時点で有効化されている全てのモジュールを一覧表示することができます。

重要
重要: 外部モジュールに対する設定ファイルの取り込み

外部モジュールを手作業で有効化した場合は、全ての仮想ホストの設定に対して、外部モジュールの設定ファイルが読み込まれていることをご確認ください。外部モジュールの設定ファイルは /etc/apache2/conf.d/ 内に存在していて、既定では /etc/apache2/default-server.conf から読み込まれるようになっています。より細かい調整を行いたい場合は、 /etc/apache2/default-server.conf 内にある外部モジュールに対する取り込み設定をコメントアウトして、特定の仮想ホストでのみ読み込むように設定してもかまいません。設定例については /etc/apache2/vhosts.d/vhost.template をお読みください。

24.4.3 基本モジュールと拡張モジュール Edit source

全ての基本モジュールと拡張モジュールについては、 Apache のドキュメンテーション内に詳細説明が用意されています。下記では主要なモジュールに関する概要説明のみを行っています。それぞれのモジュールに関する詳細は、 http://httpd.apache.org/docs/2.4/mod/ をお読みください。

mod_actions

特定の MIME タイプ (たとえば application/pdf など) や特定の拡張子を持つファイル (たとえば .rpm) 、もしくは特定のリクエストメソッド (たとえば GET) が要求された際に、特定のスクリプトを実行する機能を提供します。このモジュールは既定で有効化されます。

mod_alias

AliasRedirect のディレクティブを提供するモジュールです。これにより、特定の URL に対してディレクトリを割り当てる ( Alias の名前の通り、別名を定義する) ことができるほか、他の場所に転送を行うことができます。このモジュールは既定で有効化されます。

mod_auth*

様々な認証方式を提供する認証モジュールです。 mod_auth_basic はベーシック認証を、 mod_auth_digest はダイジェスト認証をそれぞれ提供します。

なお、 mod_auth_basicmod_auth_digest は、 mod_authn_* で表される認証プロバイダモジュールと、 mod_authz_* で表される認可モジュールを組み合わせて使用します。たとえば mod_authn_file はテキストファイルに認証情報を保存するモジュールであるほか、 mod_authz_user はユーザ認可を提供するモジュールです。

この分野の説明について、詳しくは https://httpd.apache.org/docs/2.4/howto/auth.html にある 認証、承認、アクセス制御 をお読みください。

mod_auth_openidc

mod_auth_openidc は、 Apache HTTP サーバで OpenID Connect を使用するための唯一の認証された方式です。詳しくは https://openid.net/developers/certified/ をお読みください。

mod_autoindex

autoindex モジュールは、インデックスファイル (例: index.html) が存在しない場合に、ディレクトリ内の一覧を生成する機能を提供します。一覧の外観は様々に設定することができます。このモジュールについても既定で有効化されますが、ディレクトリ一覧の表示機能は Options ディレクティブで無効化されています。そのため、この機能が必要である場合は、お使いの仮想ホストの設定内で上書きしてお使いください。このモジュールの既定の設定ファイルは、 /etc/apache2/mod_autoindex-defaults.conf に配置されています。

mod_cgi

mod_cgi は CGI スクリプトを実行する際に必要となるモジュールです。このモジュールは既定で有効化されます。

mod_deflate

このモジュールを使用すると、 Apache が特定のファイルを配信する際、その場でデータ圧縮を行うことができるようになります。

mod_dir

mod_dirDirectoryIndex ディレクティブを提供するモジュールで、ディレクトリそのものに対してリクエストが届いた際に、どのファイルを自動的に配信するかを指定します。既定値は index.html に設定されています。また、このモジュールは、ディレクトリに対するリクエストが届いた場合、末尾がスラッシュで終わっていないと、末尾のスラッシュを追加する (実際にはそのような URL に転送する) 機能も提供します。このモジュールも既定で有効化されます。

mod_env

CGI スクリプトや SSI ページに対して渡される、環境変数の制御を行います。環境変数は追加や削除を行うことができるほか、 httpd プロセスから起動されるシェルからの値を渡すこともできます。このモジュールは既定で有効化されます。

mod_expires

mod_expires を使用すると、 Expires ヘッダを送信して、プロキシサーバやブラウザのキャッシュ機能に対して、どれだけの時間で文書の期限が切れるのかを指定することができるようになります。このモジュールは既定で有効化されます。

mod_http2

mod_http2 を利用することで、 Apache は HTTP/2 プロトコルに対応するようになります。 VirtualHost 内で Protocols h2 http/1.1 と指定することで有効化することができます。

mod_include

mod_include は Server Side Includes (SSI) と呼ばれる機能を提供するモジュールで、 HTML ページを動的に生成するための基本的な技術を提供します。このモジュールは既定で有効化されます。

mod_info

http://localhost/server-info/ にアクセスすることで、サーバの設定概要を表示することができるようになるモジュールです。セキュリティ上の理由から、この URL に対するアクセスは常に制限しておくべきです。既定では localhost からのみアクセスすることができます。また、 mod_info/etc/apache2/mod_info.conf で設定されています。

mod_log_config

このモジュールを使用することで、 Apache のログファイルに出力される内容を制御することができます。このモジュールは既定で有効化されます。

mod_mime

このモジュールは、ファイル名の拡張子を利用することで、ファイルに対する正しい MIME ヘッダ (たとえば HTML 文書であれば text/html) を配信する仕組みを提供します。このモジュールは既定で有効化されます。

mod_negotiation

コンテンツネゴシエーションを行うために必要なモジュールです。詳しい説明は、 http://httpd.apache.org/docs/2.4/content-negotiation.html をお読みください。このモジュールは既定で有効化されます。

mod_rewrite

mod_alias と同じような機能を提供するモジュールですが、より多くの機能が追加され、より柔軟な設定ができるようになっています。 mod_rewrite を利用することで、複数のルールやリクエストヘッダをベースにして URL の転送を設定したりすることができます。

mod_setenvif

クライアント側からのリクエストに応じて環境変数を設定するモジュールです。これにはたとえば、クライアントが送信したブラウザ文字列やクライアントの IP アドレスなどが含まれます。このモジュールは既定で有効化されます。

mod_spelling

mod_spelling は、大文字と小文字の違いなどの入力ミスを自動的に修正しようと試みるモジュールです。

mod_ssl

ブラウザとクライアントとの間で、暗号化した接続を実現するモジュールです。詳しくは 24.6項 「SSL を利用した暗号化機能付き Web サーバの設定」 をお読みください。このモジュールは既定で有効化されます。

mod_status

http://localhost/server-status/ にアクセスすることで、サーバの動作状況と性能情報を表示することができるようになるモジュールです。セキュリティ上の理由から、この URL に対するアクセスは常に制限しておくべきです。既定では localhost からのみアクセスすることができます。また、 mod_status/etc/apache2/mod_status.conf で設定されています。

mod_suexec

mod_suexec は、 CGI スクリプトを異なるユーザやグループで実行することができるモジュールです。このモジュールは既定で有効化されます。

mod_userdir

~ユーザ名/ の形式で、ユーザ別のディレクトリを有効化するモジュールです。このモジュールを利用するには、 UserDir ディレクティブを設定しなければなりません。このモジュールは既定で有効化されます。

24.4.4 マルチプロセッシングモジュール (MPM) Edit source

openSUSE Leap では、 Apache で利用することのできるマルチプロセッシングモジュールが 2 種類用意されています:

24.4.4.1 prefork MPM Edit source

prefork MPM はスレッドを使用しない、事前 fork 型の Web サーバです。 Apache バージョン 1.x に似た動作の Web サーバになります。このバージョンでは、それぞれのリクエストと処理を個別の子プロセスに分離して処理します。これにより、何らかの問題が発生しても、他のプロセスには影響を及ぼすことがなく、 Web サーバの機能停止を防ぐことができるようになっています。

このようなプロセスベースの仕組みでは安定性がもたらされるものの、 worker MPM よりはより多くのシステム資源を消費してしまいます。また、 Unix ベースのオペレーティングシステムでは、 prefork MPM を既定の MPM としています。

重要
重要: 本文書内での MPM について

この文書内では、 Apache 内で prefork MPM を使用することを前提に説明しています。

24.4.4.2 worker MPM Edit source

worker MPM はマルチスレッド型の Web サーバです。スレッドはプロセスよりもずっと 軽量 な仕組みであるため、より少ない資源消費が特長になります。この MPM では、子プロセスを起動する代わりに、それぞれのリクエストに対してスレッドを割り当てて処理を行います。また、場合によっては複数のプロセスを起動することもありますが、子プロセスも同様にマルチスレッドになります。このような仕組みにより、 prefork MPM よりずっと少ない資源で Apache を動作させることができます。

worker MPM での最も大きな欠点は、その安定性です。何らかの理由でスレッド内のメモリが破壊されてしまうと、同じプロセスに属する全てのスレッドが影響を受けます。最も悪いケースでは、サーバ自身がクラッシュしてしまいます。特に、負荷の高い環境下で Common Gateway Interface (CGI) を使用した場合、システム資源との通信が失敗することによってサーバ内部エラーが発生することがあります。また、もう 1 つの欠点としては、全ての Apache モジュールがスレッド型の仕組みに対応しているというわけではない (スレッドセーフではない) というものがあります。これにより、 worker MPM を利用できない場合もあります。

警告
警告: MPM と PHP の関係について

PHP モジュールによっては、マルチスレッド環境での使用が安全ではない (スレッドセーフではない) ものがあります。そのため、 mod_php を使用する場合は、 Worker MPM を使用しないことを強くお勧めします。

24.4.5 外部モジュール Edit source

ここには、 openSUSE Leap に同梱されている全ての外部モジュールが一覧で示されています。それぞれのモジュールのドキュメンテーションについては、それぞれのディレクトリをご覧ください。

mod_apparmor

mod_php8 などで処理される CGI スクリプトに対して、 AppArmor の制約を適用する Apache 向けのモジュールです。

パッケージ名: apache2-mod_apparmor
詳しい情報: パートIV「AppArmor による権限の制限」
mod_php8

PHP はサーバサイドスクリプトで複数プラットフォームに対応する HTML 組み込み型のスクリプト言語です。

パッケージ名: apache2-mod_php8
設定ファイル: /etc/apache2/conf.d/php8.conf
mod_python

mod_python は Apache HTTP サーバ内に Python の機能を組み込むもので、性能を大きく向上させることができるほか、 Web ベースのアプリケーションに柔軟性を与えます。

パッケージ名: apache2-mod_python
詳しい情報: /usr/share/doc/packages/apache2-mod_python
mod_security

mod_security は Web アプリケーションファイアウオールで、様々な範囲の攻撃から Web アプリケーションを保護します。 HTTP のトラフィック監視やリアルタイム分析に使用することもできます。

パッケージ名: apache2-mod_security2
設定ファイル: /etc/apache2/conf.d/mod_security2.conf
詳しい情報: /usr/share/doc/packages/apache2-mod_security2
ドキュメンテーション: https://github.com/SpiderLabs/ModSecurity

24.4.6 コンパイル Edit source

知識のあるユーザであれば、 Apache に対して独自のモジュールを作成して拡張することができます。 Apache 向けのモジュールを開発したり、サードパーティ製のモジュールをコンパイルしたりしたい場合は、 apache2-devel パッケージをインストールして、提供される開発ツールをお使いください。 apache2-devel には apxs2 ツールが含まれていますが、これは Apache 向けのモジュールをコンパイルする際に使用するツールです。

apxs2 は、ソースコードからモジュールをコンパイルして、インストールする機能を提供します (設定ファイルへの必要な変更を含みます) 。コンパイルを行うと、 動的共有オブジェクト (Dynamic Shared Objects; DSO) として作成され、 Apache の起動時に読み込みができるようになります。

apxs2 バイナリは、 /usr/sbin ディレクトリ内に配置されます:

  • /usr/sbin/apxs2 は、どの MPM でも動作する拡張モジュールをコンパイルするためのツールです。インストールを行うと、そのモジュールは /usr/lib64/apache2 内にインストールされます。

  • /usr/sbin/apxs2-prefork は、 prefork MPM で動作する拡張モジュールをコンパイルするためのツールです。インストールを行うと、そのモジュールは /usr/lib64/apache2-prefork 内にインストールされます。

  • /usr/sbin/apxs2-worker は、 worker MPM で動作する拡張モジュールをコンパイルするためのツールです。インストールを行うと、そのモジュールは /usr/lib64/apache2-worker 内にインストールされます。

ソースコードからモジュールをコンパイルしてインストールし、有効化するには、下記のコマンドを実行します:

> sudo cd /モジュールのソースコードのパス
> sudo apxs2 -cia モジュール名.c

ここで、 -c はモジュールのコンパイルを、 -i はインストールを、 -a は有効化をそれぞれ行うオプションです。 apxs2 に対するその他のオプションについては、 apxs2(1) のマニュアルページをお読みください。

24.5 CGI スクリプトの有効化 Edit source

Apache の汎用ゲートウエイインターフェイス (Common Gateway Interface (CGI)) を利用することで、プログラムやスクリプト (CGI スクリプト) を実行して動的なコンテンツを生成することができます。 CGI スクリプトは任意のプログラミング言語を利用することができます。多くは PHP などのスクリプト言語を使用します。

CGI スクリプトが生成したコンテンツを Apache から配信できるようにするには、 mod_cgi を有効化する必要があります。また、 mod_alias もあわせて有効化する必要があります。いずれのモジュールとも既定で有効化されています。モジュールの有効化について、詳しくは 24.4.2項 「有効化と無効化」 をお読みください。

警告
警告: CGI セキュリティ

サーバ内で CGI スクリプトを実行できるように設定すると、潜在的なセキュリティホールとなる可能性があります。詳しくは 24.8項 「セキュリティ問題の回避」 をお読みください。

24.5.1 Apache の設定 Edit source

openSUSE Leap では、 CGI スクリプトの実行は /srv/www/cgi-bin/ ディレクトリ内でのみ許可されるように設定されています。この場所は CGI スクリプトを実行する場所として設定されているディレクトリでもあります。仮想ホストの設定を作成している (詳しくは 24.2.2.1項 「仮想ホストの設定」) 場合で、仮想ホスト固有のディレクトリ内で CGI スクリプトを実行したい場合は、そのディレクトリでの CGI スクリプトの実行を許可するよう設定しなければなりません。

例 24.5: VirtualHost CGI 設定
ScriptAlias /cgi-bin/ "/srv/www/www.example.com/cgi-bin/"1

<Directory "/srv/www/www.example.com/cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Require all granted4
</Directory>

1

このディレクトリ内にある全てのファイルを、 CGI スクリプトとして実行するよう指定しています。

2

CGI スクリプトの実行を有効化しています。

3

.pl と .cgi の拡張子を持つファイルを、 CGI スクリプトとして扱うよう指定しています。こちらは必要に応じて変更してください。

4

Require ディレクティブは、既定のアクセス状態を制御するためのディレクティブです。この場合、指定したディレクトリへのアクセスは制限無く許可されます。認証と認可について、詳しくは https://httpd.apache.org/docs/2.4/howto/auth.html をお読みください。

24.5.2 サンプルスクリプトの実行 Edit source

CGI のプログラミングは 通常の プログラミングとは異なり、冒頭に Content-type: text/html のような MIME タイプヘッダなどを送信しなければなりません。このヘッダはクライアントに送信されるもので、どのような種類のコンテンツを送信しているのかを表明しています。また、スクリプトが送信するコンテンツは、クライアント側 (たとえば Web ブラウザ) が解釈できるものでなければなりません。通常は HTML などですが、純粋なテキストや画像などでもかまいません。

/usr/share/doc/packages/apache2/test-cgi には、シンプルなテスト用スクリプトが用意されています。これは Apache パッケージの一部として提供されているもので、純粋なテキスト形式で環境変数を出力するものです。このスクリプトを /srv/www/cgi-bin/ にコピーするか、もしくは仮想ホスト ( /srv/www/www.example.com/cgi-bin/ ) などにコピーして、 test.cgi のような名前に変更してください。また、ファイルの冒頭に #!/bin/sh を追加してください。

また、 Web サーバからアクセスできるようにするには、所有者が root である必要もあります。詳しくは 24.8項 「セキュリティ問題の回避」 をお読みください。なお、 Web サーバは異なるユーザとして動作する仕組みであるため、 CGI スクリプトは全てのユーザが実行でき、かつ読み込みできるものでなければなりません。必要なアクセス権を適用するには、 CGI のディレクトリに移動して chmod 755 test.cgi を実行してください。

これで http://localhost/cgi-bin/test.cgi または http://www.example.com/cgi-bin/test.cgi で CGI スクリプトを実行することができます。 CGI/1.0 test script report のような画面が表示されるはずです。

24.5.3 CGI トラブルシューティング Edit source

テストプログラムの出力が正しく表示されず、エラーメッセージが表示されてしまった場合は、下記をご確認ください:

CGI トラブルシューティング
  • 設定の変更後、設定を反映させるために再読み込みを実施しましたか? 実施していない場合は、 systemctl reload apache2.service で再読み込みを実施してください。

  • 独自の CGI ディレクトリを設定している場合は、その設定が適切に行われていますか? 何か不安な点がある場合は、既定の CGI ディレクトリである /srv/www/cgi-bin/ にスクリプトをコピーして、 http://localhost/cgi-bin/test.cgi にアクセスしてみてください。

  • ファイルのアクセス権は正しく設定されていますか? CGI のディレクトリに移動して、 ls -l test.cgi を実行してください。出力の冒頭は下記のようになっているはずです:

    -rwxr-xr-x  1 root root
  • スクリプトにプログラミングエラーが無いことをご確認ください。 test.cgi を変更せずにそのまま使用している場合は問題なく動作するはずですが、独自に作成したプログラムを使用している場合は、プログラミングに問題がないことをよく確認する必要があります。

24.6 SSL を利用した暗号化機能付き Web サーバの設定 Edit source

クレジットカード情報などの機密データを Web サーバとクライアントとの間でやりとりするにあたっては、認証機能付きの暗号化接続を行って機密を保持する必要があります。 mod_ssl では Secure Sockets Layer (SSL) や Transport Layer Security (TLS) を利用して、クライアントと Web サーバとの間の HTTP 通信に対して強力な暗号化機能を提供します。つまり、 TLS/SSL を利用することで Web サーバとクライアントの間の通信を盗聴できなくすることになります。もちろんデータの整合性についても確認が行われますし、クライアントとサーバはお互いに認証することができます。

このような目的から、サーバは要求された URL に応答する前に、サーバ自身の正しい識別情報を示す SSL 証明書を送信します。これによりクライアント側は、通信している相手が間違いのないものであることを確認できることになります。これに加えて、証明書は暗号化接続を生成することができますので、クライアントとサーバとの間でやり取りされる情報が、純粋なテキストのように漏洩することがなくなります。

mod_ssl は TLS/SSL プロトコルを直接実装しているわけではありません。その代わりに、 Apache と SSL ライブラリとの仲介インターフェイスとして動作します。 openSUSE Leap では OpenSSL ライブラリを使用します。 OpenSSL は、 Apache をインストールすると自動的にインストールされます。

Apache で mod_ssl を利用すると、目に見える違いとしては URL が http:// ではなく https:// になります。

24.6.1 SSL 証明書の作成 Edit source

Web サーバで TLS/SSL を使用するには、まず SSL 証明書を作成する必要があります。この証明書は Web サーバとクライアントとの間で識別を行うのに必要となるものです。なお、証明書の正当性を担保するには、各ユーザが信頼する団体で署名してもらわなければなりません。

作成できる証明書には、 3 つの種類があります。 1 つ目は テスト 証明書で、テスト用にのみ使用することができます。 2 つ目は自己署名証明書と呼ばれるもので、あなた自身を信頼する特定範囲のユーザのみ利用できるものです。 3 つ目は公的な証明書で、証明機関 (Certificate Authority (CA)) と呼ばれる独立した第三者機関が署名する正式な証明書です。

証明書の作成は 2 段階の手順から構成されています。最初に証明機関の機密鍵を作成し、次にその鍵でサーバ証明書に署名を行います。

ヒント
ヒント: さらなる情報

TLS/SSL の考え方や定義についての詳細は、 http://httpd.apache.org/docs/2.4/ssl/ssl_intro.html をお読みください。

24.6.1.1 テスト 証明書の作成 Edit source

テスト用の証明書を作成するには、 /usr/bin/gensslcert を実行します。これを実行すると、下記に示すファイルを作成もしくは上書きします。なお、 gensslcert のオプションスイッチを指定することで、証明書の詳細を調整することができます。詳しくは /usr/bin/gensslcert -h を実行してください。

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

ca.crt のコピーを /srv/www/htdocs/CA.crt に配置して、ダウンロードできるようにしておくとよいでしょう。

重要
重要: テスト用途のみでの使用について

テスト証明書は本番環境で使用すべきではありません。テスト目的にのみお使いください。

24.6.1.2 自己署名証明書の作成 Edit source

イントラネット環境や特定の範囲のユーザのみ公開する Web サーバを構築する際は、自分自身が証明機関 (CA) になって証明書に署名を付与し、使用すれば十分な場合があります。ただし、公的な証明書ではなく、 Web ブラウザが証明書を識別することができないことから、ユーザがアクセスすると 安全な接続ではありません のような警告メッセージが表示されることに注意してください。

重要
重要: 自己署名証明書について

自己署名証明書は、あなた自身を証明機関として信頼してくれる特定の範囲のユーザに対して提供する Web サーバにのみお使いください。たとえば一般向けの販売サイトなどでは、このような証明書を使用しないことをお勧めします。

まずは証明書署名要求 (Certificate Signing Request (CSR)) を生成します。この作業では openssl を利用し、 PEM 形式で作成を行います。また、この手順ではパスフレーズのほか、いくつかの質問に回答する必要があります。パスフレーズは今後入力を求められることになりますので、忘れずに記憶しておいてください。

> sudo openssl req -new > new.cert.csr
Generating a 1024 bit RSA private key
..++++++
.........++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:1
Verifying - Enter PEM pass phrase:2
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:3
State or Province Name (full name) [Some-State]:4
Locality Name (eg, city) []:5
Organization Name (eg, company) [Internet Widgits Pty Ltd]:6
Organizational Unit Name (eg, section) []:7
Common Name (for example server FQDN, or YOUR name) []:8
Email Address []:9

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:10
An optional company name []:11

1

パスフレーズを入力します。

2

再度パスフレーズを入力します (パスフレーズは忘れてはなりません) 。

3

2 文字の国コードを入力します。日本であれば JP を入力します。

4

通常は州名を入力します。 日本の場合は都道府県名を一般に入力します。

5

市区町村名を入力します。たとえば Chiyoda-ku のように入力します。

6

所属する団体名を入力します。

7

組織単位を入力します。組織単位がない場合は、何も入力しなくてかまいません。

8

サーバのドメイン名、もしくはあなた自身のフルネームを入力します。

9

電子メールアドレスを入力します。

10

必要に応じてチャレンジパスワードを入力します。ここで何らかのパスワードを指定した場合は、 Apache Web サーバを再起動するたびに入力を求められます。

11

必要であれば企業名を入力します。不要であれば何も入力しなくてかまいません。

これで証明書を生成できるようになります。再度 openssl を使用して、既定の PEM 形式で証明書を生成します。

手順 24.3: 証明書の生成
  1. 機密鍵を new.cert.key にエクスポートします。証明書署名要求 (Certificate Signing Request; CSR) でパスフレーズを入力している場合は、ここで入力を求められます。

    > sudo openssl rsa -in privkey.pem -out new.cert.key
  2. 署名要求で入力した情報に従って証明書の公開部分を生成します。 -days オプションは、証明書の期限が切れるまでの日数を指定します。なお、期限切れになる前でも、証明書を取り消したり新しいものに置き換えたりすることができます。

    > sudo openssl x509 -in new.cert.csr -out new.cert.cert -req \
    -signkey new.cert.key -days 365
  3. 生成された証明書ファイルを、 Apache から読み取ることのできるディレクトリにコピーします。なお、機密鍵である /etc/apache2/ssl.key/server.key ファイルは全てのユーザが読み込めるようにしてはなりませんが、公開鍵である /etc/apache2/ssl.crt/server.crt については、全てのユーザが読み込めるようにしておく必要があります。

    > sudo cp new.cert.cert /etc/apache2/ssl.crt/server.crt
    > sudo cp new.cert.key /etc/apache2/ssl.key/server.key
ヒント
ヒント: 証明書の公開先について

最後に証明書ファイル /etc/apache2/ssl.crt/server.crt をユーザからアクセスできる場所にコピーして、各ユーザの Web ブラウザ内に取り込んで信頼してもらう作業が必要となります。この作業を実施しないと、ブラウザ側では未知の証明機関が発行した証明書であるものとして扱われてしまい、エラーまたは警告が表示されるようになってしまいます。

24.6.1.3 公的に署名された証明書の取得 Edit source

一般的に利用可能な証明書を発行する機関は様々あります。証明書を公的に信頼されている機関に署名してもらうことで、 Web サーバ自身を完全に信頼してもらうことができるようになります。また、一般的な SSL/TLS 対応のブラウザであれば、公的な証明機関の証明書を保持していますので、ここから正当性を確認することができます。一般的に使用される証明機関 (CA) の一覧については、 https://en.wikipedia.org/wiki/Certificate_authority#Providers などをご覧ください。

公的に証明された証明書を取得するにあたっては、証明書そのものを CA に送信する必要はありません。その代わりに、証明書署名要求 (Certificate Signing Request; CSR) を送信します。 CSR を作成するには、下記のコマンドを実行します:

> openssl req -new -newkey rsa:2048 -nodes -keyout newkey.pem -out newreq.pem

ここでは識別名 (Distinguished Name) の入力を求められるほか、国コードや組織名などのいくつかの質問に回答する必要があります。ここで入力した内容は証明書内に記載されるほか、証明機関が内容をチェックすることもあります。なお、全ての質問に回答する必要はありません。不要であると判断した項目に対しては、 . とだけ入力して先に進めてください。

作成した CSR は、スクリプトを実行したディレクトリ内に出力されます。ファイル名は newreq.pem という名前になります。

24.6.2 SSL を利用する場合の Apache の設定 Edit source

Web サーバで TLS/SSL を使用する場合、既定のポートは 443 が割り当てられています。 TLS/SSL のない 通常の Apache はポート 80 で、 TLS/SSL を使用する場合の Apache は 443 を使用しますが、両方のサービスを単一の Apache インスタンスで賄うことができます。また、それぞれに対して別々の仮想ホストを設定して、提供する内容やサービスなどを変更したりすることもあります。

重要
重要: ファイアウオールの設定

なお、 Apache で SSL (ポート 443) を使用するにあたっては、ファイアウオールでポートを開くことを忘れずに実施してください。この作業は firewalld で行います。詳しくは 23.4.1項 「コマンドラインからのファイアウオール設定」 をお読みください。

SSL モジュールは、サーバ全体の設定の中で既定で有効化されています。有効化されていない場合は、 a2enmod ssl で有効化することができます。また、 SSL を有効化する場合は、フラグ SSL を設定する必要があります。フラグを設定するには、 a2enflag SSL (大文字であることに注意してください) を実行します。また、サーバ証明書を暗号化している場合は、 /etc/sysconfig/apache2 内の APACHE_TIMEOUT の値を十分に大きな値にして、 Apache 開始時のパスワード入力に十分な時間が確保されるようにしてください。最後にサーバを再起動すると、変更を反映させることができます。再読み込みでは不十分ですので、あらかじめご注意ください。

仮想ホストの設定では、 /etc/apache2/vhosts.d/vhost-ssl.template の雛形に従って、いくつかの SSL 固有のディレクティブを追加する必要があります。雛形内には詳しく説明がありますので、こちらをお読みください。また、仮想ホストの設定についての一般的な情報は、 24.2.2.1項 「仮想ホストの設定」 をお読みください。

初めて SSL を設定する場合は、雛形を /etc/apache2/vhosts.d/仮想ホスト名.conf にコピーして、このファイルを編集していってください。それぞれ下記のディレクティブ部分を調整すれば、サーバを開始することができます:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

24.6.2.1 名前ベースの仮想ホストと SSL の関係 Edit source

既定では、 1 つの IP アドレスしか設定されていないサーバの場合、 SSL が有効化された仮想ホストを複数実行することはできません。名前ベースの仮想ホストでは、 Apache 側に仮想ホストのホスト名を設定し、 Apache がリクエストの内容を読み込んで仮想ホストを判別しますが、 SSL 接続の処理は Apache がリクエストを処理するよりも前に行われるため、 1 つの IP アドレスに対して SSL の設定を複数持たせることができず、これによって常に既定の仮想ホストのみが使われる結果になってしまいます。これにより、証明書に書かれているサーバ名と、実際にアクセスしているサーバ名が異なる、という警告メッセージをユーザが受け取る結果にもなってしまいます。

そのため、 openSUSE Leap では、サーバ名表示 (Server Name Indication (SNI)) と呼ばれる SSL プロトコルの拡張に対応するようになっています。これは、 SSL の処理内で仮想ホストのドメイン名を送信するための仕組みで、これによってサーバは、 SSL の処理を行う時点で仮想ホストの判別ができるようになります。そのため、サーバ側は早期に適切な仮想ホストに 切り替える ことができるようなり、ブラウザ側にも正しい証明書を配信できるようになります。

SNI は openSUSE Leap では既定で有効化されています。 SSL を利用して名前ベースの仮想ホストを設定するには、 24.2.2.1.1項 「名前ベースの仮想ホスト」 の手順に従って設定を行ってください (ただし、 SSL を利用するには、ポート 80 ではなくポート 443 を使用するように設定する必要があります) 。

重要
重要: SNI 対応ブラウザについて

SNI はクライアント側でも対応している必要がありますが、現時点では特定の古いブラウザを除いて、ほとんどのブラウザで対応するようになっています。詳しくは https://ja.wikipedia.org/wiki/Server_Name_Indication#%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81 をお読みください。

SNI 対応のブラウザに対する処理を設定するには、 SSLStrictSNIVHostCheck というディレクティブを設定します。この値をサーバ全体の設定で on にすると、全ての仮想ホストに対して SNI 非対応のブラウザからのアクセスを拒否するようになります。 VirtualHost ディレクティブ内で on に設定すると、特定の仮想ホストのみが拒否されるようになります。

サーバ全体の設定で off に設定した場合、サーバ側は SNI への対応を全く行わなくなります。この場合、 SSL のリクエストが届くと、設定された 最初の 仮想ホスト (ポート: 443) にアクセスがあったものとして扱われます。

24.7 同一サーバ内での複数 Apache インスタンスの起動 Edit source

同一のサーバ内で複数の Apache インスタンスを動作させると、複数の仮想ホストを動作させるのに比べて、いくつかのメリットが生まれます (詳しくは 24.2.2.1項 「仮想ホストの設定」 をお読みください) 。

  • 何らかの理由で仮想ホストを無効化したい場合、通常であれば Web サーバの設定を変更して、その変更を反映させるために再起動を行う必要があります。

  • いずれかの仮想ホストで何らかの障害が発生した場合、全ての仮想ホストを再起動する必要があります。

既定の Apache インスタンスについては、通常通り開始することができます:

> sudo systemctl start apache2.service

上記を実行すると、既定の /etc/sysconfig/apache2 ファイルを読み込みます。このファイルが存在しない場合や、 APACHE_HTTPD_CONF 変数が設定されていない場合は、 /etc/apache2/httpd.conf を読み込みます。

もう 1 つの Apache インスタンスを開始したい場合は、下記のように実行します:

> sudo systemctl start apache2@インスタンス名

たとえば、下記のようになります:

> sudo systemctl start apache2@example_web.org

既定では、このインスタンスは /etc/apache2@example_web.org/httpd.conf というファイル名の設定ファイルを読み込みます。このファイル名の指定は、 /etc/sysconfig/apache2@example_web.org というファイル名の APACHE_HTTPD_CONF の設定で変更することができます。

Apache の追加インスタンスを設定するには、下記の手順を実施します。なお、全てのコマンドを root で実行することに注意してください。

手順 24.4: 追加の Apache インスタンスの設定
  1. まずは新しい設定ファイルを、 /etc/sysconfig/apache2 にあるものをベースにして作成します。たとえば /etc/sysconfig/apache2@example_web.org を作成します:

    > sudo cp /etc/sysconfig/apache2 /etc/sysconfig/apache2@example_web.org
  2. /etc/sysconfig/apache2@example_web.org ファイルを編集し、下記の変数を修正します:

    APACHE_HTTPD_CONF

    上記を、下記のように変更します:

    APACHE_HTTPD_CONF="/etc/apache2/httpd@example_web.org.conf"
  3. 次に /etc/apache2/httpd.conf ファイルをベースにして、 /etc/apache2/httpd@example_web.org.conf ファイルを作成します。

    > sudo cp /etc/apache2/httpd.conf /etc/apache2/httpd@example_web.org.conf
  4. /etc/apache2/httpd@example_web.org.conf ファイルを編集し、下記を変更します:

    Include /etc/apache2/listen.conf

    上記を、下記のように変更します:

    Include /etc/apache2/listen@example_web.org.conf

    その他のディレクティブを確認して、必要であれば変更します。おそらくは下記のディレクティブを変更する必要があるものと思われます:

    Include /etc/apache2/global.conf

    上記を変更して、新しいインスタンス用に global@example_web.org.conf ファイルを作成します。また、下記についても変更しておくことをお勧めします:

    ErrorLog /var/log/apache2/error_log

    上記を、下記のように変更します:

    ErrorLog /var/log/apache2/error@example_web.org_log

    これにより、各インスタンスのログを別々にすることができます。

  5. さらに /etc/apache2/listen.conf をベースにして、 /etc/apache2/listen@example_web.org.conf ファイルを作成します。

    > sudo cp /etc/apache2/listen.conf /etc/apache2/listen@example_web.org.conf
  6. /etc/apache2/listen@example_web.org.conf を編集して、下記を変更します:

    Listen 80

    上記を新しいインスタンスのポート番号に変更します。たとえば 82 であれば、下記のようになります:

    Listen 82

    新しい Apache インスタンスで SSL/TLS を利用する場合 (詳しくは 24.6項 「SSL を利用した暗号化機能付き Web サーバの設定」 をお読みください) は、下記の行についても変更する必要があります:

    Listen 443

    上記を、たとえば下記のように変更します:

    Listen 445
  7. あとは新しい Apache インスタンスを開始します:

    > sudo systemctl start apache2@example_web.org
  8. 最後にお使いの Web ブラウザから、サーバが動作していることを確認します。ここまでの設定を行っていれば、 http://server_name:82 でアクセスできるはずです。なお、新しいインスタンスで個別のエラーログを出力するように設定している場合は、下記のようにして確認することができます:

    > sudo tail -f /var/log/apache2/error@example_web.org_log

同一のサーバで複数の Apache インスタンスを動作させるにあたっては、下記の点を考慮する必要があります:

  • /etc/sysconfig/apache2@インスタンス名 ファイルでは、 /etc/sysconfig/apache2 と同じ値を設定することができます。これにより、モジュールの読み込みや MPM の設定を同じにすることができます。

  • また、新しい Apache インスタンスは、既定の Apache インスタンスが動作していなくても開始することができます。

  • Apache のヘルパーユーティリティである a2enmod , a2dismod , apachectl は、 HTTPD_INSTANCE 環境変数を指定していない場合、いずれも既定の Apache インスタンスに対して操作を行います。インスタンス名を指定する場合は、たとえば下記のようにして実行します:

    > sudo export HTTPD_INSTANCE=example_web.org
    > sudo a2enmod access_compat
    > sudo a2enmod status
    > sudo apachectl start

    上記を実行すると、 /etc/sysconfig/apache2@example_web.org にある APACHE_MODULES の値に対して、 access_compatstatus を追加し、 example_web.org のインスタンスを起動します。

24.8 セキュリティ問題の回避 Edit source

Web サーバは全世界のインターネットに公開される仕組みであるため、常に管理面の労力を必要とします。ソフトウエアに起因するセキュリティ問題のほか、設定ミスによる情報漏洩なども必然的に発生しうる問題となります。ここでは、これらの問題を解決するためのいくつかのヒントを示しています。

24.8.1 最新版のソフトウエアの使用 Edit source

Apache ソフトウエアに対して脆弱性が発見されると、 SUSE はセキュリティ勧告を発信します。この勧告には詳細の説明のほか、脆弱性の修正手順が含まれています。 SUSE のセキュリティ勧告は、下記の場所で公開されます (いずれも基本的には英語のみでの提供となります):

24.8.2 DocumentRoot のアクセス権 Edit source

openSUSE Leap では、 DocumentRoot で指定されている /srv/www/htdocs ディレクトリと、 CGI のディレクトリ /srv/www/cgi-bin については、 root のユーザおよびグループが設定されています。これらのアクセス権については、変更すべきではありません。これらのディレクトリが全てのユーザに対して書き込み可能になってしまうと、どのユーザからでもファイルを保存できることになってしまいます。ここに配置されたファイルは、 Apache 側では wwwrun というユーザの権限で実行されるため、場合によっては予期しないファイルシステムへのアクセスが為されてしまうことがあります。また、仮想ホストに対して DocumentRoot や CGI のディレクトリを設定する場合は、 /srv/www 以下のサブディレクトリを使用するものとし、それらのディレクトリに対して、 root のユーザおよびグループに所属させるようにしてください。

24.8.3 ファイルシステムのアクセス権 Edit source

既定では、ファイルシステム全体へのアクセスは /etc/apache2/httpd.conf で禁止されるようになっています。これらのディレクティブについては、削除したりしてはなりません。 Apache が読み込む必要のあるディレクトリに限定して、アクセスを許可するよう設定してください。詳しくは 24.2.2.1.3項 「基本的な仮想ホストの設定」 をお読みください。また、指定したディレクトリ内には、パスワードやシステムの設定ファイルなど、機密を確保する必要のあるファイルを配置していないことをご確認ください。誤って配置してしまうと、外部から読み取られてしまう危険性があります。

24.8.4 CGI スクリプト Edit source

PHP や SSI などのプログラミング言語で書かれた対話的なスクリプトは、本質的には任意のコマンドを実行することができる仕組みであるため、一般的なセキュリティ問題となりうる存在であります。サーバが実行するスクリプトについては、システム管理者が信頼する情報源から得たスクリプトだけになるようにすべきです。一般ユーザに対してスクリプトを作成させて実行できるようにするのは、適切ではありません。また、全てのスクリプトに対して、監査の仕組みを用意しておくことをお勧めします。

スクリプトの管理をできるだけ簡単に行いたい場合は、 CGI スクリプトの実行をサーバ全体で許可するのではなく、特定のディレクトリに限定して許可するようにするとよいでしょう。それぞれ ScriptAliasOption ExecCGI のディレクティブで設定することができます。 openSUSE Leap の既定の設定では、どこでも CGI スクリプトを実行できるような許可は与えていません。

また、 CGI スクリプトは全て同じユーザで実行されるため、場合によってはスクリプト間で競合が発生することがあります。 suEXEC モジュールを利用することで、 CGI スクリプトを異なるユーザやグループで実行することができます。

24.8.5 ユーザディレクトリ Edit source

mod_userdir もしくは mod_rewrite モジュールを利用してユーザディレクトリを有効化した場合、 .htaccess ファイルへのアクセスについては、禁止しておくことを強くお勧めします。これは、このファイルがセキュリティ設定を上書きできてしまう存在であるためです。少なくとも AllowOverRide を利用して、ユーザ側で設定できる項目を制限してください。 openSUSE Leap では、 .htaccess ファイルへのアクセスは既定で有効化されていますが、 mod_userdir モジュールを利用した場合、 Option ディレクティブによる設定の上書きは許可されないようになっています (詳しくは /etc/apache2/mod_userdir.conf 設定ファイルをお読みください) 。

24.9 トラブルシューティング Edit source

Apache が起動しない場合や Web ページにアクセスできない場合、もしくはユーザが Web サーバに接続できない場合は、問題の原因を突き止めることが重要です。ここでは、一般的なエラーの出力先と、主要なチェック項目について説明しています:

apache2.service サブコマンドの出力:

/usr/sbin/apache2ctl バイナリで Web サーバを開始したり停止したりするのではなく、 systemctl コマンドをお使いください (詳しくは 24.3項 「Apache の開始と停止」 をお読みください) 。なお、 systemctl status apache2.service と入力して実行すると、エラーに関する詳細な情報を出力することができます。ここから設定エラーを修正するためのヒントが得られます。

ログファイルと饒舌性

致命的なエラーであってもそうでなくても、 Apache のログファイルを調査することで原因を調査することができます。既定の設定では、主なエラーログは /var/log/apache2/error_log に出力されます。これに加えて LogLevel ディレクティブを使用することで、ログファイル内により詳しい情報を出力することができます。

ヒント
ヒント: シンプルなテストについて

まずは tail -F /var/log/apache2/エラーログファイル名 を実行して、 Apache のログファイルを監視してください。監視を続けた状態で systemctl restart apache2.service を実行し、ブラウザで接続してみて出力される内容を確認すると良いでしょう。

ファイアウオールとポート

良くあるミスとして、 Apache が待ち受けているポートをファイアウオール側で開いていないという問題があります。 YaST で Apache を設定した場合は、この問題に対応するためのオプションが用意されています (詳しくは 24.2.3項 「YaST による Apache の設定」 をお読みください) 。 Apache を手作業で設定している場合は、 YaST のファイアウオールモジュールを利用して、 HTTP および HTTPS に対するファイアウオールのポートを開いてください。

これらのヒントを利用しても原因がわからない場合は、 https://httpd.apache.org/bug_report.html にある Apache のバグデータベースを利用することもできます。これに加えて、 Apache ユーザコミュニティのメーリングリストをお使いいただくこともできます。詳しくは https://httpd.apache.org/userslist.html をお読みください。

24.10 さらなる情報 Edit source

apache2-doc パッケージには、様々な言語に対応した Apache の完全マニュアルが用意されています。このパッケージは既定ではインストールされていません。最も手短にインストールするには、 zypper in apache2-doc コマンドをお使いください。インストールを行うと、 Apache のマニュアルが http://localhost/manual/ からアクセスできるようになります。また、オンライン版のマニュアルにアクセスするには、 https://httpd.apache.org/docs-2.4/ をご利用ください。また、 SUSE 固有の設定ヒントについては、 /usr/share/doc/packages/apache2/README.* 内に用意されています。

24.10.1 Apache 2.4 Edit source

Apache 2.4 での新機能の一覧については、 https://httpd.apache.org/docs/2.4/new_features_2_4.html をお読みください。また、 2.2 から 2.4 へのアップグレードに関する情報は、 https://httpd.apache.org/docs-2.4/upgrading.html にて提供されています。

24.10.2 Apache モジュール Edit source

Apache の外部モジュールに関する情報については、概要説明が 24.4.5項 「外部モジュール」 に用意されています。より詳しくお読みになりたい場合は、下記の場所をご覧ください:

mod_apparmor

https://en.opensuse.org/SDB:AppArmor

mod_php8

https://www.php.net/manual/en/install.unix.apache2.php

mod_php8 の設定に関する詳細な情報は、メインの設定ファイルである /etc/php8/apache2/php.ini 内にコメントとして記述されています。

mod_python

https://www.modpython.org/

mod_security

https://github.com/SpiderLabs/ModSecurity

24.10.3 開発 Edit source

Apache のモジュール開発に関する情報や、 Apache Web サーバ自身の開発に参加したい場合は、下記をお読みになることをお勧めします:

Apache 開発者向け情報

https://httpd.apache.org/dev/

Apache 開発者向けドキュメンテーション

https://httpd.apache.org/docs/2.4/developer/

このページを印刷