LinuxでのApache HTTP Serverインストール方法をyumとaptで徹底解説

LinuxへApache HTTP Serverを入れる手順は、RHEL系ならhttpdパッケージをdnf(旧環境ではyum)、Ubuntu/Debian系ならapache2パッケージをaptで導入するのが基本です。インストール後は、サービス状態、設定構文、待受ポート、ローカルHTTP応答の順に確認し、外部公開が必要な場合だけファイアウォールへ必要なサービスを追加します。ファイアウォール全体の無効化は不要です。

コマンドを実行する前に/etc/os-releaseでディストリビューションとバージョンを確認してください。パッケージ名、設定ファイル配置、サービス名は同じApache 2.4でも配布元によって異なります。RHEL系の/etc/httpd/とUbuntu系の/etc/apache2/を混ぜると、編集したファイルが読み込まれない、補助コマンドが存在しないといった混乱が起きます。

目次

最短の判断表

環境パッケージサービス主な設定場所
RHEL 9 / Rocky / AlmaLinux系httpdhttpd/etc/httpd/
旧CentOS/RHEL系httpdhttpdyum利用可否を対象版資料で確認
Ubuntu / Debian系apache2apache2/etc/apache2/
ソースビルド配布パッケージ外構成時のprefix次第更新・署名・依存管理を別途設計

運用サーバーでは、ディストリビューションが提供するパッケージを優先すると、更新、依存関係、systemd連携、SELinuxやAppArmorとの整合を取りやすくなります。Apache公式のソースビルド手順は有効ですが、既存パッケージと並存させる場合は実行ファイル、設定、ログ、ポートを分離し、セキュリティ更新を誰が追うか決める必要があります。単に『最新版にしたい』だけで既存パッケージを上書きしないでください。

インストール前の確認

  • 対象ホスト名、IPアドレス、OS名とリリース、CPUアーキテクチャを記録する。
  • 既存のnginx、別httpd、コンテナが80番・443番を使用していないか確認する。
  • sudo権限、パッケージリポジトリ、プロキシ、DNS、時刻同期が正常か確認する。
  • 公開範囲をローカル、社内ネットワーク、インターネットのどれにするか決める。
  • クラウドのセキュリティグループ、ホストのファイアウォール、上流ロードバランサーを区別する。
  • 既存設定がある場合は設定ファイル、証明書参照、仮想ホスト、DocumentRootをバックアップする。
cat /etc/os-release

# 既存の待受を確認
sudo ss -ltnp | grep -E ':(80|443)\b'

ssの結果に別プロセスが表示された場合、先に所有者と用途を確認します。プロセスを強制終了したりパッケージを削除したりせず、Apacheを別ポートで試す、既存リバースプロキシの背後へ置くなど、サービス停止を避ける構成を検討します。稼働中環境では変更申請とメンテナンス時間を確保します。

RHEL系でhttpdを導入する

RHEL 9の公式資料はdnf install httpdを案内しています。互換ディストリビューションでも一般的な流れは同じですが、リポジトリとサポート範囲は各配布元の資料を優先してください。yumコマンドがdnfへの互換入口として存在する環境もありますが、スクリプトでは対象OSを明記し、存在を前提にしません。

sudo dnf install httpd
sudo systemctl enable --now httpd
sudo systemctl status httpd --no-pager

enable --nowは、現在起動すると同時に次回起動時の自動開始も有効にします。インストールだけ行い、設定レビュー後に起動したい運用では、dnf installとsystemctl startを分けます。状態表示がfailedなら、再起動を繰り返す前にjournalctl -u httpdとApacheのerror_logを確認します。

firewalldで必要な通信だけ許可する

外部クライアントから接続させる場合は、Apacheが起動したことをローカルで確認してから、firewalldの現在のゾーンとインターフェースを確認します。HTTPだけならhttp、TLS設定を完了しているならhttpsサービスを必要なゾーンへ追加します。実行中設定と永続設定を混同せず、変更後に一覧を確認します。

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

SSHで遠隔作業している場合は、現在の管理経路を維持したまま変更します。ゾーンを変更するとSSH許可も変わる可能性があるため、別セッションまたは管理コンソールを確保します。HTTPをインターネットへ公開する前に、TLS、更新、不要モジュール、アプリケーション認証、ログ監視を整えます。テストページが見えたことは安全な公開完了を意味しません。

Ubuntu・Debian系でapache2を導入する

Ubuntu Serverの公式手順はapt install apache2です。パッケージ一覧を更新してから導入し、サービス状態を確認します。自動起動状態はイメージや運用ポリシーで異なることがあるため、実際のsystemctl is-enabledとis-activeを見ます。

sudo apt update
sudo apt install apache2
sudo systemctl enable --now apache2
sudo systemctl status apache2 --no-pager

Ubuntu系では主設定が/etc/apache2/apache2.confにあり、sites-available、sites-enabled、mods-available、mods-enabledなどへ分割されています。仮想ホストやモジュールの有効化には配布元の補助コマンドが使われます。RHELの/etc/httpd/conf.d/向け手順をそのまま適用せず、実際のInclude関係を確認します。

UFWを使う場合

UFWが有効なホストでは、インストールされたアプリケーションプロファイルを確認し、必要な範囲だけ許可します。プロファイル名が存在すること、開くポートが期待どおりであることをufw app infoで確認します。既存のSSH許可を確認せずufw enableを実行すると遠隔接続を失う可能性があるため、先に管理元IPからのSSHを許可し、コンソールを用意します。

sudo ufw status verbose
sudo ufw app list
sudo ufw app info 'Apache'
sudo ufw allow 'Apache'
sudo ufw status numbered

起動後の4段階確認

1. systemdの状態

最初にサービスが起動中か、自動起動が有効かを確認します。active (running)でも、仮想ホストやコンテンツが正しいとは限りません。逆に失敗している場合は、終了コード、直前の設定変更、ポート競合、権限をログから追います。

2. 設定構文

設定変更後は再起動前に構文テストを行います。一般的なApacheではapachectl configtestまたはhttpd -tが使われ、Ubuntuではapache2ctl configtestが提供されます。環境に存在する公式パッケージのコマンドを使い、Syntax OKを確認してからreloadします。構文が壊れた状態で再起動すると、稼働中のサービスまで停止する可能性があります。

# RHEL系の例
sudo apachectl configtest

# Ubuntu系の例
sudo apache2ctl configtest

3. ポートとローカル応答

次に、期待したアドレスとポートで待ち受けているかを確認し、サーバー自身からHTTP要求を送ります。curlでステータスとヘッダーを見れば、DNSや外部ファイアウォールを切り離してApache単体を確認できます。仮想ホストではHostヘッダーが必要なため、実際のホスト名を使うか-Hで指定します。

sudo ss -ltnp | grep -E ':(80|443)\b'
curl -I http://127.0.0.1/
curl -I -H 'Host: www.example.com' http://127.0.0.1/

4. 別端末からの到達

ローカル応答が正常なのに別端末から届かない場合、Apache設定より先にホストファイアウォール、クラウドのセキュリティグループ、ルーター、ロードバランサー、DNSを確認します。タイムアウトは経路やフィルタ、即時の接続拒否は待受やポート不一致、HTTP 403はApacheのアクセス制御やファイル権限を示すことが多く、症状を区別すると切り分けが速くなります。

設定変更の安全な流れ

  1. 変更対象の有効設定とInclude元を確認し、日時付きバックアップを作る。
  2. 一度に一つの目的だけ変更し、差分をレビューする。
  3. 構文テストを行い、警告も内容を確認する。
  4. 可能ならrestartではなくreloadで設定を反映し、既存接続への影響を抑える。
  5. ローカル、経路、外部の順に動作確認し、アクセスログとエラーログを監視する。
  6. 異常なら変更ファイルを戻し、再度構文テストしてreloadする。

設定ファイルを丸ごとインターネット上の例へ置き換えないでください。ディストリビューションの既定Include、モジュール、証明書パス、実行ユーザーが失われます。編集前のファイルとapachectl -Sなどで確認した仮想ホスト構成を保存し、バージョン管理できるなら秘密情報を除いて差分を記録します。秘密鍵や認証情報を一般的なリポジトリへ入れてはいけません。

よくある症状と原因

症状確認場所対応の方向
サービスが起動しないjournal、error_log、configtest構文、ポート競合、権限、モジュールを修正
ローカルは成功、外部はタイムアウトfirewalld/UFW、クラウドFW、経路必要な送信元とサービスだけ許可
403 ForbiddenDirectory/Require、DocumentRoot権限、SELinuxログに出た拒否理由を修正
別サイトが表示されるServerName、ServerAlias、仮想ホスト順apachectl -Sで選択先を確認
再起動後だけ失敗is-enabled、永続FW、証明書・マウント依存起動依存と永続設定を見直す
設定を変えても反映しない編集ファイルのInclude、reload結果有効設定のパスと構文テストを確認

SELinuxを無効化して403を回避する方法は推奨しません。RHEL系では監査ログとファイルコンテキスト、ポートラベル、許可されたブール値を確認し、必要最小限の正しいラベルへ直します。Ubuntu系ではAppArmorプロファイルや通常のUNIX権限を確認します。セキュリティ機構を止めると原因が見えなくなり、別の保護まで失われます。

ログと更新の運用

RHEL系では一般に/var/log/httpd/、Ubuntu系では/var/log/apache2/にアクセスログとエラーログがありますが、仮想ホスト設定で変更できます。障害時は該当時刻、クライアントIP、Host、URL、ステータス、エラー識別子を揃えます。ログにはCookie、クエリ文字列、認証情報などが含まれ得るため、閲覧権限と保存期間を制御します。

パッケージ管理でセキュリティ更新を継続し、更新前に変更点とモジュール互換性を確認します。Apache公式は新旧版を別prefix・別ポートで並行試験する考え方も示しています。大きな更新では設定構文、TLS、モジュールAPI、アプリケーション動作をステージングで確認し、旧版へ戻す手段を確保します。

元記事から引き継いだコマンド例

以下のカスタムコードブロックは元記事から順序と文字列を保って掲載しています。yum、apt、firewalld、UFW、設定パスが混在しているため、すべてを連続実行する手順ではありません。自分のOS、サービス名、公開範囲と一致するブロックだけを読み取り、上記の構文テストと切り戻しを行ってください。ファイアウォールやSELinuxを無効化する代替にはしないでください。

sudo yum update -y
sudo apt update && sudo apt upgrade -y
sudo -v
sudo yum install -y epel-release
sudo apt install -y software-properties-common
sudo firewall-cmd --list-all
sudo yum install -y httpd
sudo dnf install -y httpd
sudo systemctl start httpd
sudo systemctl status httpd
sudo systemctl enable httpd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
http://<サーバーのIPアドレス>
  sudo netstat -tulnp | grep :80
  sudo journalctl -xe
  sudo cat /var/log/httpd/error_log
sudo apt update
sudo apt install -y apache2
sudo systemctl status apache2
sudo systemctl enable apache2
sudo ufw allow 'Apache'
sudo ufw reload
sudo ufw status
http://<サーバーのIPアドレス>
  sudo netstat -tulnp | grep :80
  sudo journalctl -xe
  sudo cat /var/log/apache2/error.log
sudo systemctl status httpd
sudo systemctl status apache2
sudo systemctl start httpd
sudo systemctl start apache2
sudo netstat -tulnp | grep apache
sudo ss -tuln | grep :80
http://<サーバーのIPアドレス>
curl http://localhost
  sudo firewall-cmd --permanent --add-service=http
  sudo firewall-cmd --reload
  sudo ufw allow 'Apache'
  sudo ufw reload
  sudo cat /var/log/httpd/error_log
  sudo cat /var/log/apache2/error.log
  Listen 80
  ServerAdmin [email protected]
  DocumentRoot "/var/www/html"
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example
    ErrorLog ${APACHE_LOG_DIR}/example_error.log
    CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>
sudo a2ensite example.com.conf
sudo systemctl reload apache2
sudo a2enmod ssl
sudo systemctl restart apache2
sudo systemctl restart httpd  # CentOS/RHEL
sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl reload httpd
sudo systemctl reload apache2
sudo systemctl status firewalld
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
sudo ufw status
sudo ufw allow 'Apache'
sudo ufw allow 'Apache Full'
sudo ufw reload
sudo ufw status
sudo netstat -tuln | grep :80
curl http://<サーバーのIPアドレス>
sudo systemctl start httpd
sudo systemctl start apache2
sudo systemctl status httpd  # CentOS/RHEL
sudo systemctl status apache2  # Ubuntu/Debian
sudo systemctl stop httpd  # CentOS/RHEL
sudo systemctl stop apache2  # Ubuntu/Debian
sudo systemctl restart httpd  # CentOS/RHEL
sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl reload httpd  # CentOS/RHEL
sudo systemctl reload apache2  # Ubuntu/Debian
sudo systemctl enable httpd  # CentOS/RHEL
sudo systemctl enable apache2  # Ubuntu/Debian
sudo systemctl disable httpd  # CentOS/RHEL
sudo systemctl disable apache2  # Ubuntu/Debian
sudo systemctl is-enabled httpd  # CentOS/RHEL
sudo systemctl is-enabled apache2  # Ubuntu/Debian
  sudo journalctl -xe
  sudo netstat -tulnp | grep :80

エスカレーションの目安

本番の80/443番を別プロセスが使用している、秘密鍵や証明書の所有者が不明、SELinux拒否を解消できない、ロードバランサー配下で502/503が出る、設定変更後に大量の5xxが発生した場合は、追加変更を重ねず運用担当へ連絡します。変更差分、実行時刻、構文テスト結果、systemd状態、待受、curl結果、関連ログをまとめると復旧判断が速くなります。

よくある質問

yumとdnfのどちらを使いますか?

RHEL 9の公式手順はdnfです。旧環境や互換入口としてyumが使える場合はありますが、/etc/os-releaseと対象ディストリビューションの資料を確認します。

aptで入れたのにhttpd.serviceがありません。

Ubuntu/Debian系の代表的なサービス名はapache2です。RHEL系のhttpdと混同せず、systemctl list-unit-filesやパッケージ情報を確認します。

インストール後にブラウザーから見えません。

systemd、configtest、ss、localhostへのcurlの順に確認します。ローカルで成功した後にホストFW、クラウドFW、DNS、経路を確認します。

ポートを開けるためファイアウォールを止めてもよいですか?

止めません。使用中のゾーンと管理経路を確認し、HTTPまたはHTTPSなど必要なサービスだけを許可します。

設定変更はrestartが必要ですか?

変更内容と環境によります。構文テスト後、対応する変更ならreloadを優先して影響を抑えます。モジュールや起動条件の変更ではrestartが必要な場合があります。

403のためSELinuxを無効にしてよいですか?

推奨しません。監査ログ、ファイルコンテキスト、ポート、ApacheのRequireとUNIX権限を確認し、原因に必要な最小変更を行います。

公式情報源

まとめ

Apacheの導入は、OSを確認してRHEL系のhttpdかUbuntu系のapache2をパッケージ管理で入れ、systemd、構文、待受、ローカル応答を順番に検証すれば安全に進められます。外部公開はその後に必要なサービスだけ許可し、設定変更はバックアップ、configtest、reload、ログ監視、切り戻しを一組で行います。yumとapt、設定パス、サービス名を混ぜず、セキュリティ機構を止めて問題を隠さないことが要点です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次