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

# program name
progname=squid
# lock file
lockfile=/usr/local/squid/var/lock/subsys/$progname
# program path
prog=/usr/local/squid/sbin/squid
# config file path
conffile=/usr/local/squid/etc/squid.conf
# log file
logfile=/usr/local/squid/var/logs/squid.out
# PID file
pidfile=/usr/local/squid/var/run/squid.pid
# shutdown timeout
stoptimeout=20

RETVAL=0

start() {
	echo -n $"Starting $prog: "
	$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 $prog: "
	$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]

ちょっと高度。

- [[Squid 3.x  Developer Programming Guide :http://squid.treenet.co.nz/Doc/Code/index.dyn]]

** 外部リンク [#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]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS