インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

NginxリバースプロキシとSquidプロキシサーバー構築【202試験 主題2.09】

公開
,
LinuC Level 2 第12回 主題2.09 Webサービス



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. 1. Nginxのアーキテクチャと基本設定
    1. 1.1 イベント駆動・非同期I/OモデルとC10K問題の解決
    2. 1.2 nginx.conf の階層的コンテキスト構造
    3. 1.3 静的コンテンツ配信と location ディレクティブの優先順位
    4. 1.4 nginx コマンドによる構文検査とシグナル制御
  2. 2. Nginxによるリバースプロキシとロードバランシング
    1. 2.1 proxy_pass ディレクティブとヘッダ転送
    2. 2.2 upstream ディレクティブによる負荷分散アルゴリズム
  3. 3. Squidプロキシサーバーの動作原理と基本構成
    1. 3.1 フォワードプロキシとリバースプロキシの違い
    2. 3.2 squid.conf の基本設定
  4. 4. Squidにおけるアクセス制御(ACL)と運用管理
    1. 4.1 acl ディレクティブの定義構文
    2. 4.2 http_access ディレクティブの評価ルール
    3. 4.3 squid コマンドによる初期化と設定再読み込み
  5. 5. プロキシ環境の実機検証とトラフィック解析
    1. 5.1 Nginxリバースプロキシ実機検証ログ
    2. 5.2 Squidアクセスログ(access.log)のステータスコード
  6. 6. LinuC 202試験(主題2.09)重要ポイント総整理
    1. 6.1 記述式(コマ問)頻出コマンド・ディレクティブ一覧
    2. 6.2 Nginx location優先順位とSquid ACL評価の盲点
  7. 7. まとめと次回予告(第13回:Postfix & Dovecotメールサーバー)

1. Nginxのアーキテクチャと基本設定

Apacheが長年採用してきた「プロセス/スレッド専有モデル」に対し、Nginxは「イベント駆動型アーキテクチャ」を採用することで、いわゆる C10K問題(クライアント1万台の同時接続によるリソース枯渇問題) を根本から克服しました。

Nginxリバースプロキシとupstreamによる負荷分散

図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)」と呼ばれる波括弧({ })で階層化されています。

  1. mainコンテキスト(最上位)
    ファイル全体の直下に記述します。プロセス実行ユーザー(user nginx;)、ワーカプロセス数(worker_processes auto;)、PIDファイル配置(pid /run/nginx.pid;)を定義します。
  2. eventsコンテキスト
    接続処理に関する基本設定を定義します。1つのワーカプロセスが同時に受け入れ可能な最大接続数(worker_connections 1024;)などを指定します。
  3. httpコンテキスト
    Webサーバーとしての主要設定(MIMEタイプ、ログ書式、バッファサイズ、KeepAlive、upstreamプール等)を記述します。
  4. serverコンテキスト(仮想ホスト)
    特定のドメインやポート番号(listen 80;server_name example.com;)に対する設定ブロックです。Apacheの <VirtualHost> に相当します。
  5. 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)。
nginx -t による設定構文検査実機ログ
[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 の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 によるロードバランサー定義例
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 です。

SquidプロキシのACL定義とhttp_access先頭一致評価ルール

図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試験では以下の評価ルールが厳格に問われます。

  1. 先頭一致評価(First Match)
    http_access 行は 上から下へ順番に評価され、最初に条件に合致(マッチ)した行のアクション(allow または deny)が即座に確定 します。それ以降の行は一切評価されません。
  2. 同一行内の複数ACL(AND条件)
    1行に複数のACLが並んでいる場合(例: http_access allow internal_net business_hours)、すべての条件を満たした場合にのみマッチします。
  3. 暗黙の動作(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: 処理中のリクエストを完了させてから安全にデーモンを停止します。
squid -z によるキャッシュスプール初期化実機ログ
[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サービスへのルーティングとログ出力を確認します。

Nginxアクセスログの出力ログ確認
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. 盲点1: Nginx location の修飾子優先ルール
    記述順序にかかわらず、=(完全一致)が最優先され、次いで ^~(最長前方一致)、その後に ~ / ~*(正規表現・上から順)が評価されます。通常のプレフィックス一致は正規表現にマッチしなかった場合の最終フォールバックとなる点を正確に把握しておく必要があります。
  2. 盲点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暗号化, メールボックス形式)の構築と実機検証を進めます。

前の記事
次の記事