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 を開いて、次の項目を変更、追加。&br; -- "acl CONNECT method CONNECT" の次の行くらいに以下を追記。&br; acl example_net src 192.168.0.0/255.255.255.0 ※"example_net" は何でも良い。下の http_access allow の記述に合わせる。&br; ※この IP はローカル使用を想定してます。 -- "http_access deny all" の前の行に以下を追記。&br; http_access allow example_net ※"example_net" は何でも良い。上の acl の記述に合わせる。 -- "http_access deny all" の次の行くらいに以下を追記。&br; forwarded_for off -- 次の行を追記。(多分どこでも良い)&br; visible_hostname squid.example.com ※ローカルで使用する名前なら何でも良い。 -- 次の行を追記。(多分どこでも良い)&br; request_header_access X-Forwarded-For deny all request_header_access Via deny all request_header_access Cache-Control deny all + 「システム」→「管理」→「ファイアーウォール」を開く。 + 画面左ペインから「その他のポート」を選択。 + 画面右ペインで「追加」を押して 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 を設定する。 -- 上記 yum で設定したものがあれば /usr/local/squid/etc にコピー。 # 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 の設定を変更。 #cache_dir ufs /var/spool/squid 100 16 256 cache_dir ufs /usr/local/squid/var/cache 1024 16 256 ※コメントになってるので、有効にしてパスとサイズを書き換える。&br; ※ここは サイズ 1G としてますが、お好みで。 --- coredump_dir の設定変更。 #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 -NCd1 ※-NCd1 というのは、非デーモン、デバッグモードで起動する、というオプションです。&br; ※実行後プロンプトに復帰しないので、停止させる場合は Ctrl + C で。 特にエラーが出ていないようなら、Windows などの PC で接続してみる。&br; Windows 側のインターネットの設定方法は、上述と同じで。 ** 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.3 はコンパイルできない? [#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 多分、キャッシュに書き込み権限がないと怒られて、うまく起動できない。 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 というユーザで実行されるようになる。 *** 参考サイト [#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/]] ** 外部リンク [#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]]