squid は プロキシキャッシュのサービス。&br; オープンソース(ライセンスは GPL)。クラスプラットフォーム。ヤリイカだそうです。 - [[squid(公式/英語):http://www.squid-cache.org/]] -- [[Squid Versions(Download):http://www.squid-cache.org/Versions/]] - [[Squid cache (Wikipedia):http://ja.wikipedia.org/wiki/Squid_cache]] ソースは 2.x まで C、3.0 から C++ になっているので注意。&br; 3.x 系の最新(安定?)バージョンは 2010年 05月 現在 3.1.3。 #contents ** とりあえず使ってみる [#pf8edc27] Fedora 12 などの最近の Linux には squid をインストール時に組み込めたりする。&br; インストールで導入してない場合は、パッケージをインストールして使ってみる。 + スーパーユーザになる。 $ 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 とか)を開いてみる。開ければ、とりあえず動いてるということ。 ** コンパイルして実行してみる [#p052867c] 今度は yum ではなく、squid のソースから導入してみる。 + まず、ダウンロード。 -- [[squid downlad:http://www.squid-cache.org/Versions/]] -- どこでもいいけど、ここは /home/(ユーザ名)/download に squid-3.1.x.tar.gz として保存したとする。 + スーパーユーザになる。&br; $ 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 オプションで指定する。&br; # ./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 -- 私の環境には以下のようなユーザが既にいた。 squid:x:23:23::/var/spool/squid:/sbin/nologin -- いない場合は作成。 # useradd -g squid -s /sbin/nologin squid ※明示的なログインを不可にするので、ホームディレクトリはいらんでしょう。多分。 + キャッシュディレクトリを作成。 # mkdir /usr/local/squid/var/cache //+ PID 用のディレクトリを作成。 // # 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 //※これは多分インストールで作成されてると思う。 + キャッシュとログのディレクトリのオーナーを 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 というのは、非デーモン、デバッグログを出力するモードで起動する、というオプションです。&br; ※実行後プロンプトに復帰しないので、停止させる場合は Ctrl + C で。 特にエラーが出ていないようなら、Windows などの PC で接続してみる。&br; Windows 側のインターネットの設定方法は、上述と同じで。 ** squid.conf の設定 [#fa7398a7] いっぱいあるけど、とりあえず動かす為にやっておいた方が良い設定だけ。 - アクセスコントロールの設定&br; acl example_net src 192.168.0.0/255.255.255.0 ※"acl CONNECT method CONNECT" の次の行くらい。&br; ※"example_net" は何でも良い。下の http_access allow の記述に合わせる。&br; ※この IP はローカル使用を想定してます。 - アクセス許可&br; http_access allow example_net ※"http_access deny all" の前の行。&br; ※"example_net" は何でも良い。上の acl の記述に合わせる。 - ローカルIPを見えなくする設定&br; forwarded_for off ※多分どこでも良い - プロキシの表示名設定&br; visible_hostname squid.example.com ※多分どこでも良い。&br; ※ローカルで使用する名前なら何でも良い。 - プロキシを通過したことを隠す場合は以下を設定&br; request_header_access X-Forwarded-For deny all request_header_access Via deny all request_header_access Cache-Control deny all ※多分どこでも良い。 - cache_dir の設定を変更&br; #cache_dir ufs /var/spool/squid 100 16 256 cache_dir ufs /usr/local/squid/var/cache 1024 16 256 ※コメントになってるので、有効にしてパスとサイズを書き換える。&br; ※ここは サイズ 1G としてますが、お好みで。 - coredump_dir の設定変更&br; #coredump_dir /var/spool/squid coredump_dir /usr/local/squid/var/cache ※cache_dirと同じところに。 - squidを実行するグループとユーザを設定&br; cache_effective_user squid cache_effective_group squid ** Windows でコンパイルしてみる [#w0346b02] Windows で squid をコンパイルする場合は、主に MinGW(+ msys)を使う方法と、Cygwin を使う方法がある。それぞれの環境の導入方法などは [[こちら>UNIX on Windows]] を参考に。Visual Studio でもコンパイラを GCC にすればいけるかもしれないけど、私は試してない。 基本的なやり方は Linux でのやり方(上述)と同じだが、[[公式サイトの解説:http://wiki.squid-cache.org/SquidFaq/CompilingSquid]] によれば、それぞれ 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 での起動パス [#j1659e52] 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 はコンパイルできない? [#qb4bd8be] [[squid-2.7.STABLE9:http://www.squid-cache.org/Versions/v2/2.7/]] や [[squid-3.0.STABLE25:http://www.squid-cache.org/Versions/v3/3.0/]] であれば、特に問題なくコンパイルできた。configure も make もエラーなし。ただ、現時点(2010/05/19)の最新バージョンである [[squid-3.1.3:http://www.squid-cache.org/Versions/v3/3.1/]] は上手くコンパイルできない。これは MinGW でも Cygwin でも同様。ただ、エラーの内容が両者で異なる。MinGW の場合、sys/ipc.h, sys/shm.h, sys/msg.h が見つからない、というエラー。これらのファイルは Linux の GCC にはついているようだが、MinGW にはない。 Cygwin の場合、compat/os/mswin.h のコンパイルで、定義の衝突やら未定義やらのエラーが大量に出る。STABLE じゃないから? どちらも何か調整が必要なのかもしれない。もう少し調べてみよう... ** 起動スクリプトをつくる [#d0567eff] yum でインストールされたスクリプトを参考に、以下のようなスクリプトを書いてみた。 #code(sh){{ #!/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 上手く動いたらバンザイ。 *** 参考サイト [#f6813d62] - [[シェルスクリプト(Bash):http://cyberam.dip.jp/linux_command/shellscript/shellscript_main.html]] ** Cache Manager を使えるようにする [#j4b4ce7a] キャッシュマネージャというのは、squid がとっているログ情報を Web 上で閲覧できるようにするスクリプト。squid をインストールすると、漏れなく付属してくるが、デフォルトのままでは使えない。 あと、Web サーバの Apache の設定もする必要がある。多分。 + Apache がない場合は、まずインストール。 # rpm -qa | grep httpd して、何も表示されない場合は未インストールなので入れる。&br; # yum install httpd + スクリプトを置くディレクトリを作成。&br; # mkdir /var/www/cgi-bin/squid ※ /var/www/cgi-bin は Apache をインストールすれば作成されているはず。 + スクリプトが実行できるように、httpd.conf を編集。 # vi /etc/httpd/conf/httpd.conf &br; 以下の設定を追加。 <Directory "/var/www/cgi-bin/squid"> order allow,deny allow from all </Directory> ※ アクセス元を限定する場合は allow from の後に指定する。 + cachemgr.cgi を スクリプトディレクトリにコピー。 -- cachemgr.cgi は /usr/local/squid/libexec の下にある。&br; # cp /usr/local/squid/libexec/cachemgr.cgi /var/www/cgi-bin/squid + cachemgr.conf を設定。 -- /usr/local/squid/etc の下の cachemgr.conf には デフォルトで localhost だけが設定されているので、これにポート番号をつける。 # vi /usr/local/squid/etc/cachemgr.conf &br; localhost:3128 ※ ポート番号は squid が使っているポート番号。 + squid.conf で、キャッシュマネージャにアクセスできるように設定。 -- ここは LAN 内の接続からならアクセスできるようにする。&br; acl example_nw src 192.168.0.0/24 という定義を追加して、http_access deny manager という行の直前に&br; http_access allow manager example_nw を追加する。&br; ※ example_nw という名前は何でも OK。 これでキャッシュマネージャは使えるようになってるはずなので、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 が出る場合 [#e5307bd2] 環境によっては上記の設定だけだとパーミッションで蹴られる。 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」を選択して「許容」しておくと幸せになれるかも。 *** 参考サイト [#kb2ef0c1] - [[Squidの設定 【Squid Web プロキシ & キャッシュ】:http://squid.robata.org]] -- [[キャッシュマネージャ:http://squid.robata.org/faq_9.html]] ** カスタマイズしてみる [#gfc242ed] 作業しやすいように Eclipse CDT に取り込んでみるよ。 Eclipse CDT はこちら。 - [[Eclipse C/C++ Development Tooling - CDT:http://www.eclipse.org/cdt/]] + squid-3.x.x.tar.gz を適当なディレクトリに展開。 -- ここは /home/hoge/tmp とする。&br; $ 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 + Eclipse を起動。 + 「ファイル」→「新規」→「C++ Project」を選択。以下を設定。 -- プロジェクト名 : squid (何でも OK) -- Project Type : 「''Makefile project''」 → 「Empty project」&br; Makefile は configure でつくるので、Makefile project にすること!&br; ここで Executable にしてしまうと、CDT が勝手にオレオレ Makefile をつくってしまう。 + 画面左ペインのプロジェクト名を右クリックして「新規」→「フォルダ」で「src」というフォルダを作成。 + 「src」フォルダを右クリックして「インポート」を選択。 -- 「一般」→「ファイルシステム」で上記で展開した /home/hoge/tmp/squid-3.x.x ディレクトリを指定。&br; → ガッツリとソースがインポートされる。 + 画面左ペインのプロジェクト名を右クリックして「新規」→「フォルダ」で「build」というフォルダを作成。&br;※名前は何でも良い。 + 画面左ペインのプロジェクト名を右クリックして「新規」→「フォルダ」で「app」というフォルダを作成。&br;※名前は何でも良い。 + 「プロジェクト」→「プロパティ」を選択して以下を設定。 -- 「C/C++ Build」を選択して「Build Settings」タブで以下を設定。 --- 「Build Location」の「Build Directory」で、上記で作成した「build」フォルダを指定。&br; → ${workspace_loc/squid/build} + ここでちょっと Eclipse を離れてターミナル操作。 + Eclipse のワークスペースディレクトリに build ディレクトリが作られているはずなので、そこをカレントにする。 -- ワークスペースを /home/hoge/workspace とすると、&br; $ cd /home/hoge/workspace/squid/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」に以下を設定。&br; -Nd1 ※ これは非サービスモード、デバッグログを出力するオプション。&br; ※ オプションの意味が分かれば他にもいろいろ追加して OK。 --- 「Debugger」タブの「Debugger」に「gdb/mi」を選択。&br; ※ デフォルトは「gdb Debugger」なので、そのままでもいいかもしれない。 + ツールバーの「デバッグ」→「お気に入りの編成」で、上記で作成した構成「squid Debug」を追加する。 + ツールバーの「デバッグ」か F11 などでデバッグ実行してみる。 -- 特に問題なければ squid が起動し、main.cc の先頭でブレークする。 後は好きなところにブレークはったり変数いじったりしながら squid を研究するなり料理するなりする。 ちなみに、プログラミングガイドはこれ。 - [[Squid 3.x Developer Programming Guide :http://squid.treenet.co.nz/Doc/Code/index.dyn]] 英語ダケドネー。(~_~; *** 参考サイト [#w2cbd157] - [[Eclipse Platformを使用したC/C++ 開発:http://www.ibm.com/developerworks/jp/opensource/library/os-ecc/]] - [[CDT デバッガーとのインターフェース: 第 1 回 C/C++ デバッガーのインターフェースを理解する:http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-cdt-debug1/index.html]] - [[CDT デバッガーとのインターフェース: 第 2 回 Eclipse の CDT と MI を使って gdb にアクセスする:http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-cdt-debug2/]] ** その他小ネタ [#r17b344b] *** COSS? [#q37b10ad] squid 3.x 系は、%キャッシュディレクトリのタグ(cache_dir)を記述しないことで、Cyclic Object Storage System(COSS)という仕組みが動くようになるらしい% 動作不安定版らしいです。現状、COSS を使うなら 2.6 以降の 2系が良さそう。 squid 3.x 系は、%%キャッシュディレクトリのタグ(cache_dir)を記述しないことで、Cyclic Object Storage System(COSS)という仕組みが動くようになるらしい%% 動作不安定版らしいです。現状、COSS を使うなら 2.6 以降の 2系が良さそう。 これは何かというと、squid は通常 cache_dir に設定されたディレクトリ配下にサブディレクトリを掘って、そこにキャッシュを格納する。そうではなく、キャッシュを 1つのファイルとして確保し、そのファイル内にある長さで区切られた構造を持たせて、そこから読み書きを行うというのが COSS 。キャッシュ探索が1つのファイル内でのシークとなるので、ディレクトリで階層化した従来の方式より、かなりの速度向上が見込めるらしい。 COSS 自体は squid 2.6 くらいから設定によって利用できるらしいよ。 '''参考''' - [[cossとは - はてな:http://d.hatena.ne.jp/keyword/coss]] - [[Squid/キャッシュストレージとして COSS を使う:http://www.maruko2.com/mw/Squid/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%97%E3%81%A6_COSS_%E3%82%92%E4%BD%BF%E3%81%86]] ** 外部リンク [#id28b92e] - [[プロキシサーバー構築(Squid):http://fedorasrv.com/squid.shtml]] - [[Fedora 12 でプロキシサーバー構築(squid):http://ytooyama.spaces.live.com/blog/cns!916D80FD288EB35A!902.entry]] - [[Proxyキャッシュサーバ設定術―Squidの設定:http://arika.org/doc/sd.200112]] - [[squidのインストールと設定:http://www.rose.sannet.ne.jp/nterasim/linux/squidinst.html]] - [[Squid プロキシサーバの設定:http://unixlife.jp/unixlife/linux/s-squid.jsp]] - [[システム/サーバ構築:http://www.stackasterisk.jp/tech/systemConstruction/index.jsp]] -- [[プロキシサーバSquid:http://www.stackasterisk.jp/tech/systemConstruction/squidSat01_01.jsp]] -- [[SquidGurardによるアクセス制御:http://www.stackasterisk.jp/tech/systemConstruction/squidGuard01_01.jsp]] -- [[squidの統計情報:http://www.stackasterisk.jp/tech/systemManagement/squidStat01_01.jsp]] ----- [[MLEXP. Wiki]]