この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:T
更新日時:2026-06-11 07:12:00

タイトル: Apache HTTP Server のインストール方法(CentOS / RHEL)
SEOタイトル: CentOS / RHEL での Apache (httpd) インストール完全手順(systemctl / firewalld / SELinux / SSL / PHP 連携)

この記事の要点
  • sudo yum install httpd(RHEL 8+ / Rocky / Alma は dnf
  • サービス起動: systemctl start httpd + systemctl enable httpd
  • ファイアウォール: firewall-cmd --permanent --add-service=http
  • SELinux 有効環境では chcon -R -t httpd_sys_content_t でコンテキスト付与
  • SSLmod_ssl + Let's Encrypt (Certbot)PHP 連携mod_php or php-fpm

インストール

# CentOS 7
sudo yum install -y httpd

# RHEL 8 / 9 / Rocky / AlmaLinux (dnf)
sudo dnf install -y httpd

# バージョン確認
httpd -v
# Server version: Apache/2.4.62 (Rocky Linux)
# Server built:   ...

# モジュール一覧
httpd -M

起動と自動起動

# サービス起動
sudo systemctl start httpd

# 状態確認
sudo systemctl status httpd
# Active: active (running) since ...

# OS 起動時の自動起動
sudo systemctl enable httpd

# 設定確認(起動せずに)
sudo httpd -t
# Syntax OK

# 設定変更後の安全な再読み込み
sudo systemctl reload httpd    # 既存接続を維持して再読込
sudo systemctl restart httpd   # 完全再起動

# 停止
sudo systemctl stop httpd

ファイアウォール (firewalld) 設定

# HTTP (80) を開放
sudo firewall-cmd --permanent --add-service=http

# HTTPS (443) を開放
sudo firewall-cmd --permanent --add-service=https

# 反映
sudo firewall-cmd --reload

# 確認
sudo firewall-cmd --list-services
# dhcpv6-client http https ssh

# 個別ポート開放(例: 8080)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

# 動作確認
curl -I http://localhost/
# HTTP/1.1 403 Forbidden  (デフォルトでは welcome page)

SELinux への対処

CentOS / RHEL ではデフォルトで SELinux が有効。非標準パスや非標準ポートを使うとアクセス拒否されます:

# 現状確認
getenforce
# Enforcing / Permissive / Disabled

# DocumentRoot を /var/www/html 以外に置く場合、コンテキスト付与が必要
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?"
sudo restorecon -Rv /srv/web

# 一時的に確認用(再起動で戻る)
sudo chcon -R -t httpd_sys_content_t /srv/web

# 非標準ポート (8080 等) を使う場合
sudo semanage port -a -t http_port_t -p tcp 8080

# 監査ログで拒否原因を見る
sudo ausearch -m AVC -ts recent

# 緊急回避(開発時のみ)
sudo setenforce 0    # 一時的に Permissive
# 永続的に: /etc/selinux/config で SELINUX=permissive

ディレクトリ構成

パス役割
/etc/httpd/conf/httpd.confメイン設定ファイル
/etc/httpd/conf.d/*.conf追加設定(自動 include)
/etc/httpd/conf.modules.d/*.confモジュールロード設定
/var/www/html/デフォルト DocumentRoot
/var/log/httpd/access_logアクセスログ
/var/log/httpd/error_logエラーログ
/etc/httpd/logs↑のシンボリックリンク

動作確認用 index.html

# テストページ作成
echo '<h1>Hello Apache</h1>' | sudo tee /var/www/html/index.html

# 所有権・権限
sudo chown -R apache:apache /var/www/html/
sudo chmod -R 755 /var/www/html/

# ブラウザでアクセス
# http://サーバIP/ → Hello Apache

# コマンドラインで確認
curl http://localhost/

Virtual Host 設定

# /etc/httpd/conf.d/example.conf

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example

    <Directory /var/www/example>
        Options Indexes FollowSymLinks
        AllowOverride All           # .htaccess 有効化
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/example_error.log
    CustomLog /var/log/httpd/example_access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName api.example.com
    DocumentRoot /var/www/api
    ...
</VirtualHost>
# 設定検証 → 反映
sudo httpd -t
sudo systemctl reload httpd

# Virtual Host 一覧確認
sudo httpd -S

SSL/TLS 化(Let's Encrypt)

# mod_ssl インストール
sudo dnf install -y mod_ssl

# Certbot で Let's Encrypt 証明書取得
sudo dnf install -y certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

# → 自動的に <VirtualHost *:443> 設定が追加される
# → 自動リダイレクト設定も可能

# 自動更新(90 日ごと)
sudo systemctl enable --now certbot-renew.timer

# 手動更新テスト
sudo certbot renew --dry-run

手動の SSL VirtualHost

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example

    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/example.com/privkey.pem

    # 強い暗号スイートのみ許可
    SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite          HIGH:!aNULL:!MD5
    SSLHonorCipherOrder     on

    # HSTS
    Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

PHP 連携

# 方法1: mod_php(簡単・低速)
sudo dnf install -y php
sudo systemctl restart httpd

# 動作確認
echo '<?php phpinfo();' | sudo tee /var/www/html/info.php
# http://localhost/info.php

# 方法2: PHP-FPM(推奨・高速・分離)
sudo dnf install -y php-fpm php-mysqlnd
sudo systemctl enable --now php-fpm

# /etc/httpd/conf.d/php.conf にデフォルトで proxy_fcgi 設定済
# <FilesMatch \.php$>
#     SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
# </FilesMatch>

# 設定確認
php -v
php -m | grep mysqlnd

よく使うモジュール

モジュール用途
mod_sslHTTPS
mod_rewriteURL 書換
mod_proxy / proxy_http / proxy_fcgiリバプロ・FastCGI
mod_deflategzip 圧縮
mod_headersHTTP ヘッダ追加
mod_securityWAF

トラブルシューティング

症状原因対処
外部からアクセスできないfirewalld 閉firewall-cmd --add-service=http
403 Forbidden(自作ディレクトリ)SELinux コンテキストchcon -R -t httpd_sys_content_t
500 Internal Server Error.htaccess 構文 / PHP エラーtail /var/log/httpd/error_log
(13)Permission deniedファイル権限 / SELinux権限 + SELinux 両方確認
Address already in use: 80nginx 等が 80 使用中ss -tlnp | grep :80

FAQ

Q: nginx と Apache どちらが速い?
A: 静的配信は nginx が高速。動的(PHP / Python)は両方とも FastCGI 経由で大差なし。Apache は .htaccess でディレクトリ単位設定可能、nginx は不可(設定ファイル集中管理)。

Q: yum と dnf どちらを使う?
A: CentOS 7 までは yum、RHEL 8 / Rocky / Alma 以降は dnf(yum は dnf へのシンボリックリンク)。コマンドは互換。

Q: SELinux は無効化していい?
A: 本番環境では無効化非推奨。コンテキスト付与で対応するのが正攻法。開発時のみ Permissive モードに。