LinuCレベル2(202試験)の主題2.09「Webサービスとプロキシ(Apache)」では、オープンソースのWebサーバーとして世界中で採用されている Apache HTTP Server(httpd) の内部アーキテクチャ、基本ディレクティブの構文規則、アクセス制御、バーチャルホスト、およびTLS/HTTPSによる暗号化通信の構築技術が出題範囲に指定されています。
特にLinuC試験では、Apache 2.2系からApache 2.4系への移行に伴って刷新された「アクセス制御構文(Order/Allow/Deny から Require への変更)」や、公開鍵暗号基盤(OpenSSL)を用いた証明書・秘密鍵の生成手順、mod_ssl ディレクティブの割り当てが最頻出ポイントです。本記事では、AlmaLinux 9.8の実機環境に Apache 2.4.62 および OpenSSL 3.5.5 を導入し、設定ファイルのスコープ制御からHTTPS通信の確立までを実機検証ログとともに体系的に解説します。
- ホストOS
- AlmaLinux 9.8 (Kernel 5.14.0-503.40.1.el9_5.x86_64)
- ホスト名 / IP
- linuc-node01 / 192.168.2.138
- Webサーバー
- Apache 2.4.62 (httpd)
- 暗号化ライブラリ
- OpenSSL 3.5.5 / mod_ssl 2.4.62
- 制御コマンド
- apachectl / httpd
| 公式試験の必須出題範囲 | 主題2.09.1(Apache HTTPサーバーの設定と管理・VirtualHost・アクセス制御)、主題2.09.2(OpenSSLとHTTPSの設定・CSR生成・SSLディレクティブ) |
|---|---|
| 現場で役立つ実務拡張 | 中間CA証明書チェーンの構築手順、Let’s Encrypt導入を想定したモダンTLSプロファイル設定 |
目次
1. Apache HTTP Serverのアーキテクチャと基本設定
Apache HTTP Serverは、モジュール構造を採用した高機能なWebサーバーです。基本機能に加えて必要な拡張モジュール(mod_*.so)を動的ロード(DSO: Dynamic Shared Object)することで、柔軟なサーバー構成を実現します。
図1: Apache 2.4 ディレクティブスコープとアクセス制御の評価順序
1.1 Webサーバーの役割とMPM(Multi-Processing Module)
クライアント(ブラウザ)から送信されるHTTPリクエスト(GET, POST等)を並行処理する基盤エンジンが MPM(Multi-Processing Module) です。LinuC 202試験では以下の3大MPMの特性比較が出題されます。
| MPM名 | 動作モデル | 主な特徴と適用シーン |
|---|---|---|
event(現代の標準) |
マルチプロセス + マルチスレッド + イベント駆動(非同期I/O) | Keep-Alive接続の待機処理を専用リスナースレッドに分離。リソース消費を最小限に抑え、C10K問題(大量同時接続)に強い。Apache 2.4のデフォルト。 |
worker |
マルチプロセス + マルチスレッド | 複数の子プロセス内で多数のスレッドを起動してリクエストを分担処理。preforkに比べてメモリ消費が少なく高スループット。 |
prefork(旧式モデル) |
シングルスレッドのマルチプロセス(スレッド非使用) | 1つのプロセスが1つの接続を専有処理。メモリ消費量が大きいが、スレッドセーフでない古いPHP拡張モジュール(mod_php等)との互換性に優れる。 |
1.2 httpd.conf の基本構造と主要グローバルディレクティブ
AlmaLinuxやRHEL系における主設定ファイルは /etc/httpd/conf/httpd.conf です(Debian/Ubuntu系では /etc/apache2/apache2.conf)。サーバー全体の動作を決定する主要ディレクティブは以下の通りです。
| ディレクティブ名 | 機能説明 | 典型的な設定値 |
|---|---|---|
ServerRoot |
設定ファイルやログが配置される基準トップディレクトリ | ServerRoot "/etc/httpd" |
DocumentRoot |
Web公開する静的HTMLファイル群の物理ルートディレクトリ | DocumentRoot "/var/www/html" |
Listen |
HTTPリクエストを待ち受けるIPアドレスおよびポート番号 | Listen 80 または Listen 192.168.2.138:80 |
ServerName |
サーバー自身のホスト名およびポート番号(リダイレクト等に使用) | ServerName linuc-node01.example.com:80 |
DirectoryIndex |
ディレクトリURL(/)にアクセスされた際の優先表示ファイル |
DirectoryIndex index.html index.php |
ErrorLog |
サーバーエラーや警告メッセージの出力先ファイルパス | ErrorLog "logs/error_log" |
CustomLog |
アクセスログの出力先と適用フォーマット名の指定 | CustomLog "logs/access_log" combined |
User / Group |
リクエストを処理する子プロセスが動作する実行ユーザー/グループ | User apache / Group apache |
1.3 ディレクティブスコープ(<Directory>, <Files>, <Location>)
特定のリソースに対して個別のアクセス権限やオプションを適用する「コンテナディレクティブ(スコープ)」の使い分けは試験の頻出分野です。
-
<Directory <物理パス>>サーバー上の 物理ファイルシステムのディレクトリ を対象とします。サブディレクトリにも再帰的に設定が継承されます(例:
<Directory "/var/www/html">)。 -
<Files <ファイル名>>ディレクトリの場所に依存せず、特定のファイル名パターン を対象とします。ワイルドカードや正規表現が使用可能です(例:
<Files ".ht*">で.htaccess等の不可視ファイルを保護)。 -
<Location <URLパス>>物理ファイル構造とは無関係に、ブラウザが要求するURLパス を対象とします。動的スクリプトやリバースプロキシ設定、サーバー内部ステータス表示(
/server-status)等に多用されます。
1.4 apachectl による設定構文検査とサービス制御
Apacheの制御および構文検査には、管理用CLIツール apachectl(または httpd コマンド)を使用します。
apachectl configtest(またはapachectl -t):httpd.confおよびconf.d/*.confの構文エラーを検査します。apachectl graceful: 処理中の接続を切断することなく、安全に設定ファイルを再読み込みします(無停止リロード)。apachectl status:mod_statusが有効な場合、稼働ワーカー数やリクエスト処理状況を表示します。
2. Apache 2.4におけるアクセス制御と認証
Apache 2.4系では、アクセス制御の記述方式が抜本的に変更されました。LinuC 202試験の合否を左右する重要ポイントです。
2.1 AllowOverride ディレクティブと .htaccess の制御
各ディレクトリに配置された分散設定ファイル .htaccess による設定の上書きを許可するか否かを指定するのが AllowOverride です。
AllowOverride None:.htaccessを完全に無視します。ディスクI/Oを抑制してWebサーバーの性能を最大化する本番環境の推奨設定です。AllowOverride All:.htaccess内のすべてのディレクティブ記述を許可します。AllowOverride AuthConfig: ユーザー認証関連ディレクティブ(AuthType,Require等)の上書きのみを許可します。AllowOverride Indexes: ディレクトリ一覧表示の制御(Options +Indexes等)のみを許可します。
2.2 mod_authz_core による Require ディレクティブ構文
Apache 2.2系で使用されていた Order allow,deny および Allow from all / Deny from all は非推奨となり、Apache 2.4系では mod_authz_core が提供する Require ディレクティブに一本化されました。
| 制御内容 | Apache 2.2系(旧構文) | Apache 2.4系(新構文・出題対象) |
|---|---|---|
| 全クライアントを許可 | Order allow,deny |
Require all granted |
| 全クライアントを拒否 | Order deny,allow |
Require all denied |
| 特定IP/CIDRのみ許可 | Order deny,allow |
Require ip 192.168.2.0/24 |
| 特定ホスト名のみ許可 | Allow from .example.com |
Require host example.com |
さらに複合的な条件判定を行う場合、論理コンテナディレクティブを使用します。
<RequireAll> ... </RequireAll>: 内部に記述された条件の「すべて」に一致する場合のみアクセスを許可(AND条件)。<RequireAny> ... </RequireAny>: 内部に記述された条件の「いずれか1つ」に一致すればアクセスを許可(OR条件・既定の挙動)。
2.3 htpasswd によるBasic認証の実装
特定ディレクトリに対してID・パスワードによる認証を要求するBasic認証は、htpasswd コマンドと以下のディレクティブで構築します。
# パスワードファイルの初期作成(-c オプションで新規生成)
[user01@linuc-node01 ~]$ sudo htpasswd -c /etc/httpd/.htpasswd webadmin
New password:
Re-type new password:
Adding password for user webadmin
# httpd.conf 内のディレクティブ記述
<Directory "/var/www/html/admin">
AuthType Basic
AuthName "Restricted Admin Area"
AuthUserFile "/etc/httpd/.htpasswd"
Require valid-user
</Directory>
3. バーチャルホストによる複数Webサイトの集約
1台のサーバーハードウェア(単一のhttpdデーモン)上で、複数の異なるドメイン名やWebサイトを並行稼働させる技術が バーチャルホスト(VirtualHost) です。
3.1 名前ベース(Name-based)バーチャルホスト
単一のIPアドレスとポート番号(80番)を共有しながら、ブラウザから送信されるHTTPリクエストヘッダ内の Host: ヘッダ情報を識別してコンテンツを振り分ける方式です。IPv4アドレスを浪費しないため、現代のWeb運用の主流となっています。
<VirtualHost *:80>
ServerName siteA.example.com
ServerAlias www.siteA.example.com
DocumentRoot "/var/www/siteA"
ErrorLog "logs/siteA_error_log"
CustomLog "logs/siteA_access_log" combined
</VirtualHost>
<VirtualHost *:80>
ServerName siteB.example.com
DocumentRoot "/var/www/siteB"
ErrorLog "logs/siteB_error_log"
CustomLog "logs/siteB_access_log" combined
</VirtualHost>
3.2 IPベース(IP-based)バーチャルホスト
ホストOSに複数のネットワークインターフェース(またはIPエイリアス)を割り当て、接続先IPアドレスごとにサイトを分離する方式です。<VirtualHost 192.168.2.10:80> のように特定のIPアドレスを明示します。
4. OpenSSLとmod_sslによるTLS/HTTPS通信の構築
Web通信の盗聴や改ざん、なりすましを防ぐため、TLS(Transport Layer Security)による通信暗号化をApacheに組み込む手順を整理します。
図2: OpenSSLによるTLSサーバー証明書の発行フローとmod_ssl設定
4.1 公開鍵暗号基盤(PKI)とTLSハンドシェイクの流れ
HTTPS通信の確立(TLSハンドシェイク)では、ハイブリッド暗号方式が採用されています。
-
サーバー認証と公開鍵の受取クライアントが接続すると、Webサーバーは自身のデジタル証明書(X.509証明書: 公開鍵を含む)を提示します。クライアントは信頼された認証局(CA)のルート証明書を基にサーバーの身元を検証します。
-
共通鍵(セッションキー)の安全な交換公開鍵暗号(またはDiffie-Hellman鍵交換)を用いて、その通信セッション専用の一時的な共通鍵を安全に共有します。
-
高速な暗号化通信の実施ハンドシェイク完了後は、処理負荷の軽い共通鍵暗号(AES-GCM等)を用いてHTTPデータの送受信を行います。
4.2 OpenSSLコマンドによる秘密鍵・CSR・自己署名証明書の生成
LinuC 202試験では、暗号化通信に必要なファイル群を生成する OpenSSLコマンド の構文が頻出します。
-
1. 秘密鍵の生成(openssl genrsa)サーバー側の秘密鍵を作成します(例:
openssl genrsa -out server.key 2048)。このファイルは第三者に漏洩してはならないため、パーミッションを600に厳格制限します。 -
2. 証明書署名要求の作成(openssl req -new)秘密鍵と公開鍵、および組織情報(国名/C、組織名/O、FQDNであるコモンネーム/CN)を含むCSRを作成します(例:
openssl req -new -key server.key -out server.csr)。 -
3. 証明書の発行(openssl x509 -req)認証局(CA)にCSRを提出して署名を受けるか、テスト環境では自身の秘密鍵で自己署名(オレオレ証明書)を発行します。
実機環境において、秘密鍵と自己署名証明書を一括生成した検証ログです。
[user01@linuc-node01 ~]$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/pki/tls/private/localhost.key \
-out /etc/pki/tls/certs/localhost.crt \
-subj "/C=JP/ST=Tokyo/L=Chiyoda/O=ExampleCorp/CN=linuc-node01.example.com"
[user01@linuc-node01 ~]$ sudo apachectl configtest
Syntax OK
4.3 mod_ssl の設定とディレクティブ
ApacheでTLSを有効化するには mod_ssl モジュールを導入し、/etc/httpd/conf.d/ssl.conf にて以下のディレクティブを定義します。
| ディレクティブ名 | 機能説明 | 設定例 |
|---|---|---|
SSLEngine |
該当バーチャルホストにおけるSSL/TLS暗号化の有効化 | SSLEngine on |
SSLCertificateFile |
サーバー証明書(公開鍵)ファイルのパス | SSLCertificateFile /etc/pki/tls/certs/localhost.crt |
SSLCertificateKeyFile |
サーバー証明書に対応する秘密鍵ファイルのパス | SSLCertificateKeyFile /etc/pki/tls/private/localhost.key |
SSLCertificateChainFile |
中間認証局(中間CA)証明書ファイルのパス | SSLCertificateChainFile /etc/pki/tls/certs/chain.crt |
SSLProtocol |
利用を許可するTLSプロトコルバージョンの指定 | SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 |
SSLCipherSuite |
暗号化スイート(暗号化アルゴリズムの優先順)の指定 | SSLCipherSuite HIGH:!aNULL:!MD5 |
実機環境で起動したApacheに対して curl でHTTPS通信テストを実行したログです(自己署名証明書のため -k オプションで証明書検証をスキップ)。
[user01@linuc-node01 ~]$ curl -k -I https://localhost/
HTTP/1.1 403 Forbidden
Date: Mon, 07 Sep 2026 00:45:17 GMT
Server: Apache/2.4.62 (AlmaLinux) OpenSSL/3.5.5
Last-Modified: Mon, 24 Mar 2025 16:15:24 GMT
ETag: "1680-63118e9567f00"
Accept-Ranges: bytes
Content-Length: 5760
Content-Type: text/html; charset=UTF-8
5. ログ管理とパフォーマンスチューニング
Webサーバーのアクセス傾向分析やトラブルシューティング、高負荷耐性の向上のためのログ設計および持続的接続制御を整理します。
5.1 LogFormat と CustomLog によるアクセスログ設計
Apacheのアクセスログは、LogFormat ディレクティブで定義された書式文字列に従って記録されます。標準フォーマットである combined 形式の指定子を整理します。
| フォーマット指定子 | 記録されるデータ内容 |
|---|---|
%h |
接続元クライアントのリモートホスト名またはIPアドレス |
%l |
クライアントのリモートログ名(identdによる。通常はハイフン -) |
%u |
HTTP認証(Basic認証等)で認証されたユーザー名 |
%t |
リクエストを受領した時刻([日/月/年:時:分:秒 タイムゾーン]) |
\"%r\" |
クライアントからのリクエスト行(例: "GET /index.html HTTP/1.1") |
%>s |
クライアントへ返却した最終HTTPステータスコード(例: 200, 404) |
%b |
HTTPヘッダを除く送信バイト数(レスポンスボディサイズ) |
\"%{Referer}i\" |
リンク元のRefererヘッダ文字列(combined形式で追加) |
\"%{User-Agent}i\" |
クライアントのWebブラウザ・OS識別文字列(combined形式で追加) |
5.2 KeepAlive による持続的接続の最適化
Webページを表示する際、HTML本体だけでなく多数の画像やCSS、JavaScriptファイルが読み込まれます。リソースごとに毎回TCP 3ウェイハンドシェイクを繰り返すオーバーヘッドを抑制する機構が KeepAlive(持続的接続) です。
KeepAlive On: 単一のTCP接続上で複数のHTTPリクエストを連続処理することを許可します。MaxKeepAliveRequests <回数>: 1回の持続的接続で処理を許可する最大リクエスト数(例:100)。0を指定すると無制限となります。KeepAliveTimeout <秒数>: 同一接続上で次のリクエストが到着するまでの待機時間(秒)。値を大きくしすぎるとアイドル状態の接続がプロセス・スレッドを占有し、新規接続を受け付けられなくなるリスクがあります。
6. LinuC 202試験(主題2.09)重要ポイント総整理
主題2.09「Webサービスとプロキシ(Apache)」における記述式問題(コマ問)頻出コマンドおよび新旧構文の対比を整理します。
6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧
| 設問対象・操作内容 | 入力すべきコマンド/設定値 | 注意点・失点防止ポイント |
|---|---|---|
| Apacheの設定構文を検証するコマンド | apachectl configtest(または -t) |
httpd -t でも正解となる場合あり |
| 無停止で設定を再読み込みするコマンド | apachectl graceful |
reload ではなく graceful が定番 |
| Apache 2.4で全アクセスを許可するディレクティブ | Require all granted |
3単語のスペルと空白に注意 |
| Apache 2.4で全アクセスを拒否するディレクティブ | Require all denied |
deny ではなく過去分詞の denied |
| Basic認証のパスワードファイルを新規作成するコマンド | htpasswd -c <file> <user> |
新規作成時は -c(create)オプション必須 |
| mod_sslでサーバー証明書を指定するディレクティブ | SSLCertificateFile <path> |
秘密鍵指定の SSLCertificateKeyFile と区別 |
| URLパスを対象とするコンテナディレクティブ | <Location> |
物理パス対象の <Directory> と混同防止 |
6.2 Apache 2.2系と2.4系のアクセス制御構文対比
過去問や古い解説書を解く際に混乱しやすい変更点を整理します。
-
Orderディレクティブの完全撤廃Apache 2.2では
Order allow,denyのように評価順序を宣言していましたが、2.4系ではこのディレクティブ自体が不要(非推奨)となり、Requireのみでアクセス制御を完結させます。 -
IP制限におけるRequire構文の簡素化2.2系の
Allow from 192.168.1.0/24は、2.4系では直感的にRequire ip 192.168.1.0/24と記述します。
7. まとめと次回予告(第12回:Nginx & Squidプロキシ)
本記事では、LinuCレベル2(202試験)におけるWebサービスの基盤であるApache HTTP Serverについて、MPMアーキテクチャ、基本ディレクティブ、ディレクティブスコープ、Apache 2.4のRequireアクセス制御、名前ベースバーチャルホスト、およびOpenSSLとmod_sslによるセキュアなTLS/HTTPS環境の構築手順を実機ログとともに体系的に整理しました。
Webサーバーの構築は、設定構文の正確さに加えて、証明書発行やパーミッション管理など総合的なLinuxインフラ運用スキルが求められます。実機でコマンドラインから秘密鍵を生成し、ブラウザやcurlで検証した実体験が、試験本番のコマ問記述において迷いのない回答を可能にします。
次回(第12回)は、近年の高負荷Webサービスでデファクトスタンダードとなっているイベント駆動型軽量Webサーバー Nginx と、企業ネットワークの帯域節約・アクセス制御を担うプロキシサーバー Squid を取り上げます。リバースプロキシによる負荷分散やキャッシュ制御、クライアントプロキシのアクセスフィルタリングを実機検証していきます。
