Linuxで七転八倒な記録


まず一言。Linux の HowTo に関するページは世の中たくさんあるから、ここを見るよりはそっちを見るのが賢明かと。まだまだ Linux を完全に理解してるわけじゃないから(^^;
それに「前あれってどうやったんだっけ?」とすぐ忘れる自分のための覚え書き的存在なので(笑)

← 前 BBS 次 →

2001年09月24日
○Apacheのログ
↓の mod_dav 関係だけど、DAVのアクセスは普通のHTTPとリクエストのやりとりが違う部分も多いし、見通しの向上もかねてログをわけてみる。httpd.conf のログまわりを変えるだけだね。

----- FileName /etc/httpd/conf/httpd.conf -----# ☆ 616 行目付近 ☆
# CustomLog /var/log/httpd/access_log common   # 元の設定

SetEnvIf Request_URI "^/dav($|/)" dav_access
CustomLog /var/log/httpd/access_log common env=!dav_access
CustomLog /var/log/httpd/dav_access_log common env=dav_access
------ end of httpd.conf ------
最初の SetEnvIf のところで DAV用か一般用かの判定をしてます。Request_URI が "^/dav($|/)" にマッチング、つまり「/dav」か「/dav/〜」の場合は dav_access という環境変数を設定する、そういう意味だね。で、次の行は元の設定の最後に env=!dav_access が足されてます。つまり、環境変数 dav_access が設定されていない(! が NOT の意味)時だけ access_log にログを残すことに。最後の行は逆で、環境変数 dav_access が設定されている時だけ dav_access_log に。こうすることで振り分けはOK。

○mod_gzipのインストール
mod_gzip はHTTP出力を圧縮して吐き出すためのモジュール(説明後述)。 まずはパッケージを拾ってきてインストール。

# rpm -ivh mod_gzip-1.3.19.1a-1.i386.rpm
続いて設定。インストをすると /etc/httpd/conf/mod_gzip.conf を作成して、httpd.conf からこのファイルを読みこむようになるようだ。念の為 httpd.conf の記述が正しいかチェック。

----- FileName /etc/httpd/conf/httpd.conf -----
…
<IfModule mod_gzip.c>
        include /etc/httpd/conf/mod_gzip.conf
</IfModule>
------ end of httpd.conf ------
続いて mod_gzip.conf を適当に修正。ログの項目を圧縮に関することだけに減らす。他のことは access_log を見ればいいわけだし。

----- FileName /etc/httpd/conf/mod_gzip.conf -----
mod_gzip_on yes
mod_gzip_dechunk yes
mod_gzip_keep_workfiles No
mod_gzip_temp_dir /tmp
mod_gzip_minimum_file_size  1002
mod_gzip_maximum_file_size  0
mod_gzip_maximum_inmem_size 1000000

…

# 入力は LogFormat ... common_with_mod_gzip_info2 まで一行で(↓は2行に分割してある)
LogFormat "%h %t \"%r\" %>s mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n
 Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct." common_with_mod_gzip_info2
CustomLog /var/log/httpd/mod_gzip.log  common_with_mod_gzip_info2
------ end of mod_gzip.conf ------
あとは httpd の再起動。楽だね。さて、mod_gzipについて簡単に。圧縮を行うことは名前からすぐに分かるね。普通 Webサーバは、ファイルなりCGIの出力なりをそのまま Webクライアントに渡すよね。通常はそれでも困らないけど、回線の帯域が細かったりするとレスポンスの低下が著しく起きることもある。そこで、データを圧縮して出力することで効率を高める、と。データを圧縮するわけだから、クライアント側がそれを元のデータに展開しないといけない。まぁ、代表的なブラウザならまず問題なく対応してるから安心。もし対応してないクライアントだとどうなるか?それは自動的に判断して非圧縮のまま出力するからそれも大丈夫。具体的にはリクエストの中のヘッダ Accept-Enconding に gzip が含まれているかで判断。
サーバからクライアントへ圧縮されたデータが送られる
圧縮対応の場合でもなんでもかんでも圧縮すればいいわけじゃないん。例えば、JPEGはデータ自体がすでに圧縮されたデータなんでほとんど潰れないし、逆にHTMLなんかのテキストはかなり効率よく圧縮できる。そこで、圧縮する、しないの場合わけの設定をおこなう。デフォルトの設定の一部を見ると、

mod_gzip_item_include file \.htm$   # 拡張子が .htm のファイルは圧縮
mod_gzip_item_include mime text/.*   # MIMEタイプが text/〜 の出力は圧縮

mod_gzip_item_exclude file "\.css$"   # 拡張子が .css のファイルは非圧縮
こんな感じになってる。自分で圧縮したいものを追加することももち可能。さて、実際圧縮されているかログを見てみよう。(見やすいように一部編集)

"GET / HTTP/1.1" 200 mod_gzip: DECHUNK:OK In:1542 Out:1067:31pct.
"GET /**/ HTTP/1.1" 200 mod_gzip: DECLINED:TOO_SMALL In:473 Out:0:0pct.
"GET /**/***/ HTTP/1.1" 200 mod_gzip: DECLINED:TOO_SMALL In:969 Out:0:0pct.
"GET /**/***/fml.css HTTP/1.1" 200 mod_gzip: DECLINED:EXCLUDED In:0 Out:0:0pct.
"GET /**/***/thread.html HTTP/1.1" 200 mod_gzip: DECLINED:TOO_SMALL In:973 Out:0:0pct.
"GET /**/***/***/thread.html HTTP/1.1" 200 mod_gzip: OK In:30945 Out:2886:91pct.
"GET /**/***/***/index.html HTTP/1.1" 200 mod_gzip: OK In:24991 Out:2337:91pct.
"GET /**/***/***/745.html HTTP/1.1" 200 mod_gzip: OK In:1751 Out:825:53pct.
HTTPステータス以降が mod_gzip のステータス。左から 結果ステータス、圧縮前サイズ、圧縮後サイズ、圧縮率。例えば、最初の行は「1542バイトのデータを1067バイトまで正常に圧縮。圧縮率31%」ってことやね。主なステータスはこんな感じらしい。正確じゃないかも。時間があるときにソースコードで追ってみよっと。

ステータス意味特に関係する設定項目
DECHUNK:〜CGIなどの動的なページを処理した場合。後ろに OK などがつく 
OK正常に圧縮完了 
DECLINED:TOO_SMALLデータサイズが小さいので圧縮しないmod_gzip_minimum_file_size
DECLINED:TOO_BIGデータサイズが大きいので圧縮しないmod_gzip_maximum_file_size
DECLINED:EXCLUDEDデータが対象外なので圧縮しないmod_gzip_item_exclude file
mod_gzip_item_exclude mime
mod_gzip_item_exclude handler
など
DECLINED:DECLINED:NO_ACCEPT_ENCODINGクライアントが圧縮データに非対応なので圧縮しない 
DECLINED:UNHANDLED_SUBREQリクエストが無効なので圧縮しない?(よくわからん…) 
SEND_AS_IS:NO_200HTTPステータスが"200"でないので圧縮しない 

で、やはりHTMLのようなテキストは圧縮率が良くて90%、つまりサイズが1/10になってる場合もある♪圧縮の処理時間を考えてもこの差はかなり大きいでしょ。
mod_dav のもそうだけど、ログのローテートの設定もしないと。そう難しくないけど、次の機会にしておこう。


2001年09月18日
○fml 4.0.2 → 4.0.3
# tar xfI fml-4.0-stable-20010917.tar.bz2
# cd fml-4.0-stable-20010917
# su
# env RECOMMEND=yes perl makefml install
インストーラに質問されるけど設定が記憶されているのでデフォルトで。ただ、言語のところだけ「Japanese」を設定。
ついでに携帯からポストされた場合の対処。携帯からの場合、Reply-To ヘッダに自分のアドレスをつけるので、そのメールに返信しようとすると宛先がメーリングリストではなく携帯のほうになってしまう。毎回書き換えれば済むのだけど、それを忘れる可能性もあるので、メーリングリストにポストされた時点で Reply-To を書き換えるように設定ファイルを書き直す。メーリングリスト名を maillist とすると、

----- FileName /var/spool/ml/maillist/cf -----
…

LOCAL_CONFIG

#__MAKEFML_LOCAL_CONFIG__
# configured by ./makefml on Tue, 18 Sep 2001 09:53:28
# *** DO NOT EDIT MANUALLY THIS BLOCK!!! ***
#__END_OF_MAKEFML_LOCAL_CONFIG__


# YOU CAN EDIT MANUALLY AFTER HERE.

# Reply-To を強制的に書き換える
&DEFINE_FIELD_FORCED('reply-to', $MAIL_LIST);
------ end of cf ------
設定を反映させる。

# makefml update-config.ph maillist

○mod_dav のインストール
まずはパッケージを拾ってきてインストール。

# rpm -ivh mod_dav-1.0.2-6.i386.rpm
次にロックファイル用ディレクトリの作成。これは後で設定するコンフィグのパスと一致させる必要がある。うちの Apache はユーザー名、グループ名ともに apache で起動しているので、権限の設定で Apache から読み書きできるようにする。

# mkdir -p /var/lock/apache
# chown apache.apche /var/lock/apache
このままでは日本語のエンコーディングに関する問題が起きるので、それを回避するために mod_encoding を導入。これはパッケージはなくてソースからのインストールとなる。ソースの入手元は http://www.lyra.org/pipermail/dav-dev/2001-May/002392.html (※--- cut here --- 以降を切り出して保存)。

# /usr/sbin/apxs -c mod_encoding.c
# /usr/sbin/apxs -i mod_encoding.so
次に httpd.conf に設定を追加。

----- FileName /etc/httpd/conf/httpd.conf -----
…
##
##   DAV
##
DAVLockDB /var/lock/apache/DAVLock   # これのディレクトリ部分を上記の準備で作成

LoadModule encoding_module modules/mod_encoding.so

<IfModule mod_encoding.c>
  EncodingEngine on
  SetServerEncoding UTF-8
  AddClientEncoding SJIS    "Microsoft .* DAV"   # Windows は シフトJIS
  AddClientEncoding SJIS    "xdwin9x/"
  AddClientEncoding EUC-JP  "cadaver/"   # linux は EUC
</IfModule>

Alias /dav /hogehoge/dav
<Location /dav>
  DAV on

# すべてのアクセスに対して認証で制限
  <Limit GET PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
    Order deny,allow
    Deny from all
    Allow from *****   # 設定したホスト、ドメイン以外は拒否
    AuthType Basic
    AuthName "WebDAV Users Auth"
    AuthUserFile /etc/httpd/conf/dav_userpwd
    Require valid-user
  </Limit>

  Options Indexes
</Location>
------ end of httpd.conf ------
後は apache を再起動。

# /sbin/service httpd restart
最初きちんとインストールしたのに上手くいかなくてなんでだろう?って思ったのだけど、答えは簡単。Apache のバージョンが 1.3.12 で古すぎたん。1.3.20 にアップしたらなんなくOK。
今回の内容は UNIX USER 10月号を手本にしているんで、興味があればそちらもどうぞ。

(2001/11/05 一部補足)


2001年08月21日
今日はいっぱい書いたんで、まずこっちを読んでね。
んでついでに Windows ネットワーク(NetBIOS)のほうも設定を変更。今まではごく普通の設定。つまり、名前の解決はブロードキャストでブラウズマスタ(ワークグループの中に1台だけ存在する、そのワークグループ内のマシン名のデータリストをもつマシンのこと。ややこしい?)の選定もデフォルト。別にこのままの設定でも別段問題はないのだが、ブロードキャストを連発するんは気に入らないんよ〜。せっかくLANスイッチ(スイッチングハブ)使ってトラフィック・コリジョンの改善をしても、ブロードキャストは同じLAN上の全てのマシンに流れるから効果が薄れる。しかも、ブロードキャストの処理にはNICだけでなくCPUのパワーも使うんよ、自分に関係の無いパケットでさえ…。負荷は本当に微々たるものだけど、キャプチャーなぞしてる時はこれが原因でコマ落ちしかねない。もっと速いマシン使え〜、って言われたらそれまでやが(笑)
とまぁ、ブロードキャストの悪口を述べたところで、じゃあどーするかと言えば、WINS を使うんです。WINS は NetBIOS版DNS のようなもの。WINS サーバには普通 NTサーバを使うんだけど、うちにはないんで Linuxの Sambaを WINSサーバとして使うことに。じゃ、ますサーバの設定からいきますか。
Samba 自体はすでに運用済みなんで、設定ファイル smb.conf を編集して再起動するだけでOK。

----- FileName smb.conf -----
…
wins support = yes   # WINSサーバとして動作
local master = yes   # ブラウズマスタとして動作
preferrerd master = yes   # Samba 起動時にブラウズマスタの選定を必ず行う
os level = 64   # ブラウズマスタの選定に有利
dns proxy = no   # DNSへの問い合わせはしない
------ end of smb.conf ------
続いて Windowsマシンのほう。TCP/IP のプロパティで WINSの設定をする。「WINS の解決をする」を選んで、下に WINSサーバ、つまり Linuxマシンの IPアドレスを入力。追加をして OKして再起動するだけで WINSを使えるようになる。うん、簡単!
でも、これだけで終わらせないんよね。実はこのままだと「hノード」なんだよね。どういうことかというと、WINSサーバに問い合わせて見つからなかった場合には今まで通りブロードキャストを投げるんよ。さらに見つからなければ、DNS問い合わせまで使って名前を解決しようとするという。これはどうも頂けない。hノードになってるかどうかは、winipcfg を使って確認できるんで。
ノードタイプがハイブリッドになってる
そんなわけで、このブロードキャストもなくしたい。それには「pノード」にしないといけない。しかし、これはプロパティからは出来ないんよね。レジストリをイジらないと。レジストリエディタでこんな感じに変更。

レジストリキー [ HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP ]

・NodeType(文字列)
ノード
"1"b-node(Broadcast node)
… ブロードキャストのみ(WINSを使わない時のデフォルト)
"2"p-node(Peer-to-Peer node)
… WINSのみ
"4"m-node(Mixed node)
… bノード → pノードの順に照会
"8"h-node(Hybrid node)
… pノード → bノードの順に照会(WINSを使う時のデフォルト)

・EnableDNS(文字列)
DNS参照
"0"しない
"1"する(デフォルト)

これでOK。DNS参照なしにすると、TCP/IPのプロパティのDNSのところが「使用しない」になるけど、実際はTCP/IPのホスト名の参照にDNSは使うけど、NetBIOS名の参照には使わないようになってるんで安心してくださいまし。では、再起動してチェックしてみよう。winipcfg で…
P2Pになってる♪
netstat -r(r は小文字)で…

C:\WINDOWS>nbtstat -r

NetBIOS Names Resolution and Registration Statistics
----------------------------------------------------

Resolved By Broadcast     = 0
Resolved By Name Server   = 2
Registered By Broadcast   = 0
Registered By Name Server = 6
よしっと。これで完了っす♪

← 前 BBS 次 →

△戻る ▲トップに戻る