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系 | httpd | httpd | /etc/httpd/ |
| 旧CentOS/RHEL系 | httpd | httpd | yum利用可否を対象版資料で確認 |
| Ubuntu / Debian系 | apache2 | apache2 | /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のアクセス制御やファイル権限を示すことが多く、症状を区別すると切り分けが速くなります。
設定変更の安全な流れ
- 変更対象の有効設定とInclude元を確認し、日時付きバックアップを作る。
- 一度に一つの目的だけ変更し、差分をレビューする。
- 構文テストを行い、警告も内容を確認する。
- 可能ならrestartではなくreloadで設定を反映し、既存接続への影響を抑える。
- ローカル、経路、外部の順に動作確認し、アクセスログとエラーログを監視する。
- 異常なら変更ファイルを戻し、再度構文テストしてreloadする。
設定ファイルを丸ごとインターネット上の例へ置き換えないでください。ディストリビューションの既定Include、モジュール、証明書パス、実行ユーザーが失われます。編集前のファイルとapachectl -Sなどで確認した仮想ホスト構成を保存し、バージョン管理できるなら秘密情報を除いて差分を記録します。秘密鍵や認証情報を一般的なリポジトリへ入れてはいけません。
よくある症状と原因
| 症状 | 確認場所 | 対応の方向 |
|---|---|---|
| サービスが起動しない | journal、error_log、configtest | 構文、ポート競合、権限、モジュールを修正 |
| ローカルは成功、外部はタイムアウト | firewalld/UFW、クラウドFW、経路 | 必要な送信元とサービスだけ許可 |
| 403 Forbidden | Directory/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 -ysudo apt update && sudo apt upgrade -ysudo -vsudo yum install -y epel-releasesudo apt install -y software-properties-commonsudo firewall-cmd --list-allsudo yum install -y httpdsudo dnf install -y httpdsudo systemctl start httpdsudo systemctl status httpdsudo systemctl enable httpdsudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reloadhttp://<サーバーのIPアドレス> sudo netstat -tulnp | grep :80 sudo journalctl -xe
sudo cat /var/log/httpd/error_logsudo apt updatesudo apt install -y apache2sudo systemctl status apache2sudo systemctl enable apache2sudo ufw allow 'Apache'
sudo ufw reloadsudo ufw statushttp://<サーバーのIPアドレス> sudo netstat -tulnp | grep :80 sudo journalctl -xe
sudo cat /var/log/apache2/error.logsudo systemctl status httpdsudo systemctl status apache2sudo systemctl start httpdsudo systemctl start apache2sudo netstat -tulnp | grep apachesudo ss -tuln | grep :80http://<サーバーの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 apache2sudo a2enmod ssl
sudo systemctl restart apache2sudo systemctl restart httpd # CentOS/RHEL
sudo systemctl restart apache2 # Ubuntu/Debiansudo systemctl reload httpd
sudo systemctl reload apache2sudo systemctl status firewalldsudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --reloadsudo firewall-cmd --list-allsudo ufw statussudo ufw allow 'Apache'sudo ufw allow 'Apache Full'sudo ufw reloadsudo ufw statussudo netstat -tuln | grep :80curl http://<サーバーのIPアドレス>sudo systemctl start httpdsudo systemctl start apache2sudo systemctl status httpd # CentOS/RHEL
sudo systemctl status apache2 # Ubuntu/Debiansudo systemctl stop httpd # CentOS/RHEL
sudo systemctl stop apache2 # Ubuntu/Debiansudo systemctl restart httpd # CentOS/RHEL
sudo systemctl restart apache2 # Ubuntu/Debiansudo systemctl reload httpd # CentOS/RHEL
sudo systemctl reload apache2 # Ubuntu/Debiansudo systemctl enable httpd # CentOS/RHEL
sudo systemctl enable apache2 # Ubuntu/Debiansudo systemctl disable httpd # CentOS/RHEL
sudo systemctl disable apache2 # Ubuntu/Debiansudo 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権限を確認し、原因に必要な最小変更を行います。
公式情報源
- Ubuntu Server 公式ドキュメント
- Red Hat 公式ドキュメント
- Apache HTTP Server 公式ドキュメント
- Apache HTTP Server 公式ドキュメント
- Apache HTTP Server 公式ドキュメント
まとめ
Apacheの導入は、OSを確認してRHEL系のhttpdかUbuntu系のapache2をパッケージ管理で入れ、systemd、構文、待受、ローカル応答を順番に検証すれば安全に進められます。外部公開はその後に必要なサービスだけ許可し、設定変更はバックアップ、configtest、reload、ログ監視、切り戻しを一組で行います。yumとapt、設定パス、サービス名を混ぜず、セキュリティ機構を止めて問題を隠さないことが要点です。

コメント