LinuCレベル2(202試験)の主題2.09「Webサービスとプロキシ(Nginx / Squid分野)」では、現代の大規模Webサービスや企業ネットワークにおいて不可欠なプロキシ技術の動作原理と設定運用が出題範囲に指定されています。
静的ファイルの高速配信やリバースプロキシ(リバースProxy)による負荷分散で事実上の標準となった Nginx と、社内クライアントからのWebアクセス中継・キャッシュ・フィルタリングを担うフォワードプロキシの代表格 Squid は、どちらも通信を「中継・代理(Proxy)」するソフトウェアですが、その目的・配置・制御モデルは大きく異なります。本記事では、AlmaLinux 9.8の実機環境に Nginx 1.20 および Squid 5.5 を導入し、イベント駆動アーキテクチャ、リバースプロキシ設計(proxy_pass/upstream)、SquidのACLとhttp_access先頭一致評価ルールまでを実機検証ログとともに体系的に解説します。
- ホストOS
- AlmaLinux 9.8 (Kernel 5.14.0-503.40.1.el9_5.x86_64)
- ホスト名 / IP
- linuc-node01 / 192.168.2.138
- リバースプロキシ
- Nginx 1.20.1 (nginx-core)
- フォワードプロキシ
- Squid 5.5 (squid-5.5-26.el9_8.x86_64)
- 待受ポート
- Nginx: TCP 80/443, Squid: TCP 3128
| 公式試験の必須出題範囲 | 主題2.09.3(Nginxの設定と管理・proxy_pass)、主題2.09.4(Squidプロキシサーバー・キャッシュ・ACLアクセス制御) |
|---|---|
| 現場で役立つ実務拡張 | Nginx upstreamディレクティブによるバックエンドWebサーバー群のロードバランシング設計 |
目次
1. Nginxのアーキテクチャと基本設定
Apacheが長年採用してきた「プロセス/スレッド専有モデル」に対し、Nginxは「イベント駆動型アーキテクチャ」を採用することで、いわゆる C10K問題(クライアント1万台の同時接続によるリソース枯渇問題) を根本から克服しました。
図1: Nginxリバースプロキシとupstreamによる負荷分散
1.1 イベント駆動・非同期I/OモデルとC10K問題の解決
Nginxは、特権を持つ単一の「マスタプロセス(master process)」と、リクエスト処理を担う少数の「ワーカプロセス(worker process)」で構成されます。
| 比較項目 | Apache(prefork / worker) | Nginx(イベント駆動) |
|---|---|---|
| 処理モデル | 接続ごとに1つのプロセスまたはスレッドを割り当て | 少数のワーカプロセスが非同期I/O(epoll)で多重処理 |
| 同時接続増加時 | メモリ消費が比例して急増、コンテキストスイッチ頻発 | メモリ消費が極めて平坦。1プロセスで数万接続を維持可能 |
| 得意領域 | 動的モジュール処理(PHP、Perl、複雑なアクセス制御) | 静的ファイル高速配信、リバースプロキシ、SSL終端、高トラフィック |
1.2 nginx.conf の階層的コンテキスト構造
Nginxの設定ファイル(/etc/nginx/nginx.conf)は、「コンテキスト(Context)」と呼ばれる波括弧({ })で階層化されています。
-
mainコンテキスト(最上位)ファイル全体の直下に記述します。プロセス実行ユーザー(
user nginx;)、ワーカプロセス数(worker_processes auto;)、PIDファイル配置(pid /run/nginx.pid;)を定義します。 -
eventsコンテキスト接続処理に関する基本設定を定義します。1つのワーカプロセスが同時に受け入れ可能な最大接続数(
worker_connections 1024;)などを指定します。 -
httpコンテキストWebサーバーとしての主要設定(MIMEタイプ、ログ書式、バッファサイズ、KeepAlive、upstreamプール等)を記述します。
-
serverコンテキスト(仮想ホスト)特定のドメインやポート番号(
listen 80;、server_name example.com;)に対する設定ブロックです。Apacheの<VirtualHost>に相当します。 -
locationコンテキスト(URLルーティング)serverブロックの内部に配置し、要求されたリクエストURIのパスに応じた配信ルールやプロキシ転送ルールを適用します。
1.3 静的コンテンツ配信と location ディレクティブの優先順位
LinuC 202試験で頻出のポイントが、同一serverブロック内に複数の location ディレクティブが存在する場合の URIマッチング優先順位ルール です。
| 修飾子 | マッチング方式 | 評価優先度 | 記述例 |
|---|---|---|---|
= |
完全一致(Exact Match) | 最優先(1位) | location = /login { ... } |
^~ |
前方一致最長(以降の正規表現評価を中止) | 高(2位) | location ^~ /images/ { ... } |
~ |
正規表現一致(大文字・小文字を区別) | 中(3位・上から順に評価) | location ~ \.php$ { ... } |
~* |
正規表現一致(大文字・小文字を区別しない) | 中(3位・上から順に評価) | location ~* \.(jpg|png|gif)$ { ... } |
| なし | 前方一致(Prefix Match) | 低(4位・最長マッチが選択) | location / { ... } |
1.4 nginx コマンドによる構文検査とシグナル制御
Nginxの設定変更後は、デーモンの再起動を行わずにコマンドラインから構文チェックと無停止リロードを実行します。
nginx -t: 設定ファイルの構文検査(シンタックスチェック)を実施します。nginx -s reload: 稼働中のワーカプロセスに旧設定のリクエストを完了させつつ、新規ワーカプロセスを立ち上げて新設定を反映します(ゼロダウンタイムリロード)。nginx -s stop: 直ちにプロセスを強制停止(Fast Shutdown)。nginx -s quit: 現在処理中の接続が完了するのを待って正常終了(Graceful Shutdown)。
[user01@linuc-node01 ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
2. Nginxによるリバースプロキシとロードバランシング
Nginxが最も力を発揮する運用形態が、クライアントとバックエンドWebサーバー(Node.js, Tomcat, Python, Apache等)の間に配置される「リバースプロキシ」構成です。
2.1 proxy_pass ディレクティブとヘッダ転送
バックエンドサーバーへHTTPリクエストを転送する中核ディレクティブが proxy_pass です。クライアントの接続元情報がプロキシ自身のIPアドレスに上書きされてしまうのを防ぐため、proxy_set_header でHTTPヘッダを付加します。
location /api/ {
proxy_pass http://192.168.2.130:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
proxy_pass のURI末尾にスラッシュを付けた場合(proxy_pass http://127.0.0.1:8080/;)、location /api/ に合致したプレフィックス部分が除去されてバックエンドへ転送されます(例: /api/test ➔ /test)。一方、スラッシュを省略した場合(proxy_pass http://127.0.0.1:8080;)、要求されたURI全体がそのままバックエンドへ渡されます(例: /api/test ➔ /api/test)。この挙動差異は記述問題の定番です。
2.2 upstream ディレクティブによる負荷分散アルゴリズム
複数のバックエンドサーバーをグループ化してロードバランシングを行うには、http コンテキスト内に upstream ブロックを定義します。
upstream backend_cluster {
# 負荷分散アルゴリズムの指定(省略時はラウンドロビン)
least_conn;
server 192.168.2.130:80 weight=3;
server 192.168.2.131:80 max_fails=3 fail_timeout=10s;
server 192.168.2.134:80 backup;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend_cluster;
}
}
| パラメータ / アルゴリズム | 機能説明 |
|---|---|
| ラウンドロビン(Round-Robin) | 既定値。すべてのサーバーへ順番に均等にリクエストを分散 |
least_conn |
現在アクティブな接続数が最も少ないサーバーを優先して割り当て |
ip_hash |
クライアントIPアドレスのハッシュ値を基に分散。同一クライアントを常に同一サーバーへ固定(セッション維持) |
weight=<数値> |
サーバーの重み付け。性能が高いサーバーに大きな数値を設定(既定値は1) |
backup |
全通常サーバーがダウンした場合にのみリクエストが転送される予備機 |
down |
保守作業等のため一時的にトラフィック割り当てから除外するフラグ |
3. Squidプロキシサーバーの動作原理と基本構成
Nginxが外部からのリクエストを内部Webサーバーへ引き受ける「リバースプロキシ」であるのに対し、社内ネットワーク(プライベートLAN)内の端末からインターネットへのWebアクセスを一括中継するのが「フォワードプロキシ」です。Linux環境における標準フォワードプロキシが Squid です。
図2: SquidプロキシのACL定義とhttp_access先頭一致評価ルール
3.1 フォワードプロキシとリバースプロキシの違い
試験対策として、両プロキシの配置位置とセキュリティ上の目的を整理します。
| 比較項目 | フォワードプロキシ(Squidの主用途) | リバースプロキシ(Nginxの主用途) |
|---|---|---|
| 代理対象 | クライアント側 を代理(クライアントの身元を隠蔽) | サーバー側 を代理(Webサーバー群の存在を隠蔽) |
| 配置場所 | 社内LAN(クライアント側出口)の境界 | データセンター / クラウド(Webサーバー入口)の境界 |
| 主な導入目的 | 不正サイト閲覧遮断(フィルタリング)、社内WAN帯域削減(キャッシュ)、アクセスログ監査 | 負荷分散(ロードバランシング)、SSLアクセラレーション、DoS攻撃防御、静的ファイル高速化 |
3.2 squid.conf の基本設定
Squidの動作設定は /etc/squid/squid.conf に記述します。主要ディレクティブは以下の通りです。
| ディレクティブ名 | 代表的な設定例 | 機能説明 |
|---|---|---|
http_port |
http_port 3128 |
クライアントからのプロキシ要求を待ち受けるTCPポート番号(既定値は3128)。 |
cache_dir |
cache_dir ufs /var/spool/squid 100 16 256 |
ディスクキャッシュのストレージ形式(ufs)、パス、最大容量(MB)、第1階層ディレクトリ数、第2階層ディレクトリ数。 |
cache_mem |
cache_mem 64 MB |
インメモリで高速保持するキャッシュサイズ上限値。 |
maximum_object_size |
maximum_object_size 4 MB |
キャッシュ対象とする個別ファイルの最大サイズ。これを超える大容量ファイルはディスクに保存されません。 |
visible_hostname |
visible_hostname proxy.example.com |
エラー画面等に表示されるプロキシサーバー自身のホスト名。 |
4. Squidにおけるアクセス制御(ACL)と運用管理
Squidにおける通信制御は、「ACL(アクセス制御要素)の定義」と「http_access による許可・拒否判定」の2段階で構成されます。
4.1 acl ディレクティブの定義構文
判定条件をグループ化する基本構文は acl <ACL名> <ACLタイプ> <値...> です。
| ACLタイプ | 判定対象 | 記述例 |
|---|---|---|
src |
クライアントの送信元IPアドレスまたはネットワーク | acl internal_net src 192.168.2.0/24 |
dst |
接続先端末の宛先IPアドレス | acl external_servers dst 198.51.100.0/24 |
dstdomain |
接続先の宛先ドメイン名(先頭のドットでサブドメイン全域に合致) | acl danger_sites dstdomain .danger.com |
port |
接続先の宛先ポート番号 | acl Safe_ports port 80 443 21 |
proto |
転送プロトコル(HTTP, FTP等) | acl Safe_proto proto HTTP SSL |
method |
HTTPリクエストメソッド(GET, POST, CONNECT等) | acl CONNECT method CONNECT |
time |
アクセスを許可または制限する曜日・時間帯 | acl business_hours time M T W H F 09:00-18:00 |
4.2 http_access ディレクティブの評価ルール
定義したACLに対し、実際のトラフィックを許可(allow)または拒否(deny)するのが http_access ディレクティブです。LinuC 202試験では以下の評価ルールが厳格に問われます。
-
先頭一致評価(First Match)
http_access行は 上から下へ順番に評価され、最初に条件に合致(マッチ)した行のアクション(allow または deny)が即座に確定 します。それ以降の行は一切評価されません。 -
同一行内の複数ACL(AND条件)1行に複数のACLが並んでいる場合(例:
http_access allow internal_net business_hours)、すべての条件を満たした場合にのみマッチします。 -
暗黙の動作(Default Action)設定ファイル内のすべての
http_access行にマッチしなかった場合、最後の行のアクションと「逆」の動作が適用 されます。すなわち、末尾がallowであれば暗黙のdeny、末尾がdenyであれば暗黙のallowとなります。誤設定を防ぐため、実務および試験では常に末尾にhttp_access deny allを明示記述するのが鉄則です。
4.3 squid コマンドによる初期化と設定再読み込み
Squidの初期セットアップおよび保守運用コマンドを整理します。
squid -z:cache_dirで指定されたスプール領域に、キャッシュ保存用ディレクトリツリー(00〜FF等)を初期生成します。初回起動前に実行が必須です。squid -k parse(またはsquid -k check):squid.confの設定構文をパース検証します。squid -k reconfigure: サービスを停止させずにsquid.confを再読み込みして設定変更を即時反映します。squid -k shutdown: 処理中のリクエストを完了させてから安全にデーモンを停止します。
[user01@linuc-node01 ~]$ sudo squid -z
Set Current Directory to /var/spool/squid
Creating missing swap directories
No cache_dir stores are configured.
5. プロキシ環境の実機検証とトラフィック解析
プロキシサーバーが正しくトラフィックを中継・キャッシュしているかを確認するためには、ログ解析手法の理解が不可欠です。
5.1 Nginxリバースプロキシ実機検証ログ
Nginxをリバースプロキシとして構成し、バックエンドWebサービスへのルーティングとログ出力を確認します。
192.168.2.1 - - [07/Sep/2026:11:49:25 +0900] "GET / HTTP/1.1" 200 4057 "-" "Mozilla/5.0" "192.168.2.1"
5.2 Squidアクセスログ(access.log)のステータスコード
Squidのアクセスログ(/var/log/squid/access.log)には、リクエストがキャッシュから返されたのか、外部オリジンサーバーへ取得しに行ったのかを示す固有のステータスコードが記録されます。
| Squidステータスコード | 動作内容とキャッシュ状態 |
|---|---|
TCP_HIT |
有効なキャッシュがSquid内に存在したため、オリジンサーバーへ通信せず即座にクライアントへ応答。 |
TCP_MISS |
キャッシュが存在しなかったため、Squidが外部Webサーバーへコンテンツを取得しに行ってクライアントへ転送。 |
TCP_REFRESH_MODIFIED |
キャッシュの有効期限切れのためオリジンへ更新確認を行い、変更があったため新規コンテンツを取得して応答。 |
TCP_REFRESH_UNMODIFIED |
オリジンへ更新確認(304 Not Modified)を行い、変更がなかったため既存キャッシュをそのまま応答。 |
TCP_DENIED |
http_access deny のACLルールに合致したため、プロキシが接続要求を拒否(403 Forbidden)。 |
6. LinuC 202試験(主題2.09)重要ポイント総整理
主題2.09(Webサービスとプロキシ: Nginx / Squid)における記述式問題(コマ問)頻出コマンドおよびディレクティブを整理します。
6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧
| 設問対象・操作内容 | 入力すべきコマンド/設定値 | 注意点・失点防止ポイント |
|---|---|---|
| Nginxの設定構文を検証するコマンド | nginx -t |
小文字の -t(test)オプション |
| Nginxの設定を無停止リロードするコマンド | nginx -s reload |
-s(signal)オプションで reload を指定 |
| Nginxでリクエストを転送するディレクティブ | proxy_pass <URL>; |
末尾のスラッシュ有無の挙動に注意 |
| Nginxでロードバランシング用サーバー群を束ねるブロック | upstream <name> { ... } |
http コンテキスト内に配置する原則 |
| Squidのスプールディレクトリを初期化するコマンド | squid -z |
小文字の -z オプション |
| Squidの設定構文を検証するコマンド | squid -k parse(または check) |
-k オプションとサブコマンド |
| Squidの設定を再読み込みするコマンド | squid -k reconfigure |
reload ではなく reconfigure |
| Squidの標準待受ポート番号 | 3128 |
http_port 3128 |
6.2 Nginx location優先順位とSquid ACL評価の盲点
受験者が最も失点しやすい2大ロジックの盲点を整理します。
-
盲点1: Nginx location の修飾子優先ルール記述順序にかかわらず、
=(完全一致)が最優先され、次いで^~(最長前方一致)、その後に~/~*(正規表現・上から順)が評価されます。通常のプレフィックス一致は正規表現にマッチしなかった場合の最終フォールバックとなる点を正確に把握しておく必要があります。 -
盲点2: Squid http_access の評価順序と遮断漏れSquidは 先頭一致(First Match) であるため、広範な許可ルール(例:
http_access allow internal_net)を上位に記述してしまうと、その下位に配置した個別拒否ルール(例:http_access deny danger_sites)は二度と評価されません。「例外的な拒否条件を上に、一般的な許可条件を下に、最下行に deny all」という配置順序が絶対原則です。
7. まとめと次回予告(第13回:Postfix & Dovecotメールサーバー)
本記事では、LinuCレベル2(202試験)における重要プロキシ技術であるNginxのイベント駆動アーキテクチャ、nginx.conf のコンテキスト構造、リバースプロキシとロードバランシング設計、そしてSquidによるフォワードプロキシのACL定義と http_access 先頭一致評価ルールを実機ログとともに体系的に解説しました。
リバースプロキシとフォワードプロキシは、現代の企業インフラおよびクラウドアーキテクチャにおいて通信の要となるコンポーネントです。ディレクティブの構文や評価順序の原理を正確に整理しておくことが、試験合格への確実なステップとなります。
次回(第13回)からは、インターネットの基幹コミュニケーションインフラである「メールシステム」を扱います。Linux環境の標準SMTPサーバーである Postfix と、POP3/IMAP受信サーバーである Dovecot を組み合わせたセキュアなメール送受信環境(SMTP AUTH, TLS暗号化, メールボックス形式)の構築と実機検証を進めます。
