squid は プロキシキャッシュのサービス。
オープンソース(ライセンスは GPL)。クラスプラットフォーム。ヤリイカだそうです。
ソースは 2.x まで C、3.0 から C++ になっているので注意。
3.x 系の最新(安定?)バージョンは 2010年 05月 現在 3.1.3。
とりあえず使ってみる †
Fedora 12 などの最近の Linux には squid をインストール時に組み込めたりする。
インストールで導入してない場合は、パッケージをインストールして使ってみる。
- スーパーユーザになる。
$ su
- squid をインストールする。
# yum install squid
- /etc/squid/squid.conf を設定
- 「システム」→「管理」→「ファイアーウォール」を開く。
- 画面左ペインから「その他のポート」を選択。
- 画面右ペインで「追加」を押して 3128 番(squid)を選択して「OK」。
- 「適用」を押して設定画面を閉じる。
- squid を起動。
/etc/rc.d/init.d/squid start
- 自動起動の設定もしておく(任意)
# chkconfig squid on
これで、このサーバを介してインターネットに接続してみる。
IE8 なら、「ツール」→「インターネットオプション」→「接続」タブ→「LANの設定」で「プロキシサーバ」のチェックボックスを ON にして、アドレスに上記で設定した Linux サーバの IPを、ポートに 3128 を設定。
Firefox の場合も 「ツール」→「オプション」→「詳細」タブ→「ネットワーク」タブの接続グループに同様の設定がある。
上記設定をして、どこかインターネットのページ(www.yahoo.co.jp とか)を開いてみる。開ければ、とりあえず動いてるということ。
コンパイルして実行してみる †
今度は yum ではなく、squid のソースから導入してみる。
- まず、ダウンロード。
- squid downlad
- どこでもいいけど、ここは /home/(ユーザ名)/download に squid-3.1.x.tar.gz として保存したとする。
- スーパーユーザになる。
$ su
- カレントを移動する。
# cd /home/(ユーザ名)/download
- ダウンロードした書庫を展開する。
# tar zxvf squid-3.1.x.tar.gz
※squid-3.1.x というディレクトリができる。
- カレントを移動する。
# cd squid-3.1.x
- configure して Makefile をつくる。
# ./configure
インストール先はデフォルトで /usr/local/squid になるので、これを変えたい場合は prefix オプションで指定する。
# ./configure --prefix=/hoge/squid
とか。
- make する。
# make
- 特にエラーがなければインストールする。
# make install
- ここまでで、/usr/local/squid にインストールされているはずなので、確認。
# ls /usr/local/squid
- squid 用のグループがあるか確認。
# grep squid /etc/group
- 見つかれば、すでにあるということ。私の環境には以下のようなグループが既にあった。
squid:x:23:
※yum で squid を入れると勝手に作成されるのかな。。ちとよくわからん。
- ない場合は作成。
# groupadd squid
- squid 用のユーザがいるか確認。
# grep squid /etc/passwd
- キャッシュディレクトリを作成。
# mkdir /usr/local/squid/var/cache
- キャッシュとログのディレクトリのオーナーを squid に変更する。
# chown squid.squid /usr/local/squid/var/cache
# chown squid.squid /usr/local/squid/var/logs
# chown squid.squid /usr/local/squid/var/run -R
# chown squid.squid /usr/local/squid/var/lock
或いは、こうかな。
# chown -R squid.squid /usr/local/squid/var
- squid.conf を設定。
- キャッシュディレクトリを作成。
# cd /usr/local/sbin (←インストールしたところ)
# ./squid /usr/local/squid/sbin/squid -z
ここまでで、一応動くようになっているはず。
squid ユーザで、とりあえずログ出力させながら起動してみる。
# sudo squid /usr/local/squid/sbin/squid -N -d1
※-Nd1 というのは、非デーモン、デバッグログを出力するモードで起動する、というオプションです。
※実行後プロンプトに復帰しないので、停止させる場合は Ctrl + C で。
特にエラーが出ていないようなら、Windows などの PC で接続してみる。
Windows 側のインターネットの設定方法は、上述と同じで。
squid.conf の設定 †
いっぱいあるけど、とりあえず動かす為にやっておいた方が良い設定だけ。
- アクセスコントロールの設定
acl example_net src 192.168.0.0/255.255.255.0
※"acl CONNECT method CONNECT" の次の行くらい。
※"example_net" は何でも良い。下の http_access allow の記述に合わせる。
※この IP はローカル使用を想定してます。
- アクセス許可
http_access allow example_net
※"http_access deny all" の前の行。
※"example_net" は何でも良い。上の acl の記述に合わせる。
- ローカルIPを見えなくする設定
forwarded_for off
※多分どこでも良い
- プロキシの表示名設定
visible_hostname squid.example.com
※多分どこでも良い。
※ローカルで使用する名前なら何でも良い。
- プロキシを通過したことを隠す場合は以下を設定
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
※多分どこでも良い。
- cache_dir の設定を変更
#cache_dir ufs /var/spool/squid 100 16 256
cache_dir ufs /usr/local/squid/var/cache 1024 16 256
※コメントになってるので、有効にしてパスとサイズを書き換える。
※ここは サイズ 1G としてますが、お好みで。
- coredump_dir の設定変更
#coredump_dir /var/spool/squid
coredump_dir /usr/local/squid/var/cache
※cache_dirと同じところに。
- squidを実行するグループとユーザを設定
cache_effective_user squid
cache_effective_group squid
Windows でコンパイルしてみる †
Windows で squid をコンパイルする場合は、主に MinGW(+ msys)を使う方法と、Cygwin を使う方法がある。それぞれの環境の導入方法などは こちら を参考に。Visual Studio でもコンパイラを GCC にすればいけるかもしれないけど、私は試してない。
基本的なやり方は Linux でのやり方(上述)と同じだが、公式サイトの解説 によれば、それぞれ configure に次のオプションをつけた方が良いらしい。
MinGW の場合
$ ./configure \
--disable-wccp \
--disable--wccpv2 \
--enable-win32-service \
--enable-default-hostsfile=none
Cygwin の場合
$ ./configure \
--disable-wccp \
--disable--wccpv2
disable-wccp というのは、Windows は POSIX が使えないので、それを無効にするオプションらしい。 enable-win32-service は Windows のサービスとしてコンパイルするということだと思う。
msys での起動パス †
msys で squid を起動しようとすると、パスがおかしいためか起動できない。(どう見てもあるはずのファイルがないよと怒られる)
デフォルトでは、インストール先が /usr/local/squid となるが、これは msys が指す /usr/local(実パスは (msysインストールフォルダ)\local )ではなく、C:\usr\local を指している為。
なので、インストールフォルダをまるまる C:\usr\local\squid にコピーして DOS プロンプトで起動してやれば動く。
C:\> cd C:\usr\local\squid\sbin
C:\usr\local\squid\sbin> squid -z
C:\usr\local\squid\sbin> squid
ちなみに、Cygwin ならそのまま動作するようだ。
3.1.x はコンパイルできない? †
squid-2.7.STABLE9 や squid-3.0.STABLE25 であれば、特に問題なくコンパイルできた。configure も make もエラーなし。ただ、現時点(2010/05/19)の最新バージョンである squid-3.1.3 は上手くコンパイルできない。これは MinGW でも Cygwin でも同様。ただ、エラーの内容が両者で異なる。MinGW の場合、sys/ipc.h, sys/shm.h, sys/msg.h が見つからない、というエラー。これらのファイルは Linux の GCC にはついているようだが、MinGW にはない。 Cygwin の場合、compat/os/mswin.h のコンパイルで、定義の衝突やら未定義やらのエラーが大量に出る。STABLE じゃないから?
どちらも何か調整が必要なのかもしれない。もう少し調べてみよう...
起動スクリプトをつくる †
yum でインストールされたスクリプトを参考に、以下のようなスクリプトを書いてみた。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
| #!/bin/bash
# Source function library.
. /etc/rc.d/init.d/functions
# install dir
prefix=/usr/local/squid
# exec dir
exec_prefix=${prefix}
# program name
progname=squid
# lock file
lockfile=${prefix}/var/lock/subsys/${progname}
# program path
prog=${prefix}/sbin/squid
# config file path
conffile=${prefix}/etc/squid.conf
# log file
logfile=${prefix}/var/logs/squid.out
# PID file
pidfile=${prefix}/var/run/squid.pid
# shutdown timeout
stoptimeout=120
RETVAL=0
start() {
echo -n $"Starting $progname: "
$prog -f $conffile >> $logfile 2>&1
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $lockfile
[ $RETVAL -eq 0 ] && echo_success
[ $RETVAL -ne 0 ] && echo_failure
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $progname: "
$prog -k shutdown -f $conffile >> $logfile 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
rm -f $lockfile
timeout=0;
while : ; do
[ -f $pidfile ] || break
if [ $timeout -ge $stoptimeout ]; then
RETVAL=1
break
fi
sleep 1 && echo -n "."
timeout=$((timeout+1))
done
echo_success
echo
else
echo_failure
if [ ! -e $lockfile ]; then
RETVAL=0
fi
echo
fi
return $RETVAL
}
reload() {
$prog -k reconfigure -f $conffile
}
restart() {
stop
start
}
rhstatus() {
status $prog && $prog -k check -f $conffile
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload|force-reload)
reload
;;
restart)
restart
;;
status)
rhstatus
;;
*)
echo $"Usage: $0 {start|stop|status|reload|force-reload}"
exit 2
esac
exit $?
|
これを /usr/local/squid/var/bin に squid.debug などとして保存して実行してみる。
# /usr/local/squid/var/bin/squid.debug start
上手く動いたらバンザイ。
参考サイト †
Cache Manager を使えるようにする †
キャッシュマネージャというのは、squid がとっているログ情報を Web 上で閲覧できるようにするスクリプト。squid をインストールすると、漏れなく付属してくるが、デフォルトのままでは使えない。
あと、Web サーバの Apache の設定もする必要がある。多分。
- Apache がない場合は、まずインストール。
# rpm -qa | grep httpd
して、何も表示されない場合は未インストールなので入れる。
# yum install httpd
- スクリプトを置くディレクトリを作成。
# mkdir /var/www/cgi-bin/squid
※ /var/www/cgi-bin は Apache をインストールすれば作成されているはず。
- スクリプトが実行できるように、httpd.conf を編集。
# vi /etc/httpd/conf/httpd.conf
以下の設定を追加。
<Directory "/var/www/cgi-bin/squid">
order allow,deny
allow from all
</Directory>
※ アクセス元を限定する場合は allow from の後に指定する。
- cachemgr.cgi を スクリプトディレクトリにコピー。
- cachemgr.conf を設定。
- squid.conf で、キャッシュマネージャにアクセスできるように設定。
これでキャッシュマネージャは使えるようになってるはずなので、Apache と squid をリロードして確認。
# /etc/rc.d/init.d/httpd restart
# /usr/local/squid/sbin/squid -k reconfigure
これで、ブラウザから http://(プロキシサーバ)/cgi-bin/squid/cachemgr.cgi にアクセスしてみる。
「Cache Manager Interface」の画面が出たら、そのまま「continue」ボタンを押す。ユーザは設定してないので、Manager name と Password は空で OK。
統計情報の一覧が表示されれば、設定完了。
Permission denied が出る場合 †
環境によっては上記の設定だけだとパーミッションで蹴られる。
Cache Manager Error
(プロキシサーバ) (13) Permission denied
/usr/local/squid/var/cache や /logs のパーミッションを確認しても問題なさそうという場合は SELinux が疑われる。
/var/log/audit/audit.log を確認してみて、
type=AVC msg=audit(1274851190.959:27996): avc: denied { name_connect }
for pid=4083 comm="cachemgr.cgi" dest=3128
scontext=unconfined_u:system_r:httpd_sys_script_t:s0
tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1274851190.959:27996): arch=40000003 syscall=102
success=no exit=-110 a0=3 a1=bf83cb70 a2=8615078 a3=3 items=0 ppid=2537
pid=4083 auid=500 uid=48 gid=489 euid=48 suid=48 fsuid=48 egid=489 sgid=489
fsgid=489 tty=(none) ses=1 comm="cachemgr.cgi" exe="/var/www/cgi-bin/squid
/cachemgr.cgi" subj=unconfined_u:system_r:httpd_sys_script_t:s0 key=(null)
みたいなログが出てたら、SELinux がクロ。
GNOME なら、「システム」→「管理」→「SELinux Management」を開いて、左ペインから「システムドメイン」を選択し、右ペインで「httpd_sys_script」を選択して「許容」しておくと幸せになれるかも。
参考サイト †
カスタマイズしてみる †
作業しやすいように Eclipse CDT に取り込んでみるよ。
Eclipse CDT はこちら。
- squid-3.x.x.tar.gz を適当なディレクトリに展開。
- Eclipse を起動。
- 「ファイル」→「新規」→「C++ Project」を選択。以下を設定。
- プロジェクト名 : squid (何でも OK)
- Project Type : 「Makefile project」 → 「Empty project」
Makefile は configure でつくるので、Makefile project にすること!
ここで Executable にしてしまうと、CDT が勝手にオレオレ Makefile をつくってしまう。
- 画面左ペインのプロジェクト名を右クリックして「新規」→「フォルダ」で「src」というフォルダを作成。
- 「src」フォルダを右クリックして「インポート」を選択。
- 「一般」→「ファイルシステム」で上記で展開した /home/hoge/tmp/squid-3.x.x ディレクトリを指定。
→ ガッツリとソースがインポートされる。
- 画面左ペインのプロジェクト名を右クリックして「新規」→「フォルダ」で「build」というフォルダを作成。
※名前は何でも良い。
- 画面左ペインのプロジェクト名を右クリックして「新規」→「フォルダ」で「app」というフォルダを作成。
※名前は何でも良い。
- 「プロジェクト」→「プロパティ」を選択して以下を設定。
- 「C/C++ Build」を選択して「Build Settings」タブで以下を設定。
- 「Build Location」の「Build Directory」で、上記で作成した「build」フォルダを指定。
→ ${workspace_loc/squid/build}
- ここでちょっと Eclipse を離れてターミナル操作。
- Eclipse のワークスペースディレクトリに build ディレクトリが作られているはずなので、そこをカレントにする。
- build ディレクトリで configure を実行する。
$ ../src/configure --prefix=/home/hoge/workspace/squid/app
※ これ以外のオプションはお好みでつけてネ。
- Eclipse に戻って、プロジェクト名を右クリックして「更新」してみる。
- 「build」フォルダに Makefile ができているはず。
- 「build」フォルダを右クリックして「Make Target」→「Create」を選択。以下を設定。
- Target Name : 「all」(分かれば何でも OK)
- Make Target : 「all」(こっちは「all」とすること)
- 「build」フォルダを右クリックして「Make Target」→「Create」を選択。以下を設定。
- Target Name : 「install」(分かれば何でも OK)
- Make Target : 「install」(こっちは「install」とすること)
- 「プロジェクト」→「Make Target」→「Build」で、「all」を選択して「Build」実行。
- 「build」フォルダに出力ファイルがドバーッと出る。
- 「プロジェクト」→「Make Target」→「Build」で、「install」を選択して「Build」実行。
- 「app」フォルダに出力ファイルがドバーッと出る。
- 「app」フォルダ →「etc」フォルダにある squid.conf ファイルを適切に設定。
- ターミナルで以下を実行。
$ cd /home/hoge/workspace/squid/app/sbin
$ squid -z
これでキャッシュディレクトリが作成される。
- 「実行」→「デバッグの構成」を選択して以下を設定。
- 「C/C++ Application」を選択。
- 名前に「squid Debug」とでも設定。(何でも良い)
- 「Main」タブの「C/C++ Application」で「Search Project...」から「squid」(本体)を選択。
- 「Arguments」タブの「Program arguments」に以下を設定。
-Nd1
※ これは非サービスモード、デバッグログを出力するオプション。
※ オプションの意味が分かれば他にもいろいろ追加して OK。
- 「Debugger」タブの「Debugger」に「gdb/mi」を選択。
※ デフォルトは「gdb Debugger」なので、そのままでもいいかもしれない。
- ツールバーの「デバッグ」→「お気に入りの編成」で、上記で作成した構成「squid Debug」を追加する。
- ツールバーの「デバッグ」か F11 などでデバッグ実行してみる。
- 特に問題なければ squid が起動し、main.cc の先頭でブレークする。
後は好きなところにブレークはったり変数いじったりしながら squid を研究するなり料理するなりする。
ちなみに、プログラミングガイドはこれ。
英語ダケドネー。(~_~;
参考サイト †
その他小ネタ †
COSS? †
squid 3.x 系は、キャッシュディレクトリのタグ(cache_dir)を記述しないことで、Cyclic Object Storage System(COSS)という仕組みが動くようになるらしい 動作不安定版らしいです。現状、COSS を使うなら 2.6 以降の 2系が良さそう。
これは何かというと、squid は通常 cache_dir に設定されたディレクトリ配下にサブディレクトリを掘って、そこにキャッシュを格納する。そうではなく、キャッシュを 1つのファイルとして確保し、そのファイル内にある長さで区切られた構造を持たせて、そこから読み書きを行うというのが COSS 。キャッシュ探索が1つのファイル内でのシークとなるので、ディレクトリで階層化した従来の方式より、かなりの速度向上が見込めるらしい。
COSS 自体は squid 2.6 くらいから設定によって利用できるらしいよ。
参考
外部リンク †
MLEXP. Wiki