記事タイトル: CentOSにApacheを導入する全手順:初心者から実践者まで対応する詳細解説(約5000語)
導入
WebサイトやWebアプリケーションをインターネット上に公開する上で不可欠な存在であるWebサーバー。その中でも、Apache HTTP Serverは、長年にわたり世界で最も広く利用されているオープンソースのWebサーバーソフトウェアです。その高い安定性、堅牢性、豊富な機能、そして巨大なコミュニティによるサポート体制から、個人ブログから大規模なエンタープライズシステムまで、幅広い用途で選択され続けています。
この記事では、サーバー用途として広く利用されているLinuxディストリビューションであるCentOSに、Apache HTTP Serverを導入するための全手順を、初心者の方でも理解できるよう詳細かつ丁寧に解説します。単にコマンドを実行するだけでなく、各ステップの目的、設定項目の意味、そしてCentOS環境特有のセキュリティ機能(FirewallやSELinux)との連携についても深く掘り下げて説明します。最終的に、Apacheが正常に動作し、基本的なWebコンテンツを配信できる状態を目指します。CentOS環境でのWebサーバー構築を目指す全ての方にとって、この記事が網羅的で実践的なガイドとなることを願っています。
1. Apache HTTP Serverとは? Webサーバーの役割とApacheの特徴
Webサーバーの最も基本的な役割は、インターネット経由でクライアント(主にWebブラウザ)から送信されるHTTPリクエストを受け取り、それに応じたHTTPレスポンスを返すことです。このレスポンスには、要求されたWebページ(HTMLファイル)、画像、CSS、JavaScriptファイル、その他のリソースなどが含まれます。クライアントは受け取ったレスポンスを解釈し、ユーザーにWebページとして表示します。
Apache HTTP Server(以下、Apache)は、このWebサーバーとしての役割を担うソフトウェアの一つです。1995年に最初のバージョンが公開されて以来、オープンソースソフトウェアとして開発が進められ、その歴史の長さから多くのシステムで採用されてきました。
なぜApacheを選ぶのか?他の主要Webサーバーとの比較
現代のWebサーバー市場には、Apacheの他にNginx、LiteSpeed、IIS(Windows Server)など、様々な選択肢があります。それぞれに強みがありますが、CentOS環境でApacheを選ぶことには以下のようなメリットがあります。
- 普及率と豊富な情報: 長らくWebサーバー市場のデファクトスタンダードであったため、インターネット上にはApacheに関する情報、設定例、トラブルシューティング情報が非常に豊富に存在します。困ったときに解決策を見つけやすいのは大きな強みです。
- 安定性と信頼性: 長い運用実績と多くのユーザーによる利用により、非常に安定して動作します。エンタープライズ環境でも安心して利用できます。
- 高い拡張性(モジュール): Apacheはモジュール構造になっており、必要に応じて様々な機能をアドオンできます。SSL/TLS (mod_ssl)、URL書き換え (mod_rewrite)、プロキシ (mod_proxy)、ユーザー認証 (mod_authz_coreなど)、様々な言語のサポート (mod_php, mod_perl, mod_pythonなど) など、豊富なモジュールが利用可能です。
.htaccess
ファイルによる柔軟な設定: ディレクトリごとに.htaccess
ファイルを作成することで、メインの設定ファイルを変更せずに、アクセス制限やURL書き換え、エラーページの設定などを行うことができます。これは特に共有ホスティング環境や、特定のディレクトリのみ異なる設定を適用したい場合に便利です。ただし、パフォーマンスへの影響やセキュリティリスクの観点から、可能な限りメイン設定ファイルで設定することが推奨される場合もあります。- 成熟したコミュニティ: Apache Software Foundationを中心に活発な開発とコミュニティ活動が行われており、セキュリティパッチの提供なども継続的に行われています。
一方、Nginxは、特に静的コンテンツの配信や大量の同時接続処理において、Apacheよりも軽量かつ高速であると言われることがあります。Nginxはイベント駆動型アーキテクチャを採用しており、少ないリソースで高パフォーマンスを発揮するのに長けています。Apacheはプロセスベースまたはスレッドベースのアーキテクチャ(MPM: Multi-Processing Module)を採用しており、特に大量の同時接続が発生する場面でリソース消費が増える傾向がありました。しかし、Apacheも近年のMPM(event MPMなど)の改善により、パフォーマンスは向上しており、Nginxとの差は用途によっては小さくなっています。
CentOSのようなRed Hat系のOSでは、Apache(httpdパッケージ)が標準的なWebサーバーとして位置づけられてきました。システムのパッケージ管理システムとの親和性も高く、導入や管理が比較的容易です。したがって、特別な要件がない限り、ApacheはCentOSでWebサーバーを構築する上で依然として非常に合理的で有力な選択肢と言えます。
この記事では、このApacheをCentOSに導入し、基本的な設定を行う手順を詳しく見ていきます。
2. 前提条件と事前準備
Apacheのインストールと設定に進む前に、作業を行うサーバー環境に関する前提条件と、必要な事前準備を確認しておきます。
2.1. CentOS環境
- OSバージョン: この記事では主にCentOS 7およびCentOS 8を想定しています。これらのバージョンは、RHEL (Red Hat Enterprise Linux) をベースとしており、Apache (httpd) のパッケージ管理やシステムサービス管理 (systemd) の方法が共通しています。CentOS Stream、Rocky Linux、AlmaLinuxなど、RHELのクローンOSでも同様の手順が適用可能です。
- サーバーへのアクセス: 作業を行うサーバーに、SSHなどの方法でコマンドラインからアクセスできる必要があります。リモートサーバーの場合は、SSHクライアントソフトウェア(Tera Term, PuTTY, OpenSSHなど)が必要です。
- 管理者権限: システムの設定変更やパッケージのインストールには、rootユーザー権限またはsudoコマンドを実行できる一般ユーザー権限が必要です。通常は、sudoを利用できる一般ユーザーアカウントでログインし、必要に応じてsudoを付けてコマンドを実行することを推奨します。
- インターネット接続: パッケージのダウンロードやシステムのアップデートのために、サーバーがインターネットに接続できる必要があります。
2.2. 基本的なLinuxコマンドの知識
コマンドラインでの作業が主体となるため、以下の基本的なコマンドの操作に慣れているとスムーズに進められます。
ssh
: リモートサーバーにセキュアに接続するコマンド。sudo
: 管理者権限でコマンドを実行するためのコマンド。cd
: 現在の作業ディレクトリを移動するコマンド。ls
: ディレクトリの内容(ファイルやサブディレクトリ)を一覧表示するコマンド。オプション-l
で詳細表示、-a
で隠しファイルも表示、-Z
でSELinuxコンテキストを表示など。cat
: ファイルの内容を標準出力に表示するコマンド。less
,more
: ファイルの内容をページ単位で表示するコマンド。長いファイルを見るのに便利。vi
またはvim
,nano
: テキストファイルを編集するコマンド。vim
は多機能なエディタ、nano
はシンプルで初心者向け。どちらか使い慣れている方、または好きな方を使用します。systemctl
: systemdサービスマネージャーを操作するコマンド。サービスの起動、停止、再起動、状態確認、自動起動設定などに使用します。yum
またはdnf
: Red Hat系のLinuxで使われるパッケージ管理システム。ソフトウェアのインストール、アップデート、削除などを行います。CentOS 7ではyum
、CentOS 8以降ではdnf
が標準ですが、多くの場合はyum
コマンドでもdnf
が内部的に使用されます。
2.3. システムのアップデート
ソフトウェアをインストールする前に、システムのパッケージ情報を最新の状態にし、既存のパッケージをアップデートしておくことは、セキュリティの観点からも、依存関係の問題を回避する上でも非常に重要です。
以下のコマンドを実行して、システム全体をアップデートします。
bash
sudo yum update -y
CentOS 8 以降をお使いの場合は、代わりに dnf
コマンドを使用しても構いません。
bash
sudo dnf update -y
-y
オプションは、アップデートの途中で表示される「実行しますか?」といった確認メッセージに対して、全て自動的に yes
と答えるためのものです。これにより、アップデートプロセスを中断せずに完了させることができます。ただし、大規模なアップデートの場合や、特定のパッケージのバージョンを維持したい場合などは、-y
オプションを付けずに実行し、アップデート内容を十分に確認してから進める方が安全な場合もあります。
2.4. SELinuxとFirewallについて
CentOSを含む多くのエンタープライズ向けLinuxディストリビューションでは、システムのセキュリティを強化するために、SELinux (Security-Enhanced Linux) と Firewalld という機能がデフォルトで有効になっています。これらの機能は、Webサーバー(Apache)の動作に直接影響を与えるため、正しく理解し、必要に応じて設定を行う必要があります。
- SELinux: 強制アクセス制御 (MAC) システムです。従来のユーザー/グループ/その他の権限システム(DAC: Discretionary Access Control)とは異なり、あらかじめ定義されたポリシーに基づいて、プロセスがどのファイルやディレクトリにアクセスできるか、どのポートに接続できるか、どのような操作を実行できるかなどを細かく制限します。Webサーバープロセス(httpd)が、設定ファイル、Webコンテンツファイル、ログファイル、CGIスクリプト、ネットワークポートなどにアクセスする際、SELinuxポリシーによってそのアクセスが許可されているかどうかがチェックされます。デフォルトのポリシーでは、Apacheが標準的な方法で動作するよう設定されていますが、例えば
DocumentRoot
を変更したり、CGIを使ったり、外部に接続したりするなど、非標準的な使い方をする場合にはSELinuxポリシーの変更が必要になることがあります。 - Firewall (firewalld): パケットフィルタリングルールを管理するデーモンです。ネットワークインターフェースを「ゾーン」に分割し、ゾーンごとに異なるファイアウォールルールを設定できます。外部からサーバーの特定のポートへの接続を許可したり拒否したりすることで、不正なアクセスからサーバーを保護します。Webサーバーとして機能するためには、インターネットからのHTTP(通常80番ポート)およびHTTPS(通常443番ポート)トラフィックを許可する必要があります。
これらの機能は、セキュリティのために非常に重要です。安易に無効化するのではなく、Apacheが正常に動作するために必要な範囲で、これらの設定を適切に変更することが推奨されます。後述する手順で、Apacheの導入後にこれらの設定を行う方法を解説します。
3. Apache (httpd) のインストール
CentOSでは、Apache HTTP Serverは httpd
という名前のパッケージとして提供されています。このパッケージは、CentOSの標準リポジトリに含まれていますので、パッケージマネージャー (yum
または dnf
) を使用して簡単にインストールできます。パッケージマネージャーを使うことで、Apache本体だけでなく、Apacheが必要とする他のライブラリやツール(依存関係)も同時にインストールしてくれるため、手間がかからず、システムの整合性も保たれます。
3.1. パッケージの検索(任意)
インストールしたいパッケージが利用可能かどうか、また正式なパッケージ名を確認したい場合は、search
コマンドを使用します。
bash
sudo yum search httpd
または CentOS 8 以降の場合:
bash
sudo dnf search httpd
コマンドを実行すると、httpd
というキーワードを含むパッケージのリストが表示されます。通常、一番関連性の高いパッケージとして httpd.x86_64
(またはアーキテクチャに応じた名前)が表示されるはずです。説明文には “Apache HTTP Server” と書かれています。
3.2. Apache (httpd) のインストール実行
以下のコマンドを実行して、Apacheパッケージをインストールします。
bash
sudo yum install httpd -y
または CentOS 8 以降の場合:
bash
sudo dnf install httpd -y
コマンドを実行すると、httpd
パッケージとそれに依存するパッケージのリスト、ダウンロードサイズ、インストール後のディスク容量などが表示されます。-y
オプションを付けている場合、これらの情報が表示された後、自動的にダウンロードとインストールが開始されます。-y
オプションを付けていない場合は、「Is this ok [y/d/N]:」と確認が表示されるので、y
を入力してEnterキーを押します。
インターネット接続速度にもよりますが、通常は短時間でインストールが完了します。インストールが成功すると、以下のようなメッセージが表示されて終了します。
“`
Installed:
httpd.x86_64 0:2.4.xx-xx.elY.centos.
Complete!
“`
これで、Apache HTTP Serverソフトウェア自体はシステムにインストールされました。ただし、インストールされただけではWebサーバーはまだ起動していませんし、外部からアクセスするための設定もまだ行われていません。
3.3. インストールされた主なファイルとディレクトリ
Apacheがインストールされると、システムのいくつかの重要な場所にファイルやディレクトリが配置されます。これらを把握しておくことは、今後の設定変更やトラブルシューティングにおいて役立ちます。
- 設定ファイルディレクトリ:
/etc/httpd/
- Apacheの最も重要な設定ファイル群が置かれます。
/etc/httpd/conf/httpd.conf
: Apacheのメイン設定ファイルです。Webサーバー全体の挙動を制御する基本的な設定が記述されています。通常、このファイルを直接編集するか、このファイルからインクルードされる他のファイルを編集します。/etc/httpd/conf.d/
: 追加の設定ファイルを置くためのディレクトリです。このディレクトリ内に.conf
拡張子で終わるファイルを配置すると、httpd.conf
から自動的に読み込まれて設定が有効になります。バーチャルホスト設定やモジュール固有の追加設定などを、メイン設定ファイルとは別に管理するために利用されます。/etc/httpd/conf.modules.d/
: モジュール関連の設定ファイルを置くためのディレクトリです。どのモジュールをロードするかなどの設定が記述されています。
- ドキュメントルート:
/var/www/html/
- クライアント(Webブラウザ)にデフォルトで提供されるWebコンテンツファイル(HTML、画像など)が置かれる場所です。ブラウザから
http://[サーバーのIPアドレスまたはホスト名]/
にアクセスした場合、Apacheはこのディレクトリ内のindex.html
やindex.htm
などのファイルを検索し、存在すればそれを返します。
- クライアント(Webブラウザ)にデフォルトで提供されるWebコンテンツファイル(HTML、画像など)が置かれる場所です。ブラウザから
- ログファイルディレクトリ:
/var/log/httpd/
- Apacheのアクセスログ (
access_log
) とエラーログ (error_log
) が記録されるディレクトリです。Webサーバーへのアクセス状況や、発生したエラーに関する詳細な情報が記録されており、運用監視やトラブルシューティングにおいて最も頻繁に参照する場所の一つです。
- Apacheのアクセスログ (
- モジュールディレクトリ:
/usr/lib64/httpd/modules/
(64bitシステムの場合)- Apacheの様々な機能を提供するダイナミックリンク可能なモジュールファイル (
.so
ファイル) が格納されています。必要に応じてhttpd.conf
やconf.modules.d/*.conf
でこれらのモジュールをロードすることで機能が有効になります。
- Apacheの様々な機能を提供するダイナミックリンク可能なモジュールファイル (
- 実行可能ファイル:
/usr/sbin/httpd
,/usr/sbin/apachectl
/usr/sbin/httpd
: Apacheの本体となるデーモンプログラムです。通常、直接実行するよりはsystemctl
を通じてサービスとして管理します。/usr/sbin/apachectl
: Apacheを管理するための便利なスクリプトです。設定ファイルの構文チェック (configtest
) やサービスの起動/停止/再起動などの操作をより簡単に行うためのサブコマンドを提供します。systemctl
コマンドが登場する以前は、Apacheのサービス操作によく使われていました。
これらの場所を頭に入れておくと、今後の設定作業や問題解決がスムーズに進みます。
4. Apacheの基本設定 (httpd.conf
)
Apacheの挙動を制御する主要な設定は、メイン設定ファイル /etc/httpd/conf/httpd.conf
に記述されています。インストール直後でも基本的な設定はされていますが、Webサイトを公開するために、または特定の用途に合わせて設定を変更する必要があります。
4.1. /etc/httpd/conf/httpd.conf
ファイルの確認と編集
設定ファイルを編集するには、テキストエディタを使用します。ここでは vim
を例に説明しますが、nano
や他のエディタを使用しても構いません。
bash
sudo vim /etc/httpd/conf/httpd.conf
ファイルを開くと、多くの行に設定ディレクティブが記述されていることがわかります。行頭が #
で始まる行はコメントであり、Apacheによって無視されます。主要な設定ディレクティブをいくつか見てみましょう。
ServerRoot "/etc/httpd"
:- Apacheの構成ファイル、エラーファイル、ログファイルなどが存在するディレクトリを指定します。通常、デフォルトのまま変更する必要はありません。
Listen 80
:- Apacheがクライアントからの接続を待ち受けるポート番号を指定します。HTTPの標準ポートは80番です。デフォルトでは、サーバーに割り当てられている全てのIPアドレスの80番ポートで接続を待ち受けます。特定のIPアドレスのみで待ち受けたい場合は
Listen 192.168.1.100:80
のように記述します。HTTPSを有効にする場合は、通常Listen 443
も追加しますが、これには別途SSLモジュールの設定が必要です。
- Apacheがクライアントからの接続を待ち受けるポート番号を指定します。HTTPの標準ポートは80番です。デフォルトでは、サーバーに割り当てられている全てのIPアドレスの80番ポートで接続を待ち受けます。特定のIPアドレスのみで待ち受けたい場合は
User apache
:Group apache
:- Apacheプロセスが実行される際のユーザーとグループを指定します。セキュリティ上の理由から、root権限ではなく、限定された権限を持つユーザー(デフォルトでは
apache
)で実行されます。これにより、仮にApacheに脆弱性が見つかっても、システム全体への被害を最小限に抑えることができます。通常、これらの設定を変更する必要はありません。
- Apacheプロセスが実行される際のユーザーとグループを指定します。セキュリティ上の理由から、root権限ではなく、限定された権限を持つユーザー(デフォルトでは
ServerAdmin root@localhost
:- サーバーエラーページなどに表示される、Webサイト管理者のメールアドレスを指定します。ユーザーがサーバー管理者に問い合わせたい場合に表示されます。
ServerName www.example.com:80
:- サーバーが自分自身のホスト名を識別するために使用します。コメントアウトされていることが多いです。バーチャルホストを使用しない場合や、エラーメッセージでホスト名を表示させたい場合などに設定します。設定しない場合、ApacheはDNSの逆引きなどからホスト名を推測しようとしますが、意図しないホスト名になることを防ぐため、明示的に設定することが推奨される場合があります。IPアドレスや、ローカルホスト名を設定することも可能です。
DocumentRoot "/var/www/html"
:- Webコンテンツのデフォルトのルートディレクトリを指定します。ここに置かれたファイルがWebブラウザに表示されます。Webサイトのファイルを別のディレクトリに置きたい場合は、この設定値を変更します。変更した場合は、その新しいディレクトリにも適切な権限とSELinuxコンテキストを設定する必要があります(後述)。
<Directory "/path/to/directory"> ... </Directory>
:- 特定のファイルシステムディレクトリに対する設定を定義するブロックです。ディレクトリへのアクセス制御、
.htaccess
ファイルの使用許可、ディレクトリインデックスの表示許可などを設定できます。デフォルトで/var/www/html
ディレクトリに対する設定ブロックが存在します。Options
: そのディレクトリで許可される機能を指定します。Indexes
はディレクトリ内にindex.html
などのファイルがない場合に、ファイルリストを表示します(セキュリティのため無効にすることが多いです)。FollowSymLinks
はシンボリックリンクを許可します。AllowOverride
: そのディレクトリで.htaccess
ファイルによる設定の上書きを許可するかどうかを指定します。None
は許可しない、All
はすべて許可です。None
が最も安全かつパフォーマンスが良いですが、アプリケーションによってはAll
やAuthConfig
(認証関連)などを許可する必要があります。Require
: ディレクトリへのアクセスを許可する条件を指定します。all granted
は全ての接続元からのアクセスを許可します。特定のIPアドレスやネットワークからのアクセスのみを許可する場合はRequire ip 192.168.1.0/24
のように指定します。
- 特定のファイルシステムディレクトリに対する設定を定義するブロックです。ディレクトリへのアクセス制御、
<Files ".ht*"> ... </Files>
:- ファイル名パターンに対して設定を定義するブロックです。デフォルトでは
.ht
で始まるファイル(.htaccess
,.htpasswd
など)へのアクセスを拒否する設定が記述されており、重要な設定ファイルやパスワードファイルがWeb経由で漏洩するのを防いでいます。
- ファイル名パターンに対して設定を定義するブロックです。デフォルトでは
ErrorLog "logs/error_log"
:- Apacheのエラーログファイルのパスを指定します。通常、絶対パス
/var/log/httpd/error_log
として扱われます(ServerRoot
が/etc/httpd
、ErrorLog
が相対パスlogs/error_log
の場合)。
- Apacheのエラーログファイルのパスを指定します。通常、絶対パス
CustomLog "logs/access_log" combined
:- Apacheのアクセスログファイルのパスとログフォーマットを指定します。通常、絶対パス
/var/log/httpd/access_log
として扱われます。combined
は標準的なログフォーマットです。
- Apacheのアクセスログファイルのパスとログフォーマットを指定します。通常、絶対パス
Include conf.modules.d/*.conf
:IncludeOptional conf.d/*.conf
:- これらのディレクティブにより、指定されたディレクトリ内の
.conf
拡張子を持つファイルが読み込まれます。これにより、モジュール設定やバーチャルホスト設定などを/etc/httpd/conf.d/
や/etc/httpd/conf.modules.d/
に分離して管理できます。IncludeOptional
は指定されたファイルが存在しなくてもエラーになりません。
- これらのディレクティブにより、指定されたディレクトリ内の
httpd.conf
を編集する際は、誤字や構文エラーに注意が必要です。設定ファイルを保存したら、次のステップで構文チェックを行います。
4.2. 設定ファイルの構文チェック
設定ファイルを変更した後は、Apacheサービスを再起動する前に必ず設定ファイルの構文チェックを行う習慣をつけましょう。これにより、設定ミスによってApacheが起動しなくなるという事態を防ぐことができます。
以下のコマンドを実行します。
bash
sudo apachectl configtest
または、httpd
コマンドに -t
オプションを付けて実行します。
bash
sudo httpd -t
設定ファイルに構文上の問題がなければ、以下のメッセージが表示されます。
Syntax OK
もし構文エラーがある場合は、エラーが発生したファイル名と行番号、そしてエラーの概要が表示されます。
Syntax error on line XX of /etc/httpd/conf/httpd.conf:
Invalid command 'hogehoge', perhaps misspelled or defined by a module not included in the server configuration
エラーメッセージをよく読み、示されたファイルと行を確認して設定ミスを修正してください。構文エラーが解消されるまで、このチェックを繰り返します。
5. Apacheサービスの管理 (systemd)
CentOS 7以降では、システムのサービス管理には systemd
という仕組みが使われています。Apacheのサービスは httpd.service
として登録されており、systemctl
コマンドを使って起動、停止、再起動、状態確認、自動起動設定などを行います。
5.1. サービスの起動
Apacheサービスを起動します。
bash
sudo systemctl start httpd
このコマンドが成功しても、デフォルトでは何も出力されません。
5.2. サービスの状態確認
Apacheサービスが正常に起動しているか、現在どのような状態にあるかを確認します。
bash
sudo systemctl status httpd
出力例:
● httpd.service - Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon XXXX-XX-XX XX:XX:XX JST; Xmin ago
Docs: man:httpd.service(8)
Main PID: XXXX (httpd)
Tasks: X
Memory: XX.XM
CPU: XXms
CGroup: /system.slice/httpd.service
├─XXXX /usr/sbin/httpd -DFOREGROUND
└─XXXX /usr/sbin/httpd -DFOREGROUND
Active: active (running)
と表示されていれば、Apacheは正常に起動し、動作中です。もし起動に失敗している場合は Active: failed
と表示され、エラーの詳細やログファイルへのヒントが表示されます。
5.3. サービスの停止
Apacheサービスを停止します。
bash
sudo systemctl stop httpd
5.4. サービスの再起動とリロード
設定ファイルを変更した後、その変更をApacheに反映させるには、サービスを再起動するか、設定ファイルをリロードする必要があります。
-
再起動 (
restart
): 現在実行中のApacheプロセスを完全に終了させ、新しい設定でサービスを起動し直します。設定変更が確実に反映されますが、一時的にサービスが停止する時間が発生します。bash
sudo systemctl restart httpd
* リロード (reload
): 設定ファイルを再読み込みさせ、プロセスを終了せずに設定を反映させます。サービスが停止する時間が発生しないため、稼働中のサービスを中断せずに設定変更を適用したい場合に推奨されます。ただし、一部の設定変更(Listenポートの変更など)はリロードでは反映されず、再起動が必要な場合があります。bash
sudo systemctl reload httpd
設定ファイルの構文チェック (apachectl configtest
) で Syntax OK
が確認できていれば、ほとんどの設定変更は reload
で反映可能です。
5.5. システム起動時の自動実行設定
サーバーのOSを再起動した際に、Apacheサービスが自動的に起動するように設定するには、サービスを「有効化 (enable)」します。
bash
sudo systemctl enable httpd
このコマンドは、システム起動時にサービスを起動するためのシンボリックリンクを作成します。成功すると「Created symlink …」のようなメッセージが表示されます。
自動起動を無効にしたい場合は、「無効化 (disable)」します。
bash
sudo systemctl disable httpd
現在の自動起動設定を確認するには、systemctl status httpd
コマンドの出力にある Loaded:
の行を確認します。「…; enabled; …」となっていれば自動起動有効、「…; disabled; …」となっていれば自動起動無効です。
6. Firewall (firewalld) の設定
Apacheサービスが正常に起動しても、サーバーのファイアウォール設定によって外部からのアクセスがブロックされている場合があります。CentOS 7以降では firewalld
が標準のファイアウォール管理ツールです。インターネットからWebサーバーにアクセスできるようにするためには、HTTP(80番ポート)とHTTPS(443番ポート)の通信を許可する必要があります。
6.1. firewalld の状態確認
firewalldサービスが起動しているか確認します。
bash
sudo systemctl status firewalld
Active: active (running)
と表示されていれば、firewalldは正常に動作しています。もし停止している場合は、以下のコマンドで起動・有効化することを推奨します。
bash
sudo systemctl start firewalld
sudo systemctl enable firewalld
6.2. Webサービス (http/https) の許可
firewalldでは、SSHやHTTPといった一般的なサービスは事前に定義されており、サービス名で許可設定を行うことができます。Apacheが利用するHTTP (80/tcp) および HTTPS (443/tcp) サービスを許可します。設定をOS再起動後も有効にするため --permanent
オプションを使用します。
“`bash
HTTP (80/tcp) を恒久的に許可
sudo firewall-cmd –permanent –add-service=http
HTTPS (443/tcp) を恒久的に許可 (SSL化する場合に必要)
sudo firewall-cmd –permanent –add-service=https
恒久的な設定変更を反映させるためにリロード
sudo firewall-cmd –reload
“`
--permanent
オプションは、変更を /etc/firewalld/
ディレクトリ以下の設定ファイルに書き込みます。しかし、これらの変更を実行中のfirewalldに適用するためには、別途 --reload
コマンドを実行する必要があります。--reload
コマンドは、設定を再読み込みし、サービスを中断することなくルールを更新します。
6.3. 許可されたサービスの確認
設定が正しく反映されたか確認するには、firewalldが管理する現在のゾーン(通常は public
ゾーン)で許可されているサービス一覧を表示します。
bash
sudo firewall-cmd --list-all
出力の中に services:
の行があり、そこに http
および https
が含まれていれば、設定は成功です。
public (active)
target: default
icmp-block-inbound: no
interfaces: eth0 ens192 (インターフェース名は環境による)
sources:
services: ssh dhcpv6-client http https <-- http と https が表示されていればOK
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
6.4. ポート番号での許可(代替手段)
サービス名ではなく、直接ポート番号を指定して許可することも可能です。これは、Apacheを標準以外のポートで運用する場合や、特定のポートのみを細かく制御したい場合に利用できます。
“`bash
ポート 80/tcp を恒久的に許可
sudo firewall-cmd –permanent –add-port=80/tcp
ポート 443/tcp を恒久的に許可
sudo firewall-cmd –permanent –add-port=443/tcp
設定変更を反映
sudo firewall-cmd –reload
“`
通常はサービス名での指定で十分です。
これで、Firewallによって外部からのHTTP/HTTPSトラフィックが許可されるようになりました。
7. SELinux の設定
CentOSの重要なセキュリティ機能であるSELinuxは、Apacheの動作にも影響を与えます。SELinuxがEnforcingモードの場合、Apacheプロセス (httpd_t
タイプ) は、SELinuxポリシーで許可されているファイルやポートにしかアクセスできません。Webサイトのコンテンツをデフォルトの /var/www/html
以外の場所に置いたり、CGIスクリプトを使ったり、Apacheから他のサービスに接続したりする場合には、SELinuxの設定変更が必要になることがあります。
7.1. SELinux の状態確認
現在のSELinuxの動作モードを確認します。
bash
getenforce
出力が Enforcing
であれば、SELinuxは有効であり、ポリシー違反は阻止されます。Permissive
であれば、ポリシー違反は記録されますが阻止はされません。Disabled
であれば無効です。通常は Enforcing
で運用することが推奨されます。
7.2. Apacheに関連するSELinuxタイプ
SELinuxは「タイプ」というラベルを使ってアクセス制御を行います。Apacheに関連する主なタイプは以下の通りです。
httpd_t
: Apacheデーモンプロセスに付与されるタイプ。httpd_sys_content_t
: Webコンテンツファイル(HTML、画像、CSSなど)に付与されるタイプ。Apacheがこのタイプを持つファイルを読み込むことが許可されます。デフォルトの/var/www/html
以下に作成されたファイルはこのタイプになることが多いです。httpd_sys_script_exec_t
: Apacheが実行を許可されるスクリプトファイル(CGIなど)に付与されるタイプ。httpd_sys_rw_content_t
: Apacheが書き込みを許可されるコンテンツファイルに付与されるタイプ。ファイルアップロード機能などで使用されます。
ファイルやディレクトリのSELinuxタイプを確認するには、ls -Z
コマンドを使います。
“`bash
ls -Z /var/www/html/
例: -rw-r–r–. root root system_u:object_r:httpd_sys_content_t:s0 index.html
“`
ここで httpd_sys_content_t
の部分がSELinuxタイプです。
7.3. DocumentRoot の変更と SELinux コンテキストの設定
もし httpd.conf
の DocumentRoot
をデフォルトの /var/www/html
以外の場所(例: /web/mywebsite
)に変更した場合、その新しいディレクトリ以下のファイルがApacheからアクセスできるように、適切なSELinuxタイプ (httpd_sys_content_t
) を付与する必要があります。
これは semanage fcontext
コマンドで対象パスに対するSELinuxコンテキストのルールを設定し、restorecon
コマンドで実際のファイルやディレクトリのコンテキストを更新することで行います。
“`bash
例: DocumentRoot を /web/mywebsite に設定した場合
1. 新しいDocumentRootディレクトリを作成し、コンテンツを配置する
sudo mkdir -p /web/mywebsite
ここにWebコンテンツファイル (index.html など) を配置する
2. /web/mywebsite ディレクトリとサブディレクトリ/ファイルに httpd_sys_content_t タイプを付与するルールを設定
semanage fcontext -a -t <タイプ> “<対象パスの正規表現>”
sudo semanage fcontext -a -t httpd_sys_content_t “/web/mywebsite(/.*)?”
3. 設定したルールを元に、実際のファイル/ディレクトリのSELinuxコンテキストを更新
restorecon -Rv <対象パス> (-R: 再帰的, -v: 処理したファイルを表示)
sudo restorecon -Rv /web/mywebsite
“`
semanage
コマンドが使えない場合、policycoreutils-python-utils
または policycoreutils-python
パッケージがインストールされていない可能性があります。sudo yum install policycoreutils-python-utils -y
などでインストールしてください。
restorecon -Rv /web/mywebsite
を実行すると、/web/mywebsite
以下全てのファイルとディレクトリのSELinuxコンテキストが、設定したルール(ここでは httpd_sys_content_t
)に基づいて更新されます。
7.4. SELinux boolean の設定
Apacheの特定の機能を有効にするために、関連するSELinux boolean (オン/オフスイッチ) を変更する必要がある場合があります。
主なApache関連のboolean:
httpd_can_network_connect
: Apacheプロセスがネットワーク経由で外部(他のサーバー、データベースなど)に接続することを許可するかどうか。アプリケーションが外部リソースにアクセスする場合に必要です。httpd_enable_cgi
: ApacheがCGIスクリプトを実行することを許可するかどうか。httpd_can_sendmail
: Apacheプロセスがメール送信ポート(通常25番)に接続することを許可するかどうか。PHPのmail()
関数などがこれを利用します。
現在のboolean設定を確認するには:
bash
sudo getsebool -a | grep httpd
特定のbooleanの状態を確認するには:
bash
sudo getsebool httpd_can_network_connect
booleanをオンにするには setsebool
コマンドを使用します。設定を再起動後も維持するため、-P
オプションを付けます。
“`bash
Apacheから外部ネットワークへの接続を許可する場合
sudo setsebool -P httpd_can_network_connect on
ApacheがCGIスクリプトを実行することを許可する場合
sudo setsebool -P httpd_enable_cgi on
“`
7.5. SELinux 拒否ログの確認とトラブルシューティング
SELinuxによってアクセスが拒否された場合、その情報は /var/log/audit/audit.log
に記録されます。SELinuxが原因でApacheが正常に動作しない場合、このログを確認するのが有効なトラブルシューティング方法です。
拒否ログを検索するには、ausearch
コマンドを使用します。特に、Apacheプロセスに関連する拒否を確認するには、実行ファイル名 (httpd
) でフィルタリングします。
bash
sudo ausearch -c "httpd" -m AVC -ts today
-c "httpd"
: httpd実行ファイルに関連するイベントを検索-m AVC
: アクセス拒否(AVC denial)メッセージのみを表示-ts today
: 今日のログから検索
さらに、audit2allow
コマンドを使うと、拒否された操作に対して、もしポリシーを変更するとしたらどのようなルールを追加すれば良いかを提案してくれます(ただし、ポリシー変更は慎重に行うべきです)。
bash
sudo ausearch -c "httpd" --raw | audit2allow -w -a
このコマンドは、拒否された操作の内容 (-w
) と、それを許可するためのSELinuxポリシーモジュールの定義 (-a
) を出力します。出力例を見て、どのような操作が拒否されているか理解を深め、必要な対応(ファイルコンテキストの修正、booleanの変更など)を行います。
一時的にSELinuxをPermissiveモードにして問題が解決するか確認することも、原因の切り分けに役立ちます。
“`bash
sudo setenforce 0 # Permissiveモードに変更 (一時的)
問題が解決するか確認
sudo setenforce 1 # Enforcingモードに戻す
“`
注意: SELinuxをDisabledモードにすることは、セキュリティリスクを高めるため、特別な理由がない限り行うべきではありません。
8. 動作確認
Apacheサービスの起動、基本的な設定、Firewall、SELinuxの設定が完了したら、Webサーバーが正しく動作し、外部からアクセスできるか確認します。
8.1. ローカルホストからのアクセス確認
サーバー内部からHTTPリクエストを送信し、Apacheが応答するか確認します。curl
コマンドを使います。
“`bash
curl http://localhost/
または
curl http://127.0.0.1/
“`
このコマンドを実行すると、Apacheのデフォルトのウェルカムページ(CentOS 7では /usr/share/httpd/noindex/index.html
、CentOS 8では /usr/share/httpd/error/noindex.html
など、ディストリビューションやバージョンによって場所や内容が異なります)の内容、または /var/www/html/
に自分で index.html
を配置した場合その内容が表示されます。
curlがHTMLの内容を返せば、Apacheサービスは正常に起動しており、ローカルからのHTTPリクエストに応答できています。
8.2. Webブラウザからのアクセス確認
クライアントPCのWebブラウザを開き、サーバーのIPアドレスまたはホスト名を入力してアクセスします。
例: http://[サーバーのIPアドレス]
正常にアクセスできれば、ローカルからのcurlで確認したのと同じWebページが表示されるはずです。
Webブラウザからアクセスできない場合、以下の可能性が考えられます。
- Firewallの設定: サーバーのFirewallでHTTPポート(80)が許可されていない。
sudo firewall-cmd --list-all
で確認し、必要であれば許可設定を行います。 - ネットワーク経路: クライアントPCからサーバーまでのネットワーク経路に問題がある。pingコマンドでサーバーへの疎通を確認したり、ルーターやインターネットサービスプロバイダ側のFirewall設定を確認したりします。
- ApacheのListenポート: Apacheが期待するポート(80)で待ち受けていない、またはFirewallで許可したポートとApacheのListenポートが一致していない。
sudo systemctl status httpd
やsudo netstat -tulnp | grep httpd
などで確認します。 - SELinux: DocumentRoot以下のファイルへのアクセスがSELinuxによってブロックされている。
/var/log/audit/audit.log
を確認し、必要に応じてSELinuxコンテキストを修正します。 - ServerName ディレクティブ:
httpd.conf
でServerName
が適切に設定されていない場合に、特定の環境で問題が発生することがあります。
8.3. 簡単なテストページの作成と配置
デフォルトのウェルカムページではなく、独自のWebページが表示されるか確認することで、DocumentRootの設定やファイルへのアクセス権限が適切か確認できます。
-
デフォルトのDocumentRootディレクトリに移動します。
bash
cd /var/www/html/
2. もしデフォルトのindex.html
がシンボリックリンクなどで存在する場合、バックアップを取るか削除しておきます。“`bash
例: 既存のindex.htmlをバックアップ
sudo mv index.html index.html.bak
``
index.html` ファイルを作成し、簡単なHTMLコードを記述します。
3. 新しいbash
sudo vim index.htmlファイルの内容例:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Apache Test Page</title>
</head>
<body>
<h1>Success! Apache is working on CentOS.</h1>
<p>This is my custom test page.</p>
</body>
</html>
保存してエディタを終了します。
4./var/www/html
ディレクトリは通常、SELinuxポリシーでhttpd_sys_content_t
タイプが付与されるように設定されています。このディレクトリ内にファイルを新規作成した場合、通常は自動的に適切なSELinuxコンテキストが引き継がれますが、念のため確認しておきましょう。“`bash
ls -Z index.html出力例: -rw-r–r–. root root system_u:object_r:httpd_sys_content_t:s0 index.html
``
httpd_sys_content_tと表示されていればOKです。もし異なる場合は、
sudo restorecon -v index.html` コマンドで修正できます。
5. Webブラウザからサーバーに再度アクセスし、作成した「My Apache Test Page」が表示されるか確認します。
カスタムページが正しく表示されれば、ApacheはDocumentRootからファイルを読み込み、クライアントに配信する準備ができています。
9. 応用設定の紹介
Apacheは非常に多機能であり、様々な応用設定が可能です。ここでは、Webサーバーをより実践的に運用するために役立つ代表的な応用設定について、簡単な概要のみを紹介します。これらの詳細な設定方法は、ここでは省略しますが、今後の学習のステップとして参考にしてください。
9.1. バーチャルホスト (Virtual Hosts)
1台のサーバー(1つのIPアドレス)で複数のドメイン名やホスト名に対応する複数のWebサイトを運用したい場合に利用する機能です。例えば、www.example.com
と blog.example.com
を同じサーバー上でそれぞれ別のコンテンツを表示させたい場合などにバーチャルホストを設定します。
設定は、通常 /etc/httpd/conf.d/
ディレクトリ内に個別の設定ファイル(例: vhosts.conf
)を作成して行います。<VirtualHost>
ディレクティブを使って、ドメイン名 (ServerName
, ServerAlias
) やコンテンツの場所 (DocumentRoot
)、ログファイルなどをドメインごとに定義します。
9.2. SSL/TLSによるHTTPS化
Webサイトとブラウザ間の通信を暗号化し、データの盗聴や改ざんを防ぐためにHTTPSを使用します。これにはSSL/TLS証明書が必要であり、Apacheでは mod_ssl
モジュールを利用します。
HTTPSを有効にするには、以下の手順が一般的です。
1. mod_ssl
パッケージをインストールする。
2. 信頼できる第三者機関からSSL証明書(無料のLet’s Encryptなど)を取得する。
3. Apacheの設定ファイル(通常 /etc/httpd/conf.d/ssl.conf
やバーチャルホスト設定内)で、証明書のパスや秘密鍵のパス、HTTPSで使用するポート(443番)などを設定する。
4. Firewallで443番ポートの通信を許可する(上記手順で --add-service=https
で既に許可済み)。
5. 設定を反映するためにApacheを再起動またはリロードする。
9.3. ユーザー認証 (.htaccess と htpasswd)
Webサイトの特定のディレクトリにアクセス制限をかけ、ユーザー名とパスワードを入力しないと閲覧できないように設定できます。これは、Apacheの認証モジュールと、ユーザー名・パスワードを保存した htpasswd
ファイル、そして設定を記述する .htaccess
ファイルを組み合わせて実現できます。
htpasswd
コマンドでユーザーリストファイルを作成し、アクセス制限をかけたいディレクトリ内に .htaccess
ファイルを作成して、認証方式、認証時に表示されるメッセージ、htpasswd
ファイルの場所、アクセスを許可するユーザーなどを指定します。
9.4. その他の主要モジュール
Apacheには他にも様々な機能を提供するモジュールがあります。
mod_rewrite
: URLの書き換えやリダイレクトを行うための強力なモジュール。mod_proxy
: リバースプロキシやフォワードプロキシとして機能するためのモジュール。Node.jsやTomcatなどのアプリケーションサーバーと連携する際によく使用されます。mod_deflate
: 配信するコンテンツを圧縮して通信量を削減し、表示速度を向上させるモジュール。mod_headers
: HTTPレスポンスヘッダーを操作するモジュール。セキュリティ関連のヘッダーを追加するためによく利用されます。mod_cache
: コンテンツをキャッシュして、応答速度を向上させたりサーバー負荷を軽減したりするモジュール。
これらのモジュールは、必要に応じて有効化し、設定を行います。
10. トラブルシューティング
Apacheの導入や運用中に問題が発生した場合、落ち着いて原因を特定し対処することが重要です。ここでは、よくある問題とその基本的なトラブルシューティング方法を紹介します。
10.1. Apacheサービスが起動しない/起動してもすぐ停止する
- 原因: 設定ファイルの構文エラー、ポートの競合、SELinuxによる制限、必要なファイルの権限不足など。
- 対処法:
sudo apachectl configtest
またはsudo httpd -t
で設定ファイルの構文エラーを確認し、修正します。sudo systemctl status httpd
コマンドの出力でエラーメッセージを確認します。ここに詳しいエラー情報やログファイルへのヒントが表示されていることが多いです。journalctl -xe
コマンドで、より詳細なシステムログやサービス起動時のログを確認します。Apacheに関連するエラーメッセージを探します。sudo netstat -tulnp | grep 80
(Listenポートが80の場合) で、他のプロセスがApacheが使用しようとしているポートを使用していないか確認します。- SELinuxが原因でないか確認します。
sudo ausearch -c "httpd" -m AVC -ts today
で拒否ログを確認し、必要なSELinuxコンテキストやbooleanを設定します。 /etc/httpd/conf/httpd.conf
,/var/log/httpd/
,/var/run/httpd/
などの重要なファイルやディレクトリに対して、Apacheユーザー(通常apache
)が読み書きする権限があるか確認します (ls -l
,ls -Z
)。
10.2. Webブラウザからサーバーにアクセスできない (Apacheは起動している)
- 原因: Firewallによるブロック、ネットワーク経路の問題、SELinuxによるDocumentRootへのアクセス制限など。
- 対処法:
- サーバーのFirewall (firewalld) でHTTP (80/tcp) および HTTPS (443/tcp) ポートが許可されているか確認します (
sudo firewall-cmd --list-all
)。設定を変更した場合はsudo firewall-cmd --reload
を忘れないでください。 - クライアントPCからサーバーへのネットワーク接続性を確認します (ping, traceroute)。必要に応じてルーターやネットワーク機器のファイアウォール設定を確認します。
- サーバー内部からはアクセスできるのに外部からできない場合、ほぼFirewallかネットワーク経路の問題です。
- DocumentRoot以下のファイルに適切なSELinuxコンテキスト (
httpd_sys_content_t
) が付与されているか確認します (ls -Z [DocumentRoot]
)。
- サーバーのFirewall (firewalld) でHTTP (80/tcp) および HTTPS (443/tcp) ポートが許可されているか確認します (
10.3. 特定のページが表示されない/500 Internal Server Error が発生する
- 原因: ウェブコンテンツファイルが存在しない/読み込めない、スクリプトのエラー、権限不足、SELinuxによる実行制限、
.htaccess
の設定ミスなど。 - 対処法:
/var/log/httpd/error_log
ファイルを確認します。Apacheやスクリプト実行時のエラーメッセージが記録されています。/var/log/httpd/access_log
ファイルを確認し、問題のページへのアクセスに対してどのようなHTTPステータスコードが返されているか確認します (404 Not Found, 403 Forbidden, 500 Internal Server Error など)。- 要求されたファイルが
DocumentRoot
以下に存在するか、またApacheユーザー(apache
)がそのファイルを読み込む権限があるか確認します (ls -l
,ls -Z
)。 - CGIスクリプトなどが実行できない場合、SELinux boolean
httpd_enable_cgi
がon
になっているか確認します。また、スクリプトファイルにhttpd_sys_script_exec_t
のSELinuxタイプが付与されているか確認します。 .htaccess
ファイルを使用している場合、そのファイルに構文エラーがないか確認し、またメイン設定で対象ディレクトリのAllowOverride
が適切に設定されているか確認します。- 動的なスクリプト(PHPなど)の場合、スクリプト自体のエラーを確認します。PHPであれば、エラーログの設定 (
php.ini
のerror_reporting
,log_errors
) を確認したり、一時的にdisplay_errors = On
に設定してエラーメッセージを表示させたりします(本番環境ではdisplay_errors = Off
が推奨です)。
トラブルシューティングでは、慌てずにログを確認し、可能性のある原因を一つずつ潰していく methodical なアプローチが重要です。
11. まとめ
この記事では、CentOS環境にApache HTTP Server(httpdパッケージ)を導入するための詳細な手順を解説しました。システムのアップデートから始まり、yum
または dnf
を使ったApacheのインストール、メイン設定ファイル /etc/httpd/conf/httpd.conf
の主要なディレクティブの説明、systemd
によるサービスの起動・停止・管理方法、CentOSのセキュリティ機能である firewalld
および SELinux
の設定方法、そしてWebサーバーが正しく動作しているかの確認方法まで、Webサーバーをインターネットに公開するために必要な基本的なステップを網羅しました。
また、バーチャルホストやHTTPS化といった応用設定の概要、そして導入・運用中に発生しうる一般的なトラブルとその解決策についても触れました。
CentOSでのApache導入は、Webサーバー構築の基礎となる重要なスキルです。この記事で学んだ手順と知識を活かして、ご自身のサーバー環境にApacheをセットアップし、Webサイトやアプリケーションの公開に挑戦してください。
今回の手順はあくまで基本的なApacheの設定です。実際の運用においては、さらに踏み込んだ設定や対応が必要になる場合があります。例えば、
- SSL/TLS証明書の取得と更新: Let’s Encryptと
certbot
を使った自動化など。 - 複数のバーチャルホスト設定: 複数のWebサイトを効率的に管理する方法。
- PHPなどのアプリケーション実行環境の構築:
mod_php
や PHP-FPM との連携設定。 - データベースサーバーの導入と連携: MySQL/MariaDBやPostgreSQLなどのセットアップ。
- パフォーマンス最適化: MPMの選択と設定、キャッシュ設定など。
- セキュリティのさらなる強化: WAFの導入、アクセス制限の強化、脆弱性対策。
- 監視とログ管理: アクセス状況やエラーの監視、ログの集約・分析。
これらのステップは、より安定し、安全で、高性能なWebサーバーを運用するために不可欠です。この記事を足がかりに、これらの応用的なトピックについても学習を進めていくことをお勧めします。
サーバー構築と運用は継続的な学習が必要です。この記事が、CentOSにおけるApache導入の第一歩として、そしてその後の学習の出発点として、皆様のお役に立てれば幸いです。
参考資料:
- Apache HTTP Server Documentation: Apache公式のドキュメント。各ディレクティブの詳細やモジュールの情報が豊富に掲載されています。
https://httpd.apache.org/docs/ (英語) - CentOS/RHEL Documentation: CentOSやそのアップストリームであるRHELの公式ドキュメント。システム設定に関する詳細な情報が得られます。
https://docs.centos.org/ (CentOS Documentation – 英語)
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/ (Red Hat Enterprise Linux Documentation – 日本語あり)
これらの公式ドキュメントは、最も正確で信頼できる情報源です。より深い知識が必要になった際には、ぜひ活用してください。