Apache Webサーバーの高度な構成と運用管理ガイド

Apacheの動作モード(MPM)の選択と最適化

Apache HTTP Serverのパフォーマンスは、Multi-Processing Module(MPM)の選択に大きく依存します。主なMPMには「Prefork」、「Worker」、「Event」の3種類があります。現在の動作モードは以下のコマンドで確認できます。

# httpd -V | grep -i "Server MPM"
Server MPM:     event

コンパイル時に--with-mpm=[prefork|worker|event]を指定してモードを切り替えることが可能です。

  • Prefork: リクエストごとにプロセスを生成します。スレッドセーフでないモジュールとの互換性が高く安定していますが、メモリ消費量が多く、高并发処理には不向きです。
  • Worker: マルチスレッドとマルチプロセスを組み合わせたモデルです。メモリ効率が良く、高并发環境でPreforkよりも高いスケーラビリティを発揮します。スレッドセーフなモジュールである必要があります。
  • Event: Workerをベースに、Keep-Alive接続などを専用のスレッドで管理するため、接続待機状態のリソースを効率的に解放できます。特に高并发で接続数が多い環境で有効です。

Basic認証によるアクセス制御

管理画面などの特定のディレクトリに対して、Basic認証を設定する手順です。

  1. 認証用ユーザーファイルの作成
    htpasswdコマンドを使用してパスワードファイルを作成します。
    # htpasswd -c /etc/httpd/conf/.htpasswd admin01
    # htpasswd -m /etc/httpd/conf/.htpasswd support_user
    
  2. ディレクトリ設定の追加
    バーチャルホスト設定内に対象ディレクトリのアクセス制限を記述します。
    <Directory "/var/www/html/admin">
        AuthName "Restricted Area"
        AuthType Basic
        AuthUserFile /etc/httpd/conf/.htpasswd
        Require valid-user
    </Directory>
    
  3. 特定のファイルやサブディレクトリの除外
    認証が必要なディレクトリ内でも、公開用の画像ディレクトリや特定のAPIファイルを認証なしでアクセスさせたい場合は、Satisfy Anyを使用します。
    <Directory "/var/www/html/admin/public">
        AuthMerging Off
        Require all granted
    </Directory>
    

バーチャルホストの構築とデフォルト設定の無効化

設定ファイルの先頭に記述されたバーチャルホストは、サーバーのIPアドレスや未定義のホスト名でアクセスされた場合のデフォルトサイトとして機能します。誤ったドメインでのアクセスを防ぐため、最初のバーチャルホストをアクセス拒否に設定することを推奨します。

# デフォルトホストのアクセス拒否設定
<VirtualHost *:80>
    ServerName default.invalid
    DocumentRoot "/var/www/html/dummy"
    <Directory "/var/www/html/dummy">
        Require all denied
    </Directory>
</VirtualHost>

# 実際のサービスホスト設定
<VirtualHost *:80>
    ServerName www.example-service.com
    ServerAlias service.example.com
    DocumentRoot "/var/www/html/mainsite"
    ErrorLog "logs/mainsite-error_log"
    CustomLog "logs/mainsite-access_log" combined
</VirtualHost>

ドメインの恒久的な移転(301リダイレクト)

SEO対策として、旧ドメインから新ドメインへアクセスを恒久的に転送する場合はmod_rewriteを使用します。

<IfModule mod_rewrite.c>
    RewriteEngine On
    # 複数の旧ドメインを指定
    RewriteCond %{HTTP_HOST} ^(www\.)?old-legacy\.com [OR]
    RewriteCond %{HTTP_HOST} ^(www\.)?legacy-v1\.net
    # 新ドメインへ転送
    RewriteRule ^(.*)$ https://www.new-example.com/$1 [R=301,L]
</IfModule>

ログのローテーションとフィルタリング

Apacheにはログファイルを日時やサイズで切り替えるrotatelogsツールが付属しています。また、静的ファイルへのアクセスログを記録しないことでディスクI/Oを抑制できます。

ログローテーション設定:

静的リソースのログ除外:

# 画像やCSS、JSのリクエストに環境変数を設定
SetEnvIf Request_URI "\.(gif|jpe?g|png|svg|css|js|ico)$" static_asset
# static_assetフラグが付いていないものだけ記録
CustomLog "logs/access_log" combined env=!static_asset

静的コンテンツのキャッシュ制御

mod_expiresモジュールを使用して、クライアント側でのキャッシュ期間を制御し、サーバーへの負荷と通信量を削減します。

<IfModule mod_expires.c>
    ExpiresActive On
    # 画像は1ヶ月キャッシュ
    ExpiresByType image/jpeg "access plus 30 days"
    ExpiresByType image/png "access plus 30 days"
    # CSSとJSは1週間
    ExpiresByType text/css "access plus 7 days"
    ExpiresByType application/javascript "access plus 7 days"
</IfModule>

リファラに基づくアンチホットリンク(盗難防止)

外部サイトから自サーバーの画像やリソースが直接参照される(ホットリンク)のを防ぐには、Refererヘッダーをチェックします。

<Directory "/var/www/html/uploads">
    # 許可する自サイトドメイン
    SetEnvIfNoCase Referer "^https://www\.example\.com/" valid_referer
    SetEnvIfNoCase Referer "^$" valid_referer
    
    <FilesMatch "\.(jpg|png|gif|zip|pdf)$">
        Order Deny,Allow
        Deny from all
        Allow from env=valid_referer
    </FilesMatch>
</Directory>

IPアドレスによるアクセス制限

管理者用ページなどに対して、特定のIPアドレスからのアクセスのみを許可する設定です。

<Location "/admin">
    Order Deny,Allow
    Deny from all
    # 許可するIPアドレスまたはセグメント
    Allow from 192.168.1.100
    Allow from 10.0.0.0/8
</Location>

セキュリティ強化:PHP解析の禁止とUser-Agent制限

ファイルアップロードディレクトリ等でPHPスクリプトが実行されないようにする、または特定のボットを拒否する設定です。

特定ディレクトリでのPHP実行禁止:

<Directory "/var/www/html/uploads">
    php_admin_flag engine off
    <FilesMatch "\.php$">
        Order Allow,Deny
        Deny from all
    </FilesMatch>
</Directory>

悪質なUser-Agentの拒否:

<IfModule mod_rewrite.c>
    RewriteEngine On
    # 特定のボット名を含むUAを拒否
    RewriteCond %{HTTP_USER_AGENT} "MaliciousBot" [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} "ScrapperTool" [NC]
    RewriteRule .* - [F]
</IfModule>

Apache Rewriteルールの詳細

mod_rewriteはURLの書き換え、リダイレクト、プロキシ転送などを行う強力なモジュールです。

構文例:

RewriteEngine On
RewriteBase /
# 条件定義: クエリストリングに特定のパラメータがある場合
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
# ルール定義: 数値IDをディレクトリ構造に見立てて書き換え
RewriteRule ^view_item\.php$ /item/%1? [R=301,L]

主要なフラグ:

  • [R]: リダイレクト(コード指定なしは302)
  • [L]: 書き換え処理の終了(Last)
  • [NC]: 大文字小文字を区別しない(No Case)
  • [F]: アクセス禁止(403 Forbidden)
  • [PT]: パススルー(次のハンドラーへ処理を渡す)

リバースプロキシ(ProxyPass)の設定

Apacheをリバースプロキシとして使用し、バックエンドのアプリケーションサーバーへリクエストを転送する設定です。これにより外部への露出をApacheに集約し、セキュリティやロードバランシングを強化できます。

<IfModule mod_proxy.c>
    ProxyRequests Off
    
    # バックエンドへの転送設定
    ProxyPass /api/ http://backend.internal.local:8080/service/
    ProxyPassReverse /api/ http://backend.internal.local:8080/service/
    
    # 特定のパスは転送除外(例: 静的ファイル)
    ProxyPass /static/ !
</IfModule>

ProxyPassReverseは、バックエンドからのリダイレクト応答(Locationヘッダー等)をクライアントに対して正しく書き換えるために重要です。バックエンドのアドレス(内部IP)が外部に漏れるのを防ぎます。

タグ: Apache WebServer ReverseProxy mod_rewrite SystemAdministration

9月3日 21:31 投稿