記事の最後へ▼ 
< 質 問 >
CygwinでSquid

はじめまして。
最近こちらのサイトを知り、
Win2000Pro工房の記事を読ませて頂き
インターネットの各種サーバーを
インストール設定して、
いろいろ楽しんでいました。

そのなかのやりたいことは何とか
稼動させることができたのですが、
茶々書き込みの1つにとても興味深いもの
を見つけ、現在、試行錯誤中なのが、
こちらのCygwinです。

Unix自体ほとんど触ったことないのですが
CygwinでSquidのコンパイルに挑戦
しています。

そのことで教えて頂きたいことがあり、
こちらに書き込みさせていただきました。

まず、どこまで出来たかをいいますと
・CygwinのInstall
(SetupでAllチェックしDownload、
 そしてAllInstall)
・www.serassio.itのリンクより
 以下をDownload。
 Squid 2.5 DEVELのPRE4とSnapshot
 cygwin.patch、cygwin-svc.patch
・それらをC:\cygwin\tmp\squidに解凍、
 CD /tmp/squid
 patch -p1 < cygwin.patch
 patch -p1 < cygwin-svc.patch
 ./configure --enable-win32-service configure
 make

とここまで正しいかどうか判らないのですがやってみました。
cygwin.patchでFileがないというMessage
がでたので、Souceforgeより個別に
落としてきました。
.cvsignore と cache_diff.c です。
PRE4とSnapshotで試してみました。
しかし、win32.c をコンパイル中に
Errorがでて、そこで終わってしまいます。

最終的に、www.serassio.itにあるような
CygWin Squid 2.5 DEVEL for Windows NT - Binaries
と同じようなとこまで出来ないかと
思っています。

できないなら、すでにUpされているBinary
を使えばいいんですが
(すでにSetup済みで使っているのですが)
最新のCygwinでコンパイルできたら
いいなと思ったものでして。

どうかみなさんの知識をお貸しください。
よろしくおねがいします。

Makotto

Windows2000 sp2
Celeron 950
Memory 384MB

Makotto (03.16/02)


【 Makotto (03.16/02) 】

すいません訂正。

./configure --enable-win32-service configure


./configure --enable-win32-service


【 ? (03.16/02) 】

とりあえず。詳しくは後で。

------------------------------------------------------
>しかし、win32.c をコンパイル中に
>Errorがでて、そこで終わってしまいます。

ChangeServiceConfig2A/Wなどのwin2000以降のAPIが
"/usr/include/w32api/winsvc.h"に追加されていない
ので、とりあえず(?)以下のように該当部2箇所を潰す。
(SL掲示板の仕様で、TAB等が削除されるかも知れない。
 その場合、patch使用は諦め、手で修正)

diff -u win32.c.org win32.c
--- win32.c.org    Fri Mar 15 13:22:32 2002
+++ win32.c    Fri Mar 15 13:29:53 2002
@@ -70,9 +70,11 @@
#define CHANGESERVICECONFIG2 "ChangeServiceConfig2A"
#endif
#define DATABASEPATH "DataBasePath"
+/*
static SC_ACTION Squid_SCAction[] = { { SC_ACTION_RESTART, 60000 } };
static SERVICE_DESCRIPTION Squid_ServiceDescription = { SOFTWARENAME " " VERSION " WWW Proxy Server" };
static SERVICE_FAILURE_ACTIONS Squid_ServiceFailureActions = { 0, NULL, NULL, 1, Squid_SCAction };
+*/
static char REGKEY[256]="SOFTWARE\\"VENDOR"\\"SOFTWARENAME"\\"WIN32_VERSION"\\";
static char TCP_REGKEY[256] = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters";
static char *keys[] = {
@@ -600,6 +602,7 @@
        NULL,                    /* LocalSystem account    */
        NULL);                    /* no password            */
    if (schService) {
+/*
        if ((WIN32_OS_version == _WIN_OS_WIN2K) || (WIN32_OS_version == _WIN_OS_WINXP))
        {
        HMODULE ADVAPI32Handle;
@@ -612,6 +615,7 @@
        dwInfoLevel = SERVICE_CONFIG_FAILURE_ACTIONS;
        ChangeServiceConfig2(schService, dwInfoLevel, &Squid_ServiceFailureActions);
        }
+*/
        CloseServiceHandle(schService);
        /* Now store the config file location in the registry */
        if (!ConfigFile)

------------------------------------------------------
"--enable-win32-service" を付けてもサービス対応にならない場合、
"squid/include/autoconf.h"に、

#define USE_WIN32_SERVICE

を追加する。サービス対応になっている場合、

>squid -v
Squid Cache: Version 2.6-DEVEL-20020224
configure options:  --disable-wccp --enable-underscores
--disable-ident-lookups --enable-win32-service --prefix=d:/squid
Compiled as Windows System Service.

のように"Compiled as Windows System Service"と表示される。
ちなみに、当方では以下のオプションでコンパイルしている。

CFLAGS="-s -O2 -march=i686"  ./configure  --disable-wccp --enable-underscores --disable-ident-lookups --enable-win32-service --prefix=d:/squid

------------------------------------------------------
cygwin.dll 1.3.10では、当方では安定稼動できていない。
1.3.9-1へダウンしたほうがよいかも知れない。また、
cygwin.patch内の最終日付が Feb 26 2002 ゆえ、ソース
には squid-2.6-DEVEL-20020224.tar.gz を意図的に使用し
ている。

あと、ntsecを使用すると、ログ等がsquid.conf内の
cache_effective_user 権限でしか見えなくなったりする。注意。


【 Makotto (03.17/02) 】

返信ありがとうございます。
しかも、興味を持った書き込みをされた
?さんからとは、ありがとうございます。

教えていただいたやり方でコンパイルは通るようになりました。
2.5snap と 2.6 で試しました。
2.6 は、cygwin.patch をあてると defines.h で
failしてたので、あたらしいのを落として試しました。

だた、サービス起動できる状態にどうしても出来ませんでした。
私のやり方が悪いんだと思います。
#define USE_WIN32_SERVICE を挿入する位置が悪いんじゃないかなと
思っていますが、知識不足でよくわかりませんでした。
よければ、ご教授お願いいたします。m(__)m

それから
>ChangeServiceConfig2A/Wなどのwin2000以降のAPIが
>"/usr/include/w32api/winsvc.h"に追加されていない
が気になって、調べていたら
ttp://sources.redhat.com/cgi-bin/htsearch?method=and&format=builtin-long&sort=time&config=htdig&restrict=%2Fml%2Fcygwin-patches%2F&exclude=&words=winsvc.h
こういうページを見つけました。
winsvc.h のパッチです。古いものから順に当てたのですが
当てたあと、win32.c に変更を加えなくても
コンパイルは通るようになりました。
しかしやっぱり、私のやり方では、Service 起動できる状態まで
持っていくことが出来ませんでした。

2.6は、開発者用なのかなと思い敬遠していたのですが
私も、?さんと同じように2.6でがんばってみようと思います。
また、Configure の option も教えていただきありがとうございます。
まだそこまで調べていなかったので、目標達成後、自分で調べるまで
同じように使わせていただきます。

コンパイルが出来て、初めてわかったのですが、
make が終わればもう Binary ができるんですね。
Cygwin を起動して、その中でしか動かないのだと思っていました。

これでもう、あとは Service 起動さえ出来れば
目標達成です。またがんばってみます。

今日は、疲れました。5時間ほどぶっ通しでやってたのでw


【 ? (03.17/02) 】

>#define USE_WIN32_SERVICE を挿入する位置
>が悪いんじゃないかなと思っていますが、

configureにより書き換えられるんで、configure後
に追加する。追加位置にこだわるなら./acconfig.h
内での位置に準じて挿入する。


【 ? (03.17/02) 】

>option も教えていただき

-march= や --prefix= は好みでイジって下さい。

>make が終わればもう Binary ができるんで
>すね。

make install で、--prefix指示位置へ一式
格納されます。squid.conf内フォルダ系初期
値も--prefixに準じます。

あと、patchはちゃんと当たっていますか。
>それらをC:\cygwin\tmp\squidに解凍、
>CD /tmp/squid

cd /tmp では?(文面だけでは詳細不明だが)
cygwin.patch内を見て、しかるべきDIR位置
にてpatchを実行してください。私は、

tar zxvf squid-xxx.tar.gz
mv squid-xxx squid
patch -p0 < cygwin.patch >aaa
patch -p0 < cygwin-svc.patch >bbb
cd squid
./_cnfig.sh

みたいな感じでやってます。

# コンパイル出来たら、cygwin設定編、
# conf設定編、log回転編、?


【 Makotto (03.17/02) 】

私のような若輩者に
こんなに親切に説明していただき
本当にありがとうございます。m(__)m

>cygwin.patch内を見て、しかるべきDIR位置
動作さえすれば、どのDirでやっても
問題ないものだと思っていました。
だから、どこでもいいから、同じフォルダ内でやれば動くだろうと思いまして。

?さんと同じようにやったところ、>aaa で出力された Log
をみるかぎりパッチは一応正常にあたっていたようです。

>configureにより書き換えられるんで、configure後
ここが間違っていました!
これをすることによって、ちゃんと
Compiled as Windows System Service.
が表示されるようになりました。
感動です。

最終的に、行った方法は
1.winsvc.h パッチ当て済みを使用。
2.cygwin,patch で fail や足りないといわれるファイルの追加。
3.configure 後 acconfig.h に #define USE_WIN32_SERVICE を
 end の前に追加 。

Cygwin1.3.10 環境下で行いました。
Configure は、教えていただいたものに
--enable-delay-pools を追加し、
--prefix=c:/usr/squid に変更しました。(X-mail と共通にするため)

># コンパイル出来たら、cygwin設定編、
># conf設定編、log回転編、?
こういったことをした方がいいという設定が
あるようでしたら、ぜひともお願いします。m(__)m

私の設定は、
cygwin 設定では、c:\cygwin\bin に Path を通しただけです。
普通のUnixっぽく、アカウント作ったり、マウントしたり
また後日やってみようと思います。

conf 設定は、
http_port 8080

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl mygip src 210.xxx.yyy.zzz/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443 563    # https, snews
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # http-mgmt
acl Safe_ports port 488        # gss-http
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling http
acl CONNECT method CONNECT

http_access allow mygip
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

dns_testnames
なしにしてます。

forwarded_for off

header_access は、
不都合が出ない程度に、Deny 設定にしています。

header_replace User-Agent Mozilla/4.0 (unknown)

visible_hostname unknown

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi \?
no_cache deny QUERY

log_icp_queries off
buffered_logs on

conf の設定で気になっているのは、
acl localhost src 127.0.0.1/255.255.255.255
を Allow にしているのですが、
自分のグローバルを通るようにしないと
接続できないということです。この状態だけは、
落としてきた Binary でも同じでした。
現在はまだ、自宅サーバーを作ることの出来る環境になく
PC も1台しか所有していません。
回線は CATV で1枚の NIC で直接接続しています。
IP はグローバル。

log回転というのは、閲覧に関係することなのでしょうか。
一息ついた後、調べてみたいと思います。


【 Makotto (03.17/02) 】

あ、ちなみに
現在稼動中で、今のところ
問題なく動作してるように見えますw


【 B (03.17/02) 】

> ログ回転の件
ログローテートとか聞いたことありませんか?
unix系ならcronで(以下略)


【 M (03.17/02) 】

はい、ぜんぜん知りませんでした…
Log見るときいつもメモ帳で見てたのでw

あれから検索してみてたんですが、
想像してはいたんですが、
ログ管理のソフトなんですね。
閲覧だけでなく、自動でいろいろしてくれるんですね。


【 ? (03.17/02) 】

> http_access allow mygip
> <中略>
> http_access deny CONNECT !SSL_ports
> http_access deny all

上から評価するので、allow mygip 以下のdeny
文が無駄になっています。通常ユーザをallow
する場合は、deny allの直前でallowします。

>ログ管理のソフトなんですね。

 xx\squid  -k rotate  -n SquidNT
と実行すると、
 *.log.0→*.log.1
 *.log →*.log.0
のように自動リネーム(ログローテート)されます。
サービスを止めずに実行します。

で、ついでにcalamaris( ttp://calamaris.cord.de/ )
でログ統計を取ります。例:
 perl xx\calamaris.pl -a -w -f squid  < yy\access.log  > zz\log_0.htm

一連の処理はバッチ化し、タスクスケジューラで定期的
に起動すれば良いでしょう。

リアルタイムな稼動状態は、libexec/cachemgr.exe
を使う。cgiが動くフォルダにコピーしcgiとして実行。
この際、".htaccess"や"http_access allow manager"
は注意深く設定すること。
(Apacheならcachemgr.cgiにリネームしても起動可能)
Menuの内、
 Internal DNS Statistics
 General Runtime Information
 Process Filedescriptor Allocation
 Store Directory Stats
 Cache Client List
あたりは有用。

# 深くなったので、新たなネタは新スレへ。


【 ? (03.18/02) 】

(他の人向けに)ちょっと追加:

コンパイルにはcygwinが必要ですが、稼動機
(サーバ)に入れるのは抵抗が。。。という人
は多いでしょうね。
実は、稼動にはcygwin1.dll,cygregex.dll,
(psapi.dll @NT) があればいいのですね。
(c:\winnt\system32 辺りに入れておく)
で、環境変数を、
 CYGWIN="tty binmode nontea nontsec"
とでもしておけば、group,passwd辺りは
無くても何とかなるような。。(私はダミー
で /etc に一応用意しているが)

これでcygwinインスト無しのNTで1ヶ月程度
無事に動いています。(と言っても200クライ
アント程度。それ以上の負荷に対しては不明)


【 Makotto (03.18/02) 】

本当にいろいろありがとうございました。m(__)m
おかげで、Squidをただ起動するだけでなく
管理する方法も勉強することが出来ました。

今はまだ、ルーターもない状況なので
PCの2台目の購入と同時にルーターも導入するころに
再度、設定をいじろうと思います。

次は、
Cygwinの安全性などはよくわかりませんが、
Win2000Pro工房にあるソフト群を
すべてCygwinからのコンパイルで
まかなえないかなと、楽しんでみるつもりです。
また、わからないことが出てきたりしたときは
お世話になります。
よろしくお願いします。

追記:
第一弾としてApacheをコンパイルしてみましたが
Patchも必要なく、素で通ってしまいました。
いまは、いろんなFtpdを試し中です。
(どこかの記事で、CygwinのFtpdの方が
パフォーマンスがいいとあったので)
もう引っかかってますがw(Wu、Proが撃沈)
最終的に、1つのドライブをCygwin用にしちゃおうと思っています。
試して、また書かせていただきます。

記事の先頭へ▲ 
SUPER LABORATORY