squid は プロキシキャッシュのサービス。
オープンソース(ライセンスは GPL)。クラスプラットフォーム。ヤリイカだそうです。
ソースは 2.x まで C、3.0 から C++ になっているので注意。
3.x 系の最新(安定?)バージョンは 2010年 05月 現在 3.1.3。
Fedora 12 などの最近の Linux には squid をインストール時に組み込めたりする。
インストールで導入してない場合は、パッケージをインストールして使ってみる。
$ su
# yum install squid
acl example_net src 192.168.0.0/255.255.255.0※"example_net" は何でも良い。下の http_access allow の記述に合わせる。
http_access allow example_net※"example_net" は何でも良い。上の acl の記述に合わせる。
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
/etc/rc.d/init.d/squid start
# chkconfig squid on
これで、このサーバを介してインターネットに接続してみる。
IE8 なら、「ツール」→「インターネットオプション」→「接続」タブ→「LANの設定」で「プロキシサーバ」のチェックボックスを ON にして、アドレスに上記で設定した Linux サーバの IPを、ポートに 3128 を設定。
Firefox の場合も 「ツール」→「オプション」→「詳細」タブ→「ネットワーク」タブの接続グループに同様の設定がある。
上記設定をして、どこかインターネットのページ(www.yahoo.co.jp とか)を開いてみる。開ければ、とりあえず動いてるということ。
今度は yum ではなく、squid のソースから導入してみる。
$ su
# cd /home/(ユーザ名)/download
# tar zxvf squid-3.1.x.tar.gz※squid-3.1.x というディレクトリができる。
# cd squid-3.1.x
# ./configureインストール先はデフォルトで /usr/local/squid になるので、これを変えたい場合は prefix オプションで指定する。
# ./configure --prefix=/hoge/squidとか。
# make
# make install
# ls /usr/local/squid
# grep squid /etc/group
squid:x:23:※yum で squid を入れると勝手に作成されるのかな。。ちとよくわからん。
# groupadd squid
# grep squid /etc/passwd
squid:x:23:23::/var/spool/squid:/sbin/nologin
# useradd -g squid -s /sbin/nologin squid※明示的なログインを不可にするので、ホームディレクトリはいらんでしょう。多分。
# mkdir /usr/local/squid/var/cache
# mkdir /usr/local/squid/var/run # mkdir /usr/local/squid/var/run/subsys※これは /var/run とかにした方がいいかもしれないけど。
# mkdir /usr/local/squid/var/lock
# mkdir /usr/local/squid/var/logs※これは多分インストールで作成されてると思う。
# 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
# mv /usr/local/squid/etc/squid.conf /usr/local/squid/etc/squid.conf.org ← 一応バックアップ # cp /etc/squid/squid.conf /usr/local/squid/etc/squid.conf
# vi /usr/local/squid/etc/squid.conf
#cache_dir ufs /var/spool/squid 100 16 256 cache_dir ufs /usr/local/squid/var/cache 1024 16 256※コメントになってるので、有効にしてパスとサイズを書き換える。
#coredump_dir /var/spool/squid coredump_dir /usr/local/squid/var/cache
# sudo squid /usr/local/squid/sbin/squid -z※ユーザ squid が所有者となるように sudo で実行。
ここまでで、一応動くようになっているはず。
squid ユーザで、とりあえずログ出力させながら起動してみる。
# sudo squid /usr/local/squid/sbin/squid -Nd1
※-Nd1 というのは、非デーモン、デバッグログを出力するモードで起動する、というオプションです。
※実行後プロンプトに復帰しないので、停止させる場合は Ctrl + C で。
特にエラーが出ていないようなら、Windows などの PC で接続してみる。
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 で 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 ならそのまま動作するようだ。
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 |
|
これを /usr/local/squid/var/bin に squid.debug などとして保存して実行してみる。
# /usr/local/squid/var/bin/squid.debug start
多分、キャッシュに書き込み権限がないと怒られて、うまく起動できない。
root で実行してるのに権限がないとは何事か!と悩んだのだけど、最近の Linux には SELinux という権限を管理するモジュールが組み込まれていて、これが有効だと root といえども、他人が所有権を持っているファイルを自由にできないらしい。
一番簡単なのは、SELinux 自体を無効にしてしまうことだが、乱暴過ぎるので、squid を実行するユーザを squid.conf に設定する。
ということで、squid.conf を開く。
# vi /usr/local/squid/etc/squid.conf
適当なところに以下の2行を追加。(多分どこでも良い)
cache_effective_user squid cache_effective_group squid
これで、squid というユーザで実行されるようになる。
キャッシュマネージャというのは、squid がとっているログ情報を Web 上で閲覧できるようにするスクリプト。squid をインストールすると、漏れなく付属してくるが、デフォルトのままでは使えない。
あと、Web サーバの Apache の設定もする必要がある。多分。
# rpm -qa | grep httpdして、何も表示されない場合は未インストールなので入れる。
# yum install httpd
# mkdir /var/www/cgi-bin/squid※ /var/www/cgi-bin は Apache をインストールすれば作成されているはず。
# vi /etc/httpd/conf/httpd.conf
<Directory "/var/www/cgi-bin/squid"> order allow,deny allow from all </Directory>※ アクセス元を限定する場合は allow from の後に指定する。
# cp /usr/local/squid/libexec/cachemgr.cgi /var/www/cgi-bin/squid
# vi /usr/local/squid/etc/cachemgr.conf
localhost:3128※ ポート番号は squid が使っているポート番号。
acl example_nw src 192.168.0.0/24という定義を追加して、http_access deny manager という行の直前に
http_access allow manager example_nwを追加する。
これでキャッシュマネージャは使えるようになってるはずなので、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。
統計情報の一覧が表示されれば、設定完了。
環境によっては上記の設定だけだとパーミッションで蹴られる。
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 はこちら。
$ mkdir /home/hoge/tmp $ cp (ダウンロードした場所)/squid-3.x.x.tar.gz /home/hoge/tmp $ cd /home/hoge/tmp $ tar zxvf squid-3.x.x.tar.gz $ ls squid-3.x.x squid-3.x.x.tar.gz
$ cd /home/hoge/workspace/squid/build
$ ../src/configure --prefix=/home/hoge/workspace/squid/app※ これ以外のオプションはお好みでつけてネ。
$ cd /home/hoge/workspace/squid/app/sbin $ squid -zこれでキャッシュディレクトリが作成される。
-Nd1※ これは非サービスモード、デバッグログを出力するオプション。
後は好きなところにブレークはったり変数いじったりしながら squid を研究するなり料理するなりする。
ちなみに、プログラミングガイドはこれ。
英語ダケドネー。(~_~;
squid 3.x 系は、キャッシュディレクトリのタグ(cache_dir)を記述しないことで、Cyclic Object Storage System(COSS)という仕組みが動くようになるらしい。
これは何かというと、squid は通常 cache_dir に設定されたディレクトリ配下にサブディレクトリを掘って、そこにキャッシュを格納する。そうではなく、キャッシュを 1つのファイルとして確保し、そのファイル内にある長さで区切られた構造を持たせて、そこから読み書きを行うというのが COSS 。キャッシュ探索が1つのファイル内でのシークとなるので、ディレクトリで階層化した従来の方式より、かなりの速度向上が見込めるらしい。
COSS 自体は squid 2.6 くらいから設定によって利用できるらしいよ。
参考