はい、承知いたしました。CentOSにおけるApache HTTP Serverのインストールと基本設定について、詳細な技術記事を作成します。約5000語となるように、各項目について掘り下げて説明します。
CentOS Apache インストール&基本設定 完全ガイド
はじめに
Webサーバーソフトウェアとして世界中で最も広く利用されているApache HTTP Server(以下、Apache)は、静的なWebサイトから動的なWebアプリケーションまで、様々な種類のコンテンツをインターネット上に公開するために不可欠な存在です。安定性、柔軟性、豊富な機能を持ち、オープンソースソフトウェアとして無償で利用できることから、多くのシステム管理者や開発者に選ばれています。
特にエンタープライズ用途やサーバー用途で高い信頼性を持つCentOS Linux(またはその後継であるCentOS Stream)は、Apacheを稼働させるプラットフォームとして非常にポピュラーです。本記事では、CentOS環境にApacheをインストールし、Webサーバーとして機能させるための基本的な設定方法について、初心者の方でも理解できるよう、詳細かつ丁寧に解説していきます。
この記事を読むことで、以下のことができるようになります。
- CentOS環境にApache HTTP Serverをインストールする。
- Apacheサービスの起動、停止、再起動、自動起動設定を管理する。
- ファイアウォールを設定し、外部からWebサーバーにアクセスできるようにする。
- Apacheの主要な設定ファイルである
httpd.conf
の構造を理解し、基本的な設定を行う。 - Webサイトの公開ディレクトリ(DocumentRoot)を設定し、テストページを表示する。
- バーチャルホストの設定方法を理解し、複数のWebサイトを一つのサーバーで運用する基礎を学ぶ。
- SELinuxとApacheの連携について理解し、必要な設定を行う。
- Apacheのログファイルを確認し、基本的なトラブルシューティングを行う。
システム管理の経験が少ない方や、これからCentOSサーバーでWebサーバーを構築しようと考えている方を対象としています。約5000語にわたる詳細な解説を通じて、Apacheの基本をしっかりと身につけましょう。
前提条件
本記事の手順を実行するためには、以下の環境が必要です。
- CentOSサーバー: CentOS 7、CentOS 8 Stream、またはその他のCentOS派生ディストリビューション(Rocky Linux, AlmaLinuxなど)がインストールされているサーバー環境。
- SSHアクセスまたはコンソールアクセス: サーバーにリモートまたは直接ログインできる手段が必要です。
- root権限またはsudo権限: ソフトウェアのインストールやシステム設定の変更には、管理者権限が必要です。本記事では
sudo
コマンドを使用することを推奨します。 - インターネット接続: パッケージのダウンロードのためにインターネット接続が必要です。
CentOSの準備とシステムアップデート
Apacheのインストールと設定を始める前に、CentOSシステムを最新の状態に保ち、必要な準備を行います。これにより、セキュリティの向上や、依存関係の問題を回避できます。
1. システムの状態確認
まず、現在のシステム情報を確認しておきましょう。
bash
hostnamectl
ip addr show
hostnamectl
はホスト名やOSのバージョンなどを表示します。ip addr show
はサーバーに割り当てられているIPアドレスを確認できます。Webサーバーにアクセスする際にこのIPアドレスが必要になります。
2. システムのアップデート
システムを最新の状態にアップデートします。これにより、既存のパッケージが更新され、セキュリティパッチが適用されます。
CentOS 7 の場合:
bash
sudo yum update -y
CentOS 8 Stream 以降(またはRocky Linux/AlmaLinuxなど)の場合:
bash
sudo dnf update -y
-y
オプションは、途中で確認メッセージが表示されても自動的に「はい」と答えるためのものです。本番環境で実行する場合は、-y
を付けずに内容を確認しながら進めることも検討してください。
アップデートには数分から数十分かかる場合があります。完了したら、必要に応じてサーバーを再起動します。
bash
sudo systemctl reboot
再起動後、再びログインしてください。
3. SELinuxの確認と一時的な無効化(推奨されないが設定時に便利)
SELinux (Security-Enhanced Linux) は、Linuxシステムに強制アクセス制御(MAC)を導入することで、セキュリティを強化する仕組みです。Apacheのようなデーモンがファイルやネットワークポートにアクセスする際、SELinuxポリシーによってその動作が制限されます。これはセキュリティ上非常に重要ですが、設定に不慣れなうちは、SELinuxの制限が原因でApacheが正常に動作しないというトラブルが発生しやすいです。
トラブルシューティングを容易にするために、設定作業中はSELinuxを一時的に Permissive
モードに設定することも考えられます。ただし、これはあくまで設定・テスト時の一時的な手段であり、本番環境では必ずEnforcingモードに戻し、必要なポリシーを設定すべきです。 本記事の後半でSELinuxについて再度触れますが、ここでは一時的に設定を緩める方法を示します。
現在のSELinuxの状態を確認します。
bash
getenforce
出力が Enforcing
であれば、SELinuxは有効になっています。Permissive
または Disabled
であれば、有効になっていません。
一時的に Permissive
モードにするコマンドは以下の通りです。
bash
sudo setenforce Permissive
この変更は即時反映されますが、システムを再起動すると元の設定(通常は /etc/selinux/config
で定義されている状態)に戻ります。永続的に変更する場合は、/etc/selinux/config
ファイルを編集する必要があります。
bash
sudo vi /etc/selinux/config
ファイル内の SELINUX=enforcing
の行を SELINUX=permissive
に変更します。永続的に Disabled
にすることも可能ですが、セキュリティリスクが大幅に増大するため非推奨です。
“`ini
This file controls the state of SELinux on the system.
SELINUX= can take one of these three values:
enforcing – SELinux security policy is enforced.
permissive – SELinux prints warnings instead of enforcing.
disabled – No SELinux policy is loaded.
SELINUX=permissive # ここを permissive または enforcing に設定
SELINUXTYPE= can take one of these two values:
targeted – Targeted processes are protected,
minimum – Modification of targeted policy. Only selected processes are protected.
mls – Multi Level Security protection.
SELINUXTYPE=targeted
“`
ファイルを保存して閉じ、システムを再起動すると設定が反映されます。設定作業中は Permissive
にしておき、Apacheが正常に動作することを確認してから Enforcing
に戻し、SELinux関連のログ(/var/log/audit/audit.log
)を確認しながら必要なポリシー設定を行うのが一般的なワークフローです。
繰り返しになりますが、本番環境ではSELinuxを無効化することは強く非推奨です。 設定が完了したら、必ず Enforcing
モードに戻し、必要なセキュリティポリシーを適用してください。
4. ファイアウォールの確認
CentOS 7以降では、ファイアウォール管理ツールとして firewalld
が標準で利用されています。Webサーバー(Apache)が外部からの接続を受け付けるためには、ファイアウォールでHTTP(デフォルトではTCP 80番ポート)およびHTTPS(デフォルトではTCP 443番ポート)のトラフィックを許可する必要があります。
firewalld
の状態を確認します。
bash
sudo systemctl status firewalld
active (running)
と表示されていれば、firewalld
は有効です。もし inactive (dead)
と表示されていれば、ファイアウォールは動作していません。セキュリティ上、ファイアウォールを有効にしておくことを強く推奨します。
有効化されていない場合は以下のコマンドで有効化・起動します。
bash
sudo systemctl enable firewalld
sudo systemctl start firewalld
ファイアウォールの設定については、Apacheのインストールとサービス起動後に改めて詳細に解説します。
Apacheのインストール
CentOSには、パッケージマネージャー (yum
または dnf
) を使ってApacheを簡単にインストールするためのパッケージが用意されています。Apacheのパッケージ名は httpd
です。
CentOS 7 の場合:
bash
sudo yum install httpd -y
CentOS 8 Stream 以降の場合:
bash
sudo dnf install httpd -y
コマンドを実行すると、httpd
パッケージとその依存関係にあるパッケージがダウンロード・インストールされます。
インストールが完了したら、以下のコマンドでインストールされたApacheのバージョンを確認できます。
bash
httpd -v
例:
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2023 11:47:01
(バージョンやビルド日時は環境によって異なります)
また、rpm
コマンドを使ってインストールされたパッケージの詳細情報を確認することもできます。
bash
rpm -qi httpd
これにより、バージョン、リリース、インストール日、サイズ、概要、説明などの詳細が表示されます。
インストールされる主なファイルとディレクトリ
httpd
パッケージをインストールすると、Apacheを運用するために必要なファイルやディレクトリが作成されます。主要なものを以下に挙げます。
- 設定ファイル群:
/etc/httpd/
conf/httpd.conf
: Apacheのメイン設定ファイル。conf.d/
: 追加設定ファイルを置くディレクトリ。ここに.conf
拡張子のファイルを置くと、httpd.conf
から自動的に読み込まれます。バーチャルホスト設定などを置くのに便利です。conf.modules.d/
: モジュール関連の設定ファイルを置くディレクトリ。
- ドキュメントルート:
/var/www/html/
- デフォルトのWebサイトコンテンツ(HTMLファイルなど)を置くディレクトリです。
- ログファイル:
/var/log/httpd/
access_log
: Webサイトへのアクセス履歴が記録されます。error_log
: Apacheのエラーメッセージが記録されます。
- 実行ファイル:
/usr/sbin/httpd
- Apacheのメイン実行ファイルです。通常は直接実行せず、systemdを通じてサービスとして管理します。
- モジュールディレクトリ:
/usr/lib64/httpd/modules/
または/usr/lib/httpd/modules/
- 動的にロードされるモジュールファイル(
.so
拡張子)が格納されています。
- 動的にロードされるモジュールファイル(
これらのディレクトリやファイルの場所は、後の設定作業で頻繁に利用します。
Apacheサービスの管理
CentOS 7以降では、systemd
というサービス管理システムが使用されています。Apacheのサービス (httpd
) も systemd
を使って起動、停止、再起動、状態確認、自動起動設定などを行います。
1. サービスの起動
Apacheサービスを起動します。
bash
sudo systemctl start httpd
エラーが出力されなければ、Apacheサービスは起動しています。
2. サービスの状態確認
Apacheサービスが正常に起動しているか確認します。
bash
sudo systemctl status httpd
active (running)
と表示されていれば、サービスは稼働中です。最後に表示されるログも確認し、エラーが出ていないか確認してください。
例:
“`
● httpd.service – The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2023-10-27 10:00:00 JST; 1min ago
Docs: man:httpd(8)
Main PID: 1234 (httpd)
Status: “Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec”
Tasks: 213 (limit: 4915)
Memory: 26.2M
CGroup: /system.slice/httpd.service
├─1234 /usr/sbin/httpd -DFOREGROUND
├─1235 /usr/sbin/httpd -DFOREGROUND
└─1236 /usr/sbin/httpd -DFOREGROUND
…
“`
3. サービスの自動起動設定
サーバーが再起動したときにApacheサービスが自動的に起動するように設定します。
bash
sudo systemctl enable httpd
これにより、システムの起動時に httpd.service
が自動的に実行されるようになります。設定が有効になったか確認するには、もう一度 status
コマンドを実行するか、以下のコマンドを使います。
bash
sudo systemctl is-enabled httpd
出力が enabled
であれば、自動起動設定は有効です。
4. サービスの停止
Apacheサービスを停止するには以下のコマンドを使います。
bash
sudo systemctl stop httpd
5. サービスの再起動
設定ファイルを変更した場合や、何らかの問題が発生した場合にサービスを再起動します。サービスを完全に終了させてから起動し直すため、一時的にサービスが停止します。
bash
sudo systemctl restart httpd
6. 設定変更の反映(リロード)
一部の設定変更(特に主要な設定ファイル以外の変更や、モジュールの有効化・無効化以外の変更)は、サービスを完全に再起動しなくても、設定ファイルを再読み込みするだけで反映させることができます。サービスを停止しないため、ユーザーへの影響を最小限に抑えられます。
設定ファイルを変更した後に、以下のコマンドでリロードを試みてください。
bash
sudo systemctl reload httpd
ただし、設定変更の内容によってはリロードでは反映されないものもあります。その場合は restart
コマンドを使用する必要があります。
ファイアウォール設定
Apacheサービスが起動しても、サーバーのファイアウォール設定によっては外部からWebサイトにアクセスできない場合があります。ここでは、firewalld
を使ってHTTP(80番ポート)およびHTTPS(443番ポート)の通信を許可する設定を行います。
現在のファイアウォール設定を確認します。
bash
sudo firewall-cmd --list-all
出力の中に services:
の項目があり、そこに http
や https
が含まれているか確認します。含まれていない場合、外部からのアクセスはブロックされます。
HTTP(80番ポート)の通信を許可します。
bash
sudo firewall-cmd --permanent --add-service=http
HTTPS(443番ポート)も利用する場合は、同様に許可します。
bash
sudo firewall-cmd --permanent --add-service=https
--permanent
オプションは、設定を永続化するためのものです。このオプションがない場合、設定は一時的なものとなり、firewalld
が再起動すると失われます。
設定を反映させるために、firewalld
をリロードします。
bash
sudo firewall-cmd --reload
再度 firewall-cmd --list-all
を実行し、services:
の項目に http
や https
が追加されていることを確認してください。これで、外部からサーバーの80番ポート(HTTP)および443番ポート(HTTPS)へのアクセスが可能になりました。
Apacheの基本設定
Apacheの主要な設定は /etc/httpd/conf/httpd.conf
ファイルで行われます。このファイルには、サーバー全体の動作に関する重要な設定が記述されています。CentOSのデフォルト設定ファイルはコメントが多く、詳細な説明が記載されているため、内容を理解するのに役立ちます。
設定ファイルを編集する際は、元のファイルをバックアップしておくことを強く推奨します。
bash
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
次に、エディタで設定ファイルを開きます。
bash
sudo vi /etc/httpd/conf/httpd.conf
httpd.conf
の基本的な構造と主要ディレクティブ
httpd.conf
は、Apacheの動作を制御するための「ディレクティブ」と呼ばれる命令の集まりで構成されています。ディレクティブは ディレクティブ名 値
の形式で記述され、オプションで複数の値を持つものや、特定の範囲(ディレクトリやファイルなど)にのみ適用されるものがあります。
主要なディレクティブの一部を解説します。
-
ServerRoot "/etc/httpd"
:
Apacheが設定ファイル、エラーファイル、ログファイルなどを探す際の基準となるディレクトリを指定します。デフォルトでは/etc/httpd
となっています。通常はこの設定を変更する必要はありません。 -
Listen 80
:
Apacheが接続を受け付けるIPアドレスとポート番号を指定します。デフォルトでは80番ポート(HTTP)で、すべてのIPアドレスからの接続を待ち受けます。特定のIPアドレスのみで待ち受ける場合はListen 192.168.1.100:80
のように指定します。複数のポートで待ち受けることも可能です(例:Listen 80
,Listen 8080
)。 -
User apache
/Group apache
:
ApacheがWebコンテンツを配信する際に使用するユーザーとグループを指定します。セキュリティ上の理由から、root権限ではなく専用のユーザー(デフォルトではapache
)で実行されます。このユーザーはWebコンテンツファイルへの読み取り権限が必要です。 -
PidFile run/httpd.pid
:
ApacheのメインプロセスのプロセスID (PID) を記録するファイルのパスを指定します。ServerRoot
からの相対パスで指定されることが多いです。 -
ServerAdmin root@localhost
:
サーバーのエラーページなどに表示される管理者のメールアドレスを設定します。ユーザーがサーバー管理者に連絡を取る際の宛先となります。 -
ServerName www.example.com:80
:
サーバー自身のホスト名とポート番号を指定します。このディレクティブを設定しないと、Apacheは起動時にシステムのホスト名から自動的に判断しようとしますが、DNS設定やネットワーク環境によっては正しく判断できず、起動時や設定チェック時に警告が表示されることがあります。警告を回避し、特にバーチャルホストを使用する場合には、正確なホスト名を設定することが推奨されます。実際の運用では、このディレクティブはコメントアウトしておき、バーチャルホスト設定内でServerName
を記述することが多いです。 -
DocumentRoot "/var/www/html"
:
デフォルトのWebサイトコンテンツが置かれるディレクトリ(ドキュメントルート)を指定します。ユーザーがhttp://サーバーのIPアドレス/
またはhttp://サーバーのホスト名/
にアクセスした際に表示されるファイルの起点となります。他のディレクトリに変更することも可能ですが、SELinuxの設定などに注意が必要です。 -
<Directory "/var/www/html">
…</Directory>
:
特定のディレクトリに対する設定を定義するブロックです。このブロック内では、そのディレクトリに対するアクセス制御、インデックスファイルの指定、.htaccess
の有効化/無効化などを設定できます。Options Indexes FollowSymLinks
: ディレクトリ内のファイル一覧表示 (Indexes
) やシンボリックリンクの追跡 (FollowSymLinks
) を許可するかどうかを設定します。セキュリティの観点からIndexes
は通常無効(-Indexes
)に設定します。AllowOverride None
: このディレクトリおよびそのサブディレクトリで.htaccess
ファイルによる設定変更を許可するかどうかを制御します。None
は一切許可しない設定です。.htaccess
を有効にするにはAll
に変更します(AllowOverride All
)。.htaccess
は柔軟性がある一方で、パフォーマンスの低下やセキュリティリスクを招く可能性があるため、必要な場合のみ有効にし、可能な限りメイン設定ファイルで設定することが推奨されます。Require all granted
: このディレクトリへのアクセス制御を設定します。all granted
はすべてのアクセスを許可します。特定のIPアドレスからのアクセスのみを許可する場合はRequire ip 192.168.1 10.0.0
のように記述します。
-
ErrorLog "logs/error_log"
:
Apacheのエラーメッセージが記録されるファイルのパスを指定します。ServerRoot
からの相対パスまたは絶対パスで指定できます。 -
CustomLog "logs/access_log" combined
:
Webサイトへのアクセス履歴が記録されるファイルのパスと、ログの形式を指定します。combined
は一般的なログ形式(アクセス元IP、ユーザー、日時、リクエスト内容、ステータスコード、送信バイト数、リファラ、ユーザーエージェントなど)です。 -
LoadModule module_name modules/module_file.so
:
Apacheに組み込むモジュールを読み込みます。デフォルト設定ファイルには多くのモジュールがコメントアウトまたは有効な状態でリストされています。必要なモジュールのみを有効にすることで、Apacheのフットプリントを小さくし、パフォーマンスやセキュリティを向上させることができます。 -
IncludeOptional conf.d/*.conf
:
/etc/httpd/conf.d/
ディレクトリ内の.conf
拡張子を持つファイルをすべて読み込むディレクティブです。この仕組みにより、メイン設定ファイルhttpd.conf
を変更することなく、個別の設定ファイルを追加・削除することで設定を管理しやすくなります。バーチャルホスト設定などは通常このディレクトリに配置します。
設定ファイルの構文チェック
設定ファイルを変更した後は、Apacheサービスを再起動する前に必ず設定ファイルの構文チェックを行うべきです。これにより、記述ミスによるサービス起動失敗を防ぐことができます。
bash
sudo apachectl configtest
または
bash
sudo httpd -t
出力が Syntax OK
であれば、構文上の問題はありません。それ以外の場合は、エラーメッセージが表示されるので、その内容を確認して修正します。
構文チェックで問題がなければ、設定を反映させるためにApacheサービスをリロードまたは再起動します。
bash
sudo systemctl reload httpd
または
bash
sudo systemctl restart httpd
ドキュメントルートの確認とテストページ
デフォルトのドキュメントルートは /var/www/html
です。インストール直後の /var/www/html
には、CentOSのテストページファイル(index.html
など)が置かれている場合があります。このテストページにWebブラウザからアクセスできるか確認してみましょう。
サーバーのIPアドレス(ip addr show
で確認したもの)を使って、Webブラウザで http://サーバーのIPアドレス/
にアクセスしてみてください。もし firewalld
の設定が正しく、Apacheサービスが起動していれば、CentOSのテストページ(または何もファイルがない場合はディレクトリリスティング)が表示されるはずです。
もし、CentOSのテストページがない場合や、独自のテストページを作成したい場合は、/var/www/html/
に簡単なHTMLファイルを作成します。
bash
sudo vi /var/www/html/index.html
ファイルに以下の内容を記述して保存します。
“`html
Hello from CentOS Apache!
This is a test page served by Apache on CentOS.
“`
このファイルが /var/www/html/index.html
として保存されていることを確認します。
bash
ls -l /var/www/html/index.html
パーミッションや所有者が問題ないか確認します。通常、ファイルの所有者はrootで、グループはrootまたはapache、パーミッションはApacheユーザー(apache)が読み取れるようになっていれば問題ありません(例: rw-r--r--
または rwxr-xr-x
)。もしパーミッションに問題がある場合は、適切に修正します。
bash
sudo chown root:apache /var/www/html/index.html # 所有者をroot、グループをapacheに設定
sudo chmod 644 /var/www/html/index.html # 所有者読み書き、グループ・その他読み取りのみ許可
WebブラウザでサーバーのIPアドレスに再度アクセスし、作成したテストページが表示されることを確認します。
よくある設定例
Apacheの柔軟性の高さは、様々なユースケースに対応できる高度な設定にあります。ここでは、基本的なWebサーバー運用でよく使われる設定例として、バーチャルホストとディレクトリへのアクセス制御について解説します。
バーチャルホスト (Virtual Hosts)
一つのサーバー上で複数のドメイン名(例: www.website1.com
, blog.website2.net
)やIPアドレスで異なるWebサイトを公開したい場合に、「バーチャルホスト」機能を使用します。これにより、サーバーのリソースを有効活用できます。
CentOSでは、バーチャルホストの設定は通常 /etc/httpd/conf.d/
ディレクトリ内に個別の .conf
ファイルとして作成します。これにより、メイン設定ファイル httpd.conf
をシンプルに保ち、設定の管理を容易にできます。httpd.conf
には IncludeOptional conf.d/*.conf
というディレクティブがデフォルトで記述されているため、このディレクトリに置かれた .conf
ファイルは自動的に読み込まれます。
バーチャルホスト設定ファイル作成の手順例:
-
ドキュメントルートディレクトリの作成:
各バーチャルホストごとに、専用のドキュメントルートディレクトリを作成します。ここでは例としてwebsite1.com
用のディレクトリを作成します。bash
sudo mkdir -p /var/www/website1.com/html
sudo mkdir -p /var/www/website1.com/logshtml
ディレクトリにWebサイトのコンテンツを、logs
ディレクトリにそのバーチャルホスト専用のアクセスログ・エラーログを格納することにします。 -
ディレクトリの所有者とパーミッション設定:
Apacheプロセスがこれらのディレクトリにアクセスできるように、所有者とパーミッションを設定します。Apacheを実行しているユーザー(デフォルトはapache
)に読み取り権限が必要です。コンテンツをアップロードするFTPユーザーなどに書き込み権限を与える場合は、グループを適切に設定します。bash
sudo chown -R apache:apache /var/www/website1.com/html
sudo chmod -R 755 /var/www/website1.com/html # 所有者読み書き実行、グループ・その他読み取り実行許可
sudo chown -R apache:apache /var/www/website1.com/logs
sudo chmod -R 755 /var/www/website1.com/logs
注意: SELinuxがEnforcingモードの場合、これらの新しいディレクトリに対して適切なSELinuxコンテキストを設定する必要があります。これについては後述します。 -
テストHTMLファイルの作成:
各バーチャルホストのドキュメントルートに、識別のための簡単なHTMLファイルを作成します。bash
sudo echo "<h1>Welcome to website1.com</h1>" > /var/www/website1.com/html/index.html -
バーチャルホスト設定ファイルの作成:
/etc/httpd/conf.d/
ディレクトリにバーチャルホスト用の設定ファイルを作成します。ファイル名は任意ですが、バーチャルホスト名を含めると管理しやすくなります(例:website1.com.conf
)。bash
sudo vi /etc/httpd/conf.d/website1.com.confファイルに以下の内容を記述します。
“`apacheconf
ServerAdmin [email protected]
ServerName website1.com
ServerAlias www.website1.com
DocumentRoot /var/www/website1.com/html
ErrorLog /var/www/website1.com/logs/error_log
CustomLog /var/www/website1.com/logs/access_log combined<Directory "/var/www/website1.com/html"> Options Indexes FollowSymLinks AllowOverride None # 必要に応じて All に変更 Require all granted </Directory>
“`<VirtualHost *:80>
: このブロックがバーチャルホストの設定であることを示します。*:80
は、サーバーのすべてのIPアドレスの80番ポートへのアクセスに対してこの設定を適用することを意味します(名前ベースバーチャルホストの場合)。IPアドレスベースのバーチャルホストにする場合は、特定のIPアドレスを指定します(例:<VirtualHost 192.168.1.100:80>
)。ServerAdmin
: このバーチャルホストの管理者のメールアドレス。ServerName
: このバーチャルホストにアクセスするためのメインのホスト名(ドメイン名)。ServerAlias
:ServerName
以外の別名。複数のドメイン名やサブドメインで同じサイトにアクセスさせたい場合に指定します。DocumentRoot
: このバーチャルホストのコンテンツが置かれるディレクトリ。ErrorLog
,CustomLog
: このバーチャルホスト専用のログファイル。メインのログファイルとは別に記録することで、管理が容易になります。<Directory>
ブロック: このバーチャルホストのドキュメントルートディレクトリに対する設定です。メイン設定ファイルと同様のディレクティブが使用できます。
-
設定ファイルの構文チェック:
作成した設定ファイルを含め、Apache全体の設定ファイルの構文をチェックします。bash
sudo apachectl configtestSyntax OK
と表示されれば問題ありません。 -
Apacheサービスのリロードまたは再起動:
新しい設定を反映させます。bash
sudo systemctl reload httpd -
ホスト名の解決設定:
クライアントPCからwebsite1.com
やwww.website1.com
というホスト名でサーバーにアクセスするためには、これらのホスト名がサーバーのIPアドレスに解決される必要があります。- インターネット上の公開サイトの場合は、DNSサーバーにAレコードやCNAMEレコードを設定します。
-
ローカルネットワーク内でのテスト目的であれば、クライアントPCの
hosts
ファイル(WindowsならC:\Windows\System32\drivers\etc\hosts
、Linux/macOSなら/etc/hosts
)に以下の形式でサーバーのIPアドレスとホスト名を追記します。サーバーのIPアドレス website1.com www.website1.com
例:
192.168.1.100 website1.com www.website1.com
-
Webブラウザからのアクセス確認:
クライアントPCのWebブラウザからhttp://website1.com/
またはhttp://www.website1.com/
にアクセスし、作成したテストページが表示されることを確認します。
複数のバーチャルホストを設定する場合は、同様の手順でドキュメントルートディレクトリと /etc/httpd/conf.d/
内の設定ファイルを作成します。
ディレクトリへのアクセス制御 (Directory Access Control)
特定のディレクトリへのアクセスを制限したい場合があります。例えば、管理画面用のディレクトリや、特定のユーザーにのみ公開したいディレクトリなどです。<Directory>
ディレクティブ内で Require
ディレクティブを使用することで、様々な条件でアクセスを制御できます。
-
すべてのアクセスを許可:
apacheconf
<Directory "/path/to/directory">
Require all granted
</Directory> -
すべてのアクセスを拒否:
apacheconf
<Directory "/path/to/directory">
Require all denied
</Directory> -
特定のIPアドレスからのアクセスのみ許可:
apacheconf
<Directory "/path/to/directory">
Require ip 192.168.1.100
Require ip 10.0.0.0/8 # サブネット全体を許可
</Directory> -
特定のホスト名からのアクセスのみ許可: (DNS逆引きが必要となり、パフォーマンスに影響する場合がある)
apacheconf
<Directory "/path/to/directory">
Require host example.com sub.example.org
</Directory>
これらの Require
ディレクティブは <Directory>
だけでなく、<Files>
(特定のファイル)、<Location>
(特定のURLパス)ディレクティブ内でも使用できます。
ユーザー認証 (.htaccess と htpasswd)
より詳細なアクセス制御として、BASIC認証やDIGEST認証を使ってユーザー名とパスワードによる認証を求めることも可能です。これは <Directory>
ディレクティブ内で設定するか、または .htaccess
ファイルを使用して設定できます。
.htaccess
を使用する場合、まず該当ディレクトリの <Directory>
設定で AllowOverride AuthConfig
または AllowOverride All
を有効にする必要があります。
基本的なBASIC認証の設定手順例:
-
パスワードファイルの作成:
htpasswd
コマンドを使って、ユーザー名と暗号化されたパスワードを格納するファイルを作成します。初回作成時は-c
オプションを使用します。bash
sudo htpasswd -c /etc/httpd/.htpasswd username
username
は任意のユーザー名です。パスワードの入力を求められるので設定します。
注意:/etc/httpd/
ディレクトリに直接置くのは、Apacheが読み取れる場所であればどこでも構いません。ただし、Webから直接アクセスできない場所に配置することが重要です。/etc/httpd/
ディレクトリはデフォルトではWebアクセスできません。2人目以降のユーザーを追加する場合は、
-c
オプションを外します(-c
は既存ファイルを上書きしてしまうため)。bash
sudo htpasswd /etc/httpd/.htpasswd anotheruser -
Apache設定(または .htaccess)での認証設定:
-
Apache設定ファイルの場合 (
httpd.conf
または/etc/httpd/conf.d/*.conf
)apacheconf
<Directory "/path/to/protected/directory">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/httpd/.htpasswd
Require valid-user
</Directory> -
.htaccess ファイルの場合 (
/path/to/protected/directory/.htaccess
)apacheconf
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/httpd/.htpasswd
Require valid-user
この場合、該当ディレクトリの<Directory>
設定でAllowOverride AuthConfig
またはAllowOverride All
が有効になっている必要があります。 -
AuthType Basic
: 認証方法としてBASIC認証を指定します。 AuthName "Restricted Area"
: 認証ダイアログに表示されるレルム名(認証領域の名前)を指定します。AuthUserFile /etc/httpd/.htpasswd
: パスワードファイルの場所を指定します。Require valid-user
: パスワードファイルに登録されている有効なユーザーであれば誰でもアクセスを許可します。特定のユーザーのみを許可する場合はRequire user username anotheruser
のように記述します。
-
-
設定ファイルの構文チェックとリロード/再起動:
Apache設定ファイルを変更した場合は、構文チェックを行い、サービスをリロードまたは再起動します。.htaccess
ファイルの場合は、AllowOverride
が適切に設定されていればリロードは不要です。
SELinuxの設定
前述の通り、SELinuxはApacheの動作に影響を与えます。特に、デフォルトのドキュメントルート /var/www/html
以外の場所にWebコンテンツを置いたり、ログファイルを別の場所に保存したり、特定のポートで待ち受けたりする場合など、Apacheの標準的な動作から外れる設定を行った際には、SELinuxのポリシーによってアクセスが拒否される可能性があります。
SELinuxがEnforcingモードで有効になっている場合、Apacheに関連するパーミッション問題が発生したら、SELinuxが原因である可能性が高いです。その場合、/var/log/audit/audit.log
ファイルに拒否された操作に関するログが出力されます。
ログを確認します。
bash
sudo tail /var/log/audit/audit.log
Apache関連のログには httpd
というキーワードが含まれていることが多いです。例えば、新しいドキュメントルート /var/www/website1.com/html
にApacheがアクセスできない場合、audit.log
には以下のようなログが出力される可能性があります(出力形式はSELinuxのバージョンや設定によって異なります)。
type=AVC msg=audit(1698482400.123:456): avc: denied { read } for pid=1234 comm="httpd" name="html" dev="dm-0" ino=12345 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_dir_t:s0 tclass=dir
このログは、httpd_t
コンテキスト(Apacheプロセス)が user_home_dir_t
コンテキストを持つディレクトリ (html
) に対して read
操作を拒否されたことを示しています。つまり、Apacheがユーザーのホームディレクトリに置かれたファイルを読むことをSELinuxが阻止した例です。
ApacheがWebコンテンツやログにアクセスするために必要なSELinuxコンテキストは httpd_sys_content_t
や httpd_log_t
などです。新しいディレクトリやファイルを作成した場合、それらのコンテキストが自動的に付与されないことがあります。
SELinuxコンテキストを確認するには ls -Z
コマンドを使用します。
bash
ls -Z /var/www/html/
ls -Z /var/www/website1.com/html/
/var/www/html/
の出力例:
-rw-r--r--. apache apache system_u:object_r:httpd_sys_content_t:s0 index.html
新しいドキュメントルートの出力例 (SELinux設定前):
drwxr-xr-x. apache apache unconfined_u:object_r:user_home_dir_t:s0 html
SELinuxコンテキストが異なることがわかります。
新しいディレクトリやファイルに正しいSELinuxコンテキストを付与するには、chcon
コマンドを一時的な変更に、semanage fcontext
コマンドを永続的な変更に使用します。
一時的なコンテキスト変更 (chcon
):
再起動すると元に戻ります。テスト用に使用します。
“`bash
新しいドキュメントルートディレクトリとその内容に httpd_sys_content_t を付与
sudo chcon -R -t httpd_sys_content_t /var/www/website1.com/html
新しいログディレクトリとその内容に httpd_log_t を付与
sudo chcon -R -t httpd_log_t /var/www/website1.com/logs
“`
変更後、ls -Z
でコンテキストが httpd_sys_content_t
や httpd_log_t
になっていることを確認し、Apacheを再起動/リロードして動作を確認します。
永続的なコンテキスト変更 (semanage fcontext
):
設定は /etc/selinux/targeted/contexts/files/file_contexts.local
に保存され、restorecon
コマンドで適用されます。システム再起動後も有効です。
“`bash
新しいドキュメントルートのパスを httpd_sys_content_t として定義に追加
/var/www/ 配下のwebsite1.com/html ディレクトリとそのサブディレクトリ、ファイルを対象とする
sudo semanage fcontext -a -t httpd_sys_content_t “/var/www/website1.com/html(/.*)?”
新しいログディレクトリのパスを httpd_log_t として定義に追加
sudo semanage fcontext -a -t httpd_log_t “/var/www/website1.com/logs(/.*)?”
``
-aは追加、
-t` はタイプを指定します。正規表現を使って対象パスを指定します。
定義を追加したら、restorecon
コマンドでファイルシステム上の実際のコンテキストを定義に従って更新します。
“`bash
定義に従って /var/www/website1.com/html 配下のコンテキストを再設定
sudo restorecon -R -v /var/www/website1.com/html
定義に従って /var/www/website1.com/logs 配下のコンテキストを再設定
sudo restorecon -R -v /var/www/website1.com/logs
``
-Rは再帰的に、
-v` は変更されたファイルを表示します。
restorecon
実行後、ls -Z
でコンテキストが正しく変更されていることを確認し、Apacheを再起動/リロードして動作を確認します。
他にも、Apacheが特定のポートで待ち受ける場合(デフォルトの80/tcp, 443/tcp以外)や、スクリプトを実行する場合(CGI, PHPなど)には、SELinuxのポート設定 (semanage port
) やブール値設定 (setsebool
) が必要になる場合があります。
SELinuxは複雑ですが、正しく設定することでサーバーのセキュリティを大幅に向上させることができます。SELinux関連のトラブルシューティングは、audit.log
の確認から始めるのが鉄則です。
ログファイルの確認
Apacheが正常に稼働しているか、どのようなアクセスがあるか、エラーが発生していないかなどを把握するために、ログファイルの確認は非常に重要です。 Apacheのログファイルはデフォルトで /var/log/httpd/
ディレクトリに格納されます。
/var/log/httpd/access_log
: Webサイトへのすべてのアクセス記録が保存されます。/var/log/httpd/error_log
: Apache自体のエラー、警告、その他の情報メッセージが保存されます。
バーチャルホストを設定した場合は、それぞれのバーチャルホスト設定ファイルで指定した場所にログファイルが作成されます。
access_log
の確認
access_log
のデフォルト形式(combined形式)は以下のようになっています。
アクセス元IP - - [日時] "HTTPメソッド リクエストパス プロトコルバージョン" ステータスコード 送信バイト数 "リファラ" "ユーザーエージェント"
例:
192.168.1.1 - - [26/Oct/2023:10:30:00 +0900] "GET /index.html HTTP/1.1" 200 1234 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
このログから、いつ、誰が(IPアドレス)、どのページに、どのような方法(GET/POSTなど)でアクセスし、結果はどうだったか(ステータスコード)、どれくらいのデータを送信したか、どのページから来たか(リファラ)、どのブラウザを使ったか(ユーザーエージェント)などがわかります。
ログファイルは時間とともに大きくなるため、通常はログローテーション(古いログファイルを圧縮・削除する仕組み)が設定されています。
ログファイルの末尾をリアルタイムで監視するには tail
コマンドを使用します。
bash
sudo tail -f /var/log/httpd/access_log
新しいアクセスが発生すると、ログが画面にリアルタイムで表示されます。
特定の情報を検索したい場合は grep
コマンドが便利です。
bash
sudo grep "GET /index.html" /var/log/httpd/access_log # index.html への GET リクエストを検索
sudo grep " 404 " /var/log/httpd/access_log # ステータスコード 404 (Not Found) のアクセスを検索
error_log
の確認
error_log
には、Apacheの起動・停止時のメッセージ、設定ファイルのエラー、ファイルが見つからないなどの問題、CGIスクリプトのエラーなどが記録されます。Webサイトが表示されない、特定の機能が動作しないなどのトラブルが発生した場合、まずこのエラーログを確認することがトラブルシューティングの第一歩となります。
エラーログの形式は、通常以下のようになっています。
[日時] [ログレベル] [クライアントIP] [モジュール名] メッセージ
例:
[Thu Oct 26 10:30:00.123456 2023] [core:notice] [pid 1234] AH00094: Command line: "/usr/sbin/httpd -D FOREGROUND"
[Thu Oct 26 10:35:00.123456 2023] [authz_core:error] [pid 5678:tid 9012] [client 192.168.1.100:12345] AH01630: client denied by server configuration: /var/www/html/restricted/
[Thu Oct 26 10:40:00.123456 2023] [autoindex:error] [pid 3456:tid 7890] [client 192.168.1.200:54321] AH01276: Cannot serve directory /var/www/html/some_directory/: No matching DirectoryIndex (index.html,index.php) found, and server-generated directory index forbidden by Options directive
これらのログから、エラーが発生した日時、重要度(notice, errorなど)、原因となったクライアントIP、関連するモジュール、そして具体的なエラーメッセージを把握できます。
エラーログも tail
コマンドや grep
コマンドを使って確認します。
bash
sudo tail -f /var/log/httpd/error_log
sudo grep "error" /var/log/httpd/error_log # "error" レベルのログを検索
パフォーマンスとセキュリティに関するヒント
基本的な設定が完了したら、運用にあたってパフォーマンスやセキュリティを考慮した設定を検討しましょう。
-
KeepAlive の設定:
httpd.conf
のKeepAlive On
ディレクティブは、一度確立したクライアントとの接続を、そのクライアントからの後続のリクエストのために維持するかどうかを制御します。On
に設定することで、複数のリクエストがある場合のオーバーヘッドを削減し、パフォーマンスを向上させることができます。関連するMaxKeepAliveRequests
(一つの接続で許可する最大リクエスト数) やKeepAliveTimeout
(次のリクエストを待つ最大時間) も適切に設定します。 -
MPM (Multi-Processing Module) の選択と設定:
Apacheは、クライアントからの接続をどのように処理するかを決定するMPMモジュールを使用します。主なMPMにはprefork
,worker
,event
があります。CentOS 7ではprefork
がデフォルト、CentOS 8 Stream以降ではevent
がデフォルトのことが多いです。prefork
: 各接続を単一のプロセスで処理します。安全性が高いですが、メモリ消費量が大きくなる傾向があります。PHPを mod_php で利用する場合はこれが必要です。worker
: 各プロセスが複数のスレッドを作成して接続を処理します。prefork
よりメモリ効率が良いですが、スレッドセーフなモジュールが必要です。event
:worker
と似ていますが、KeepAlive接続の処理方法を改善し、より多くの接続を効率的に処理できます。高い同時接続数が予想される場合に適しています。
使用するMPMは/etc/httpd/conf.modules.d/
内の設定ファイル(例:00-mpm.conf
)で指定・設定されます。サーバーの負荷や利用するモジュール(例: PHPの実行方法)に合わせて適切なMPMを選択し、StartServers
,MinSpareServers
,MaxSpareServers
,MaxRequestWorkers
(旧MaxClients
),ThreadsPerChild
,MaxConnectionsPerChild
などのパラメータをチューニングすることで、パフォーマンスを最適化できます。
-
不要なモジュールの無効化:
httpd.conf
や/etc/httpd/conf.modules.d/
でLoadModule
ディレクティブを使ってロードされるモジュールは、必要なものだけに限定することで、Apacheの起動時間短縮、メモリ使用量削減、攻撃対象領域の縮小につながります。使用しないモジュールは#
でコメントアウトして無効にすることを検討しましょう。 -
Server Signature の無効化:
Apacheはデフォルトで、エラーページやディレクトリインデックスのフッターにサーバーのバージョン情報などの署名を表示します。これはセキュリティ上のリスクとなり得ます。httpd.conf
でServerSignature Off
と設定することで無効化できます。 -
Server Tokens の制限:
ServerSignature
と同様に、HTTPレスポンスヘッダーに含まれるサーバー情報の詳細度を制御します。ServerTokens Prod
と設定することで、最小限の情報のみを通知するようになります。 -
ディレクトリインデックスの無効化:
ディレクトリ内にindex.html
やindex.php
のようなDirectoryIndex
で指定されたファイルが存在しない場合に、ディレクトリ内のファイル一覧を表示するかどうかを制御します。セキュリティ上、通常はファイル一覧の表示は望まれていないため、<Directory>
ディレクティブ内のOptions
で-Indexes
を指定して無効化することを強く推奨します。 -
SSL/TLS (HTTPS) の設定:
セキュアな通信を提供するために、SSL/TLS証明書を設定してHTTPS(443番ポート)でアクセスできるようにすることは現代のWebサイト運用において必須です。これはmod_ssl
モジュールを使用して設定しますが、証明書の取得方法(Let’s Encryptなど)や設定内容はやや複雑になるため、本記事の基本設定の範囲を超えます。別の機会に詳細を学ぶことをお勧めします。 -
定期的なアップデート:
Apacheや関連するパッケージの脆弱性が日々発見されています。システム全体のアップデートを定期的に実行し、Apacheを最新の状態に保つことは、セキュリティを維持するために非常に重要です。
トラブルシューティング
Apacheのインストールや設定中に問題が発生した場合の一般的なトラブルシューティング方法です。
-
Apacheサービスが起動しない:
sudo systemctl status httpd
コマンドでサービスの状態を確認し、エラーメッセージを確認します。sudo journalctl -xe
コマンドでsystemdのジャーナルログを確認し、httpd.service
に関連する詳細なエラーメッセージを探します。sudo apachectl configtest
またはsudo httpd -t
で設定ファイルの構文チェックを行います。構文エラーがあれば、表示される行番号などを参考に修正します。/var/log/httpd/error_log
ファイルを確認し、Apache自身が出力したエラーメッセージを探します。- SELinuxが原因でないか確認します。SELinuxを一時的にPermissiveモードにして (
sudo setenforce Permissive
) 再起動し、起動すればSELinuxが原因です。audit.log
を確認して適切なポリシー設定を行います。
-
Webサイトにアクセスできない (ブラウザでページが表示されない):
- Apacheサービスが稼働しているか確認します (
sudo systemctl status httpd
)。 - ファイアウォール設定を確認します (
sudo firewall-cmd --list-all
)。80番ポート(http)と443番ポート(https)が許可されているか確認します。 - SELinuxが原因でないか確認します。特にカスタムドキュメントルートやログディレクトリを設定した場合、適切なSELinuxコンテキストが付与されているか確認します (
ls -Z
)。問題があればchcon
またはsemanage
/restorecon
で修正します。 - Apache設定ファイル (
httpd.conf
,/etc/httpd/conf.d/*.conf
) のListen
,ServerName
,DocumentRoot
の設定が正しいか確認します。 - クライアントPCからサーバーのIPアドレスへのネットワーク接続が確立されているか確認します (
ping サーバーのIPアドレス
)。 - DNS設定やクライアントPCの
hosts
ファイル設定が正しいか確認します。 /var/log/httpd/access_log
とerror_log
を確認します。access_log
にリクエストの記録がない場合、Apacheにリクエストが到達していません(ネットワーク、ファイアウォール、DNSの問題の可能性)。error_log
にエラーが出力されていないか確認します。
- Apacheサービスが稼働しているか確認します (
-
画像やCSSファイルが表示されない (HTMLは表示される):
- ファイルがドキュメントルート内の正しいパスに配置されているか確認します。
- ファイルやディレクトリのパーミッションが、Apacheユーザー(
apache
)が読み取れるように設定されているか確認します (ls -l
)。必要に応じてchmod
でパーミッションを変更します。 - ファイルやディレクトリのSELinuxコンテキストが正しいか確認します (
ls -Z
)。必要に応じてchcon
またはsemanage
/restorecon
で修正します。
-
ディレクトリインデックスが表示されてしまう:
<Directory>
ディレクティブ内のOptions
設定を確認し、Indexes
が含まれていないか確認します。もし含まれていれば-Indexes
に変更します。- ドキュメントルートディレクトリに
DirectoryIndex
で指定されたファイル(デフォルトではindex.html
,index.php
など)が存在するか確認します。
トラブルシューティングは、問題の原因を一つずつ潰していく作業です。まずはログを確認し、そこから得られる情報を元に、関連する設定ファイルやシステム設定(ファイアウォール、SELinux、パーミッション)をチェックしていくのが効果的です。
まとめ
本記事では、CentOS環境にApache HTTP Serverをインストールし、Webサーバーとして機能させるための基本的な設定手順について詳細に解説しました。パッケージ管理システムを使ったインストールから、systemd
によるサービス管理、firewalld
によるファイアウォール設定、そして最も重要な設定ファイルである httpd.conf
の構造と主要ディレクティブの設定方法について学びました。
さらに、バーチャルホストによる複数サイトの運用方法、ディレクトリへのアクセス制御、SELinuxとApacheの連携、そしてログファイルの確認方法や基本的なトラブルシューティングについても触れました。
Apacheは非常に高機能で柔軟なWebサーバーであり、本記事で解説した内容は基本的な設定のほんの一部に過ぎません。より高度な設定や機能を利用することで、様々な要件に対応できます。
次のステップとして:
- SSL/TLSによるHTTPS化: Webサイトのセキュリティを確保し、信頼性を高めるために必須です。Let’s Encryptなどの無償証明書発行サービスと
mod_ssl
を利用した設定方法を学ぶことをお勧めします。 - 動的コンテンツの実行環境設定: PHP、Python (WSGI)、Ruby (Passenger) などのスクリプト言語で作成された動的WebアプリケーションをApacheで実行するための設定(mod_php, mod_wsgi, Passengerなど)を学びます。
- パフォーマンスチューニング: MPM設定の最適化、キャッシュ設定 (
mod_cache
)、圧縮 (mod_deflate
) など、サーバーの負荷状況に応じたパフォーマンス向上のための設定を学びます。 - セキュリティ強化: 不要なモジュールの無効化、アクセス制御の強化、脆弱性対策など、より安全なサーバー運用に向けた設定を学びます。
- モニタリングと運用管理: Apacheの稼働状況やアクセス状況を継続的に監視し、安定稼働を維持するためのツールや方法を学びます。
CentOSにおけるApacheのインストールと基本設定は、サーバー管理の基礎となる重要なスキルです。本記事が、皆様のCentOSサーバーでのWebサーバー構築と運用の一助となれば幸いです。
より詳細な情報や最新の設定方法については、Apache公式ドキュメントやCentOSのドキュメントを参照することをお勧めします。
- Apache HTTP Server Documentation: https://httpd.apache.org/docs/
- CentOS Documentation: https://docs.centos.org/
これで、CentOSにおけるApacheのインストールと基本設定に関する約5000語の詳細な記事が完成しました。各項目について、コマンド例、設定例、解説を網羅し、初心者の方でも手順を追えるように記述しました。