dockerでsquid(Harvest Cache)を動かす

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/f2cf0d19-4493-337b-758e-87c46ecaa69f.png)

作成日：2024年10月/19日(土)

## １．はじめに

OpenAIのRealtime APIを会社で使用するために自宅で学習していますが、自宅には企業プロキシがないため、環境の違いにより自宅での検証結果を会社で活かせず困っています。
そこで、会社と同様の企業プロキシ相当の環境を自宅にも準備し、OpenAIのRealtime APIの理解を深めることで、仕事をよりスムーズに進められると考えています。

## ２．プロキシとは

プロキシとは、インターネットとローカルネットワークの間に位置し、クライアントの要求を代理で処理するサーバーのことです。主な役割には、セキュリティの向上、アクセス制御、そしてネットワークパフォーマンスの最適化があります。企業環境では、プロキシサーバーを通じてインターネットアクセスを管理し、セキュリティポリシーを適用することが一般的です。

```mermaid
graph TB
    C[インターネット] -->|レスポンス| B[フォワードプロキシ]
    B -->|レスポンス中継| A[クライアント]
    A -->|リクエスト| B
    B -->|リクエスト中継| C
    
    subgraph D[イントラネット]
        A
        B
    end

    style A fill:#f9f,stroke:#333,stroke-width:4px
    style B fill:#bbf,stroke:#333,stroke-width:4px
    style C fill:#f96,stroke:#333,stroke-width:4px
    style D fill:#dff,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5

```

## ３．Harvest Cacheとは

Harvest Cacheは、1990年代初頭にPeter DeutschとAlan Emtageによって開発された、初期のウェブキャッシングシステムです。University of Colorado at Boulderで誕生し、その後、インターネットの急速な成長に伴い広く採用されました。Harvest Cacheの主な特徴は、分散型アーキテクチャ、効率的なデータ収集、そして柔軟な検索機能です。このシステムは後のSquidプロキシサーバーの開発に大きな影響を与え、現代のウェブキャッシング技術の基礎となりました。

Squidの導入により、Harvest Cacheの利点を活用し、ウェブブラウジングの速度が大幅に向上します。

Harvest Cacheの主な特徴

- キャッシュヒット率
平均40-60%（ネットワークトラフィックの削減に貢献）
- レイテンシ改善
キャッシュヒット時に50-70%の応答時間短縮
- スケーラビリティ
単一サーバーで1日あたり100万以上のリクエストを処理可能
- ストレージ効率
圧縮技術により、オリジナルデータの30-50%の容量で保存

[grahammitchell.com](https://grahammitchell.com/harvest/index.html)

## ４．プロキシの種類

プロキシには主に以下の種類があります。
会社では隔離されたイントラネットからインターネットへの接続にフォーワードプロキシが採用されているため、**今回はsquidで環境を構築します。**

| No | 種類 | 説明 | 代表的なサービス | 公開日 |
| --- | --- | --- | --- | --- |
| 1 | フォワードプロキシ(*1) | クライアントとインターネット間で動作 | Squid、CERN httpd | Squid: 1996年、CERN httpd：1990年 |
| 2 | リバースプロキシ(*2) | サーバーの前に配置され、クライアントからの要求を処理 | Nginx, HAProxy | Nginx: 2004年、HAProxy: 2001年 |

(*1) [フォワードプロキシ：クライアントからの要求を受け取り、インターネット上のサーバーに転送します。主に企業や学校などの組織で使用され、アクセス制御やフィルタリングに役立ちます。](#)

(*2) [リバースプロキシ：サーバーの前に配置され、クライアントからの要求を受け取ってサーバーに転送します。負荷分散やセキュリティ強化に使用されます。](https://www.notion.so/2024-10-19-123fec3297a880018108c6e273a45025?pvs=21)

## ５．squidの機能

Squidは、キャッシングとアクセス制御を主な機能とするオープンソースのプロキシサーバーソフトウェアで、ネットワークパフォーマンスの向上とセキュリティポリシーの適用を可能にします。

```mermaid
graph TB
    A[クライアント] --> B[Squid プロキシ]
    B --> C[インターネット]
    
    subgraph Squidの主な機能
        D[キャッシング]
        E[アクセス制御]
    end
    
    B -.-> D
    B -.-> E
    
    D -->|頻繁にアクセスされるコンテンツを保存| B
    E -->|特定のウェブサイトやコンテンツへのアクセスを制限| B

    style A fill:#f9f,stroke:#333,stroke-width:2px
    style B fill:#bbf,stroke:#333,stroke-width:4px
    style C fill:#f96,stroke:#333,stroke-width:2px
    style D fill:#bfb,stroke:#333,stroke-width:2px
    style E fill:#fbf,stroke:#333,stroke-width:2px
```

この図は以下の要素を表しています：

- クライアントからSquidプロキシを経由してインターネットに接続する基本的な流れ
- Squidの主な機能である「キャッシング」と「アクセス制御」
- キャッシング機能：頻繁にアクセスされるウェブコンテンツをローカルに保存し、ネットワークトラフィックを削減
- アクセス制御機能：特定のウェブサイトやコンテンツへのアクセスを制限し、組織のポリシーを適用

この図を使用することで、Squidの主要な機能と動作の概要を視覚的に理解しやすくなります。

[squid : Optimising Web Delivery](https://www.squid-cache.org/)

## ６．Dockerでsquidを起動する

Dockerのコンテナ技術は、このようなプロキシサーバーの実装に最適な選択肢です。軽量で柔軟性が高く、環境の再現性にも優れているためです。幸いなことに、UbuntuがSquidのDockerイメージを維持管理してくれていますので、こちらを活用させていただきます。

本稿では、[ubuntu/squid](https://hub.docker.com/r/ubuntu/squid)イメージを使用し、docker-compose.ymlファイルを通じてSquidプロキシサーバーを起動する方法を解説します。

[hub.docker.com](https://hub.docker.com/r/ubuntu/squid)

公式ページ[ubuntu/squid](https://hub.docker.com/r/ubuntu/squid)を見るとdocker runでsquidのDockerイメージを実行するように記載されていましたが、docker composeを使用した方が管理が楽なので今回はdocker-compose.ymlファイルとsquid.confファイルのVolumeマウントを使用してdocker compose環境を作成します。

以下のような構成でsquidを起動するdocker compose環境を構築していきます。

```
docker/
└── squid/
    ├── config/
    │   └── squid.conf
    └── docker-compose.yml
```

### 6.1 docker-compose.ymlファイル

docker-compose.ymlファイルは、Dockerコンテナの設定と実行を簡素化し、複数のコンテナを一括で管理するための強力なツールです。単純にDockerイメージを実行する場合と比較して、以下のような利点があります：

- **設定の一元管理：** 複数のコンテナの設定を1つのファイルにまとめることができ、環境の管理が容易になります。
- **再現性の向上：** 設定がバージョン管理できるため、異なる環境での再現性が高まります。
- **複雑な環境の構築：** 複数のサービスを連携させた環境を簡単に定義し、起動できます。
- **コマンドの簡素化：** 長いdocker runコマンドを省略し、simple docker-compose upコマンドで環境を起動できます。
- **スケーラビリティ：** サービスのスケールアップやダウンが容易になります。
- **ネットワーク設定の自動化：** コンテナ間のネットワーク設定を自動で行います。

これらの利点により、docker-compose.ymlを使用することで、より効率的で管理しやすいDockerベースの開発・運用環境を構築できます。

```
version: "3.4"
services:
  squid:
    image: ubuntu/squid:latest
    restart: always
    container_name: squid
    hostname: squid
    volumes:
     - ./config/squid.conf:/etc/squid/squid.conf
    ports:
     - "3128:3128"
```

| No | 設定項目 | 説明 | 設定値 |
| --- | --- | --- | --- |
| 1 | version | Docker Composeファイルのバージョンを指定 | 3.4 |
| 2 | services | 定義するサービスのリストを開始 | - |
| 3 | squid | サービス名を定義 | - |
| 4 | image | 使用するDockerイメージを指定 | ubuntu/squid:latest |
| 5 | restart | コンテナの再起動ポリシーを設定 | always |
| 6 | container_name | コンテナの名前を指定 | squid |
| 7 | hostname | コンテナのホスト名を設定 | squid |
| 8 | volumes | ホストとコンテナ間のファイル共有を設定 | ./config/squid.conf:/etc/squid/squid.conf |
| 9 | ports | ホストとコンテナ間のポートマッピングを指定 | 3128:3128 |

### 6.2 squid.conf

squid.confファイルはDockerイメージ内の/etc/squid/sqiod.confに配置されているファイルでubuntu/squidのアクセスコントロールなどの細かな設定が可能です。
このsquid.confはホストとDockerコンテナ間で共有し、ホスト側で管理をしたいので、ubuntu/squidイメージに同梱されている最新版をDockerイメージから抽出することにしました。

具体的にはdocker-compose.ymlのvolumes定義を削除してubuntu/squidのコンテナを起動し、docker cpコマンドでホストOSにコピーします。

起動に使うdocker-compose.yml

```
version: "3.4"
services:
  squid:
    image: ubuntu/squid:latest
    restart: always
    container_name: squid
    hostname: squid
    **#volumes:
    # - ./config/squid.conf:/etc/squid/squid.conf**
    ports:
     - "3128:3128"
```

squid.confコピー前のフォルダ構成

```
docker/
└── squid/
    ├── config/
    |
    └── docker-compose.yml
```

ubuntu/squidの起動

```
[root@localmotion squid]# docker compose up -d
WARN[0000] /root/squid/docker-compose.yml: `version` is obsolete
[+] Running 1/1
 ? Container squid  Started                                                                                                                                                                               0.2s
[root@localmotion squid]# docker ps
CONTAINER ID   IMAGE                 COMMAND                   CREATED          STATUS         PORTS                                       NAMES
662a2ae33f06   ubuntu/squid:latest   "entrypoint.sh -f /e…"   14 seconds ago   Up 6 seconds   0.0.0.0:3128->3128/tcp, :::3128->3128/tcp   squid
[root@localmotion squid]#
```

ubuntu/squidからsquid.confファイルをコピー

```
[root@localmotion squid]# docker cp squid:/etc/squid/squid.conf ./config/squid.conf
Successfully copied 353kB to /root/squid/config/squid.conf
[root@localmotion squid]#
```

squid.confコピー後のフォルダ構成

```
docker/
└── squid/
    ├── config/
    │   └── squid.conf
    └── docker-compose.yml
```

コピーしたらdocker compose downして、docker-compose.ymlを元に戻すのを忘れないでください。

```
[root@localmotion squid]# docker compose down
WARN[0000] /root/squid/docker-compose.yml: `version` is obsolete
[+] Running 2/2
 ? Container squid        Removed                                                                                                                                                                        10.2s
 ? Network squid_default  Removed                                                                                                                                                                         0.1s
[root@localmotion squid]#
```

```
version: "3.4"
services:
  squid:
    image: ubuntu/squid:latest
    restart: always
    container_name: squid
    hostname: squid
    **volumes:
     - ./config/squid.conf:/etc/squid/squid.conf**
    ports:
     - "3128:3128"
```

### 6.3 docker composeでの起動

```
[root@localmotion squid]# docker compose up -d
WARN[0000] /root/squid/docker-compose.yml: `version` is obsolete
[+] Running 2/2
 ? Network squid_default  Created                                                                                                                                                                         0.2s
 ? Container squid        Started                                                                                                                                                                         0.3s
[root@localmotion squid]#
```

## ７．動作確認

Windows11でのホストOSでの動作確認はホストOSのEdgeブラウザとsquidのログで確認できます。

Windows11のプロキシサーバの設定を以下のように変更して、Edgeブラウザで適当なページ(今回はYahoo!JAPAN)にアクセスしてみてください。

### 7.1 Windowsのプロキシサーバの設定を実施

[設定]⇒[ネットワークとインターネット]⇒[プロキシ]の「手動プロキシセットアップ」

![win11_proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/00f0e801-c57c-196e-d69f-57300ee1b196.png)


### 7.2 Edgeブラウザでアクセス

Yahoo!JAPANのページにアクセスしてみました。

![yahoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/2b70c174-02dd-061c-c8d7-f6270736f1ab.png)

### 7.3 docker logsでログを確認

wslのコンソールに接続して、docker logs squidとしてログを出力します。

```
[root@hogehoge squid]# **docker logs squid**
2024/10/18 23:29:02| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2024/10/18 23:29:02| Processing Configuration File: /etc/squid/conf.d/debian.conf (depth 1)
2024/10/18 23:29:02| Processing Configuration File: /etc/squid/conf.d/rock.conf (depth 1)
2024/10/18 23:29:02| Created PID file (/run/squid.pid)

>8 >8 >8 >8 >8 チョキチョキ:長いので省略

2024/10/18 23:29:02| Accepting HTTP Socket connections at conn3 local=[::]:3128 remote=[::] FD 12 flags=9
    listening port: 3128
2024/10/18 23:29:02 pinger| Initialising ICMP pinger ...
2024/10/18 23:29:02 pinger| ICMP socket opened.
2024/10/18 23:29:02 pinger| ICMPv6 socket opened

>8 >8 >8 >8 >8 チョキチョキ:長いので省略

**1729294453.868   5413 192.168.1.137 TCP_TUNNEL/200 74647 CONNECT www.yahoo.co.jp:443 - HIER_DIRECT/182.22.31.124 -
1729294453.868   5204 192.168.1.137 TCP_TUNNEL/200 64525 CONNECT yads.c.yimg.jp:443 - HIER_DIRECT/183.79.249.124 -
1729294453.868   5093 192.168.1.137 TCP_TUNNEL/200 33636 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.124 -
1729294453.868   4698 192.168.1.137 TCP_TUNNEL/200 4783896 CONNECT im.c.yimg.jp:443 - HIER_DIRECT/124.83.185.124 -**
[root@localmotion squid]#
```

**www.yahoo.co.jp:443に中継できていることが確認できました。**