読者です 読者をやめる 読者になる 読者になる

ラズパイをプロキシサーバー(キャッシュサーバー)として使う( Raspbian & Squid )

大したネタではないですが備忘録。


複数の仮想マシンapt(あるいはyumとかHomebrewも含めて)で同じパッケージをダウンロードをするケースが結構ある。

Ubuntu 16.04の仮想マシンが複数あるとして、どっちも同じようにapt upgradeを実行すると、同じ修正パッケージを取得することになり、明らかに無駄。

ホスト側でプロキシサーバーを動かして、透過型プロキシもありかと思ったけど、ちょっと面倒だなってことでラズパイを活用してみる。

構成

仮想化ホストマシンと同じサブネット上に接続したラズパイをキャッシュサーバーとして使う。

スループットの面からすると激しくイマイチだけど、どのみち外向けの回線がWiMAX2+なので問題ない。

ラズパイのイーサネットポートは100MbpsなのでIEEE 802.11nWifiの方が速度は出るかもしれない。

要件

  • LAN内部に設置
  • ローカルホストおよび仮想マシン(ゲスト)から接続できればOK
  • ある程度大き目のファイル(100MB〜200MBぐらい)もキャッシュさせたい
  • ラズパイの microSD の空き領域の有効活用(10GBぐらいはキャッシュに使って問題ない)

インストール

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install squid
$ sudo apt install squidclient

squidclientは動作状態をチェックするためのツールです。なくても動作します。

設定

$ sudo vi /etc/squid/squid.conf

修正結果の差分は以下のとおり。

$ sudo diff -N /etc/squid/squid.conf.orig /etc/squid/squid.conf
609,611c609,611
< acl localnet src 10.0.0.0/8   # RFC1918 possible internal network
< acl localnet src 172.16.0.0/12        # RFC1918 possible internal network
< acl localnet src 192.168.0.0/16       # RFC1918 possible internal network
---
> #acl localnet src 10.0.0.0/8  # RFC1918 possible internal network
> #acl localnet src 172.16.0.0/12       # RFC1918 possible internal network
> acl localnet src 192.168.0.0/24       # RFC1918 possible internal network
676c676
< #http_access allow localnet
---
> http_access allow localnet
1738c1738
< # cache_mem 8 MB
---
>  cache_mem 16 MB
1747c1747
< # maximum_object_size_in_memory 8 KB
---
>  maximum_object_size_in_memory 16 KB
1945c1945
< # cache_dir ufs /var/spool/squid 100 16 256
---
>  cache_dir ufs /var/spool/squid 8196 16 256
1988c1988
< # maximum_object_size 20480 KB
---
>  maximum_object_size 204800 KB
3392a3393
> visible_hostname unknown
4699c4700
< # forwarded_for on
---
>  forwarded_for off

要点は、

  • ローカルネットワーク(192.168.0.0/24)からのアクセスを許可
  • キャッシュするファイルのサイズを大きく(maximum_object_size
  • 使用するディスク領域の上限を大きく(cache_dir
  • プロキシ経由であることをアクセス先に通知しない(forwarded_for

下記のコマンドで設定ファイルの書式のチェック。

$ sudo squid -k parse

エラーが出なければプロセスを起動。

$ sudo systemctl start squid

設定ファイルのリファレンス:squid : Optimising Web Delivery

有効化

問題なく動くようなら自動的にsquid起動するようにする。

$ sudo systemctl enable squid

クライアント側の設定

ブラウザからは利用するようにしてもいいが、基本的にaptgitで同じファイルをダウンロードするケースを高速化できればいいので環境変数のみセットする。

VirtualBox 上のゲスト

VirtualBoxの「環境設定」から「プロキシ」タブを選択して「手動設定」で設定する。ゲスト側は気にする必要がない。

コンソール系のツール

一度実行すればあとはコマンド履歴から再実行すればいい。ノートPCを持って外出する場合は環境変数の値を空にする。

export http_proxy=http://プロキシサーバーのIP:3128
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"

ポート番号をデフォルトの"3128"から変更している場合はそれに合わせて修正する。

手作業で環境変数をセットするのが面倒ならArch Linuxにオンオフを切り替えるスクリプトの例が記載されているのでこれを参考にする。

プロキシ設定 - ArchWiki

sudo経由で実行するコマンドは設定しない限り環境変数は引き継がないので注意する(Arch LinuxWikiを参照。

動作状態のチェック

悲しいことにsquidclientコマンドを実行するとIPv6のポートへ接続しようとするのでエラーになる。

$ squidclient -h localhost mgr:mem
client: ERROR: Cannot connect to [::1]:3128: Connection refused

対処法としては-hIPv4のアドレスを指定する。

$ squidclient -h 127.0.0.1 mgr:mem
Sending HTTP request ... done.
HTTP/1.0 200 OK
Server: squid/2.7.STABLE9
Date: Thu, 09 Mar 2017 19:30:52 GMT
Content-Type: text/plain
Expires: Thu, 09 Mar 2017 19:30:52 GMT
X-Cache: MISS from unknown
X-Cache-Lookup: MISS from unknown:3128
Via: 1.0 unknown:3128 (squid/2.7.STABLE9)
Connection: close

Current memory usage:
Pool     Obj Size       Allocated                                        In Use         Idle                     Allocations Saved                       Hit Rate
         (bytes)        (#)      (KB)    high (KB)       high (hrs)      impact (%total)(#)      (KB)    high (KB)       portion (%alloc)       (#)      (KB)    high (KB)     (number)  (%num)  (%vol) (%num)  (number)
2K Buffer                2048    2       4       4       0.42    2       2       4      4        100     0       0       2       28      0.52    5.89    93.33   30
4K Buffer                4096    4       16      16      0.35    7       1       4      16       25      3       12      16      61      1.13    25.65   93.85   65
Store Client Buffer      4096    1       4       4       0.05    2       1       4      4        100     0       0       4       3       0.06    1.26    75.00   4
acl                        48    11      1       1       0.42    0       11      1      1        100     0       0       0       0       0.00    0.00    0.00    11
acl_ip_data                16    5       1       1       0.42    0       5       1      1        100     0       0       0       0       0.00    0.00    0.00    5
acl_list                   12    23      1       1       0.42    0       23      1      1        100     0       0       0       0       0.00    0.00    0.00    23
CacheDigest                24    1       1       1       0.42    0       1       1      1        100     0       0       0       0       0.00    0.00    0.00    1
 <skip>

他にも確認できる項目の一覧を表示する場合は、squidclient -h 127.0.0.1 mgr:を実行。

関連URL

今更な感じもしますが、ないよりマシでしょうってことで。


[2017/03/12 追記] よく考えたらgithub経由のダウンロードはHTTPS経由なんで(プロキシではキャッシュできないので)大した効果はない……。


それではまた。