apacheの不思議

proxyを動かそうと思い、

sudo a2enmod proxy proxy_http proxy_ftp proxy_connect

とかやって、

/etc/apache2/mods-available/proxy.conf で

と設定したが、ブラウザのproxy指定でlocalhostと指定すると、Access deniedとか言われる。

とやって、proxy設定を127.0.0.1とやるとOK。

noizumi@bluewolf:~$ nslookup localhost
Server:        192.168.1.1
Address:    192.168.1.1#53

Non-authoritative answer:
Name:    localhost
Address: 127.0.0.1

だし、別におかしいところは無いとは思うが、

noizumi@bluewolf:~$ telnet localhost 80
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
GET http://www.noizumi.org/

だと、デナられる。

noizumi@bluewolf:~$ telnet 127.0.0.1 80
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
GET http://www.noizumi.org/

127.0.0.1の指定だと何ともない。

WHY?

で、今結果を見ていてハタと気がついた。

答えは /etc/hosts の中にあった。

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback

ipv6か。
ipv4の localhost とipv6の localhost は別物なのねん。

AVIC-ZH9000バージョンアップ

フルバージョンアップした。リビングキットを使い、スマートループ利用者は、インターネットからファイルを取得して無料でバージョンアップできるから、利用しない手はない。

予約制で、予め予約しておいて、その時間帯にバージョンアップしろという事で、先週予約したら、かなり予約が埋まっていて、今日になった。

アップデートマネージャというツールでバージョンアップするのだが、ネットからバージョンアップファイル11GBをダウンロードして、ナビのブレインユニットに転送するというバージョンアップ手順。

予想所要時間36時間49分とか出てて(゜Д゜)ハァ?という感じ。
ダウンロードが11:00から開始して、22:10頃終了。実際には11時間10分程度だった。

「ダウンロード転送を同時に行う」にチェックを入れていたので、ダウンロード終了毎にブレインユニットへの転送を行っていたが、これをやっていなかったら日付が変わっていただろう。

Ubuntu 9.04 の動画プレーヤーでDVD再生の音が出ねえ

mplayerとかVLCでDVDは再生できているが、動画プレーヤーのtotemで映像が出るのに音が出ない。

Ubuntuのフォーラムに書いてあった

sudo wget http://www.medibuntu.org/sources.list.d/jaunty.list –output-document=/etc/apt/sources.list.d/medibuntu.list sudo apt-get update && sudo apt-get install medibuntu-keyring && sudo apt-get update sudo apt-get install w32codecs libdvdcss2 non-free-codecs

対策を実施するも、やっぱりtotemで音が出ない。

まあ、動画プレーヤーのDVD再生だけだからいいけど。

【Ubuntu 9.04 on USB Memory】更にRAMDISK化とwine入れた

~/.mozilla と ~/.mozilla-thunderbird のディレクトリをRAMDISK化。

これも、再起動、または、シャットダウン時に書き戻す。FirefoxのWebページ閲覧時に、USB MemoryのLEDがチカチカしていたのが無くなった。

今の所、書き戻しているのは、

/var/log
/var/cache
~/.mozilla*

で、rsync -a –delete …でやっているのだが、実は、昨日、/var/caheの書き戻しに失敗し、全部消えてログイン出来なくなった(笑)

/var/cache をRAMDISK化するのは、インストールしたパッケージを残す設定にしていたりすると、非常に大量の容量を必要とするから、実メモリが少ないマシンは要注意。

後、wineを入れてみたが、tvantsとか動いて感動。
時代は進んだものだとしみじみ思う 🙂

【USBメモリUbuntu9.04】更に危険な設定へ

/etc/sysctl.conf へ
vm.dirty_writeback_centisecs = 360000

を追加。遅延書き込み1時間  😀

/etc/init.d/mountall.sh/etc/init.d/umoutfs を変更。

/etc/fstab で手を入れたのは次の通り

UUID=0c3d26d3-43e3-4291-b618-18c9a3659ccf /               ext3    noatime,errors=remount-ro 0       1
/dev/shm        /ramdisk        tmpfs   defaults                0       0
/dev/shm        /tmp            tmpfs   defaults                0       0

root file system の relatime を noatime にして、アクセスタイムのディスク書き込みをしないようにしている。

そして、/tmp をスクリプトで設定するんじゃなくてfstabでやるようにした。

/ramdisk はUSBメモリに書き戻すデータの置き場所にしようかと考えているが、遅延書き込み周期を長く取ったので、要らないかな?

ユーザのホームディレクトリに作られるアプリケーションの設定ファイルの書き込みが困ったもので、現状だと、ログイン時にRAMDISKに移動させてシンボリックリンク貼りまくりという愚策しか思い付かん。

なので、今のところは個別アプリで、ディスクアクセスの多そうなものの設定を弄って、遅くて書く度に寿命が縮まるUSBメモリへの書き込みをできるだけ回避している。

Tunderbird は、IMAPのアカウントで使っているが、そんなに沢山のメールを貯めていないから、サーバ設定の「メッセージの保存先」を /tmp/noizumi に設定。

IMAPの場合、「メッセージの保存先」にサマリーを生成するだけなので、揮発しても次にマシン再起動した際に若干時間が掛かる程度なので、特に問題は無い。

ROM RAM ベースで動かすと、古いマシンでも充分快適に動くな。

Ubuntu 9.04 on USB Memory

RUF2-P8G-BKにUbuntuを入れようと試みるが、USB起動ディスクで作ると、サイズは700MB程度とコンパクトで良いのだが、ISOイメージを入れてくれるのとRead Only Mountなので、アップデートとかできない。

普通にインストールしたが、このままでは、書き込みが多いlogとかtmpとかのディレクトリのせいで、Flash ROMがすぐ死んでしまいそう。

そこで、RAMディスクに頻繁に書き込みのあるディレクトリを割り当て、Flash ROMの急速な劣化をさける対策をした。

rootファイルシステムは、noatimeオプションでマウント。
/etc/init.d/mountall.sh

case “$1″ in
start|””)
do_start
mkdir -p /mnt/tmp
mkdir -p /mnt/log
mount -t tmpfs /dev/shm /mnt/tmp
mount -t tmpfs /dev/shm /mnt/log

/usr/bin/rsync -a /var/log /mnt

mount –bind /mnt/tmp /tmp
mount –bind /mnt/log /var/log
chmod -R 1777 /tmp
;;

/etc/init.d/mountall.sh

stop)
umount -l /tmp
umount -l /var/log
/usr/bin/rsync -a –delete /mnt/log/ /var/log

do_stop
;;

/var/log はシャットダウンや再起動時にrsyncで書き戻す。
/tmpはそのまま揮発していただく。

最初、mount –move でやろうとしたが、umount時にRAMディスクが消えて無くなるので、書き戻せず、–bindでマウントした。

結構いい感じだが、やはり/homeの細々とした書き込みのせいで、時折、重たくなる事もある。 今のマシンはメモリ768MBしか無いから、これはさすがにRAMディスクに持っていくのはヤバい。

LinuxのRAMディスクの/dev/shmはデフォルトで、最大実メモリの半分までのサイズを持ち、実メモリの使用が増えると縮んでくれる優れもの。

実メモリの使用が増えて、RAMディスクの実使用サイズを脅かすようになるまで、稼動させた事は無いが、こういうクリティカルなケースになったら、RAMディスクのマウントが外れるのかな?

Cyrus IMAPd監視ツール

社内メールサーバに障害が起こっていたが、Cyrus IMAPdのDBのログのownerがrootになっていて書けないという原因だった。

/etc/init.d/cyrus-imapd stop
chown cyrus.imap /var/lib/imap/db/*
/etc/init.d/cyrus-imapd start

とやって、 再びstartさせたら治ったが、ログを見る限りでは、DBのログローテーションタイミングで、ctl_cyrusdbが新たに作成したログへの書き込みに失敗しているという感じ。

Web検索すると、Macの事例がちょこっと読めたりするのだが、英語のメーリングリストまで当たってみても、具体的にどういう対策を採れば解決するのかという情報は皆無で、バージョンは今2.2.12だが、2.3.xに上げたとしても直る保証がない。

何しろ、DBのログローテーションのタイミングで起こるので、よっぽど大量のメールを処理してても滅多に起こるものでもない。しかし、休日に呼び出されるのも嫌なので、ログを監視して自動復旧するツールを作った。

昔、perlでpppのログ監視して、pppが切断されたら再upとか、PCMCIAのAirH”カードを再初期化するツールを作っていたので、その応用で、maillogを監視し、ctl_cyrusdb\[\d+\]:.*DBERROR.*Permission denied ってのに反応するようにした。

Cyrus のdeliverはIMAPdでスプールできないと/var/spool/mailに落としてくれるので、

formail -d -s sendmail hoge</var/spool/mail/hoge

とかやると、落っことしたメールを再配送できる。

監視ツールでは、この再配送までを自動でやるようにしてはいるが、実際に障害が起こらないとうまく動くかは分からないんだなこれが(笑)

ツール作り

Cyrus IMAPdと腐れExchange Serverのメールをバックアップアカウントへ合成コピーした時に、腐れExchange Serverのメールがダブるので、それを消すツールを作った。

こういうちょいとしたツール作りは楽しい:-)

まあ、普通のまともなメールサーバーなら、Message IDが同じだとメールの同一性は保証されていて、Cyrus IMAPdへスプールしてもインテリジェントにduplicate markを付けて、冗長な同じメールは実データとして格納しないはずだ。

しかし、腐れExchange ServerとOutlookは意味の無いReceivedヘッダをわざわざ追加し、winmail.datとかいう何の役にも立たないゴミを付加してくれるので、さすがのCyrus IMAPdも別のメールとしか見てくれないようだ。

「簡単」と素人を騙して売りつけ、実は制御不能の腐れExchange Serverなんぞ相手にしていなければ、作る必要の無いツールな訳だが、まあ、問題解決のプロセスを考えるのが面白いからよかろう。

で、最初、PHPで組んだ時に、UIDがキーの連想配列にMessage IDを格納して、array_unique()という簡単な処理で、ダブってないMessage IDのリストが作れ、array_diffで、削除すべきメールのリストがすぐ作れた。

だが、盲点は、消されるのはダブっているメールの一方であって、必ずしも腐れExchange Serverのゴミメールじゃないという事だ。

そこで、imap_fetch_overview()で取得したサイズも配列に格納し、array_multisort()で、UID、Message ID、Sizeのそれぞれの配列をソートする。

すると、リストで、ダブっているMessage IDのトップは必ずサイズの小さいものとなり、array_unique()で生き残るのは一番最初に見つかったものなので、サイズの大きいメールが駆逐されるというアルゴリズムにした。

これで完璧だ:-D

しかし、マイクロソフトのもたらす後戻り工数って、全世界規模だとどれくらいの損害額なんだろうなあ。

退化

ファイルアップロードスクリプトが正常に動いているか、時折、ログを観察しているのだが、以前、ファイルの二重送信が原因と思っていたログパターンがまた現れた。

以前は、そのログを見て、送信ボタンの二度押しでの二重送信はJavaScriptで封じたのだが、また起こったという事は別の要因がある。

サーバログを見ると、400 BadRequestになっていた。
うーむ…、cookie関係か?二重送信っぽいので、ブラウザ2つ開いて、それぞれで送信したらどうなるんだろ?と、試験してみるとアウト!

そう言えば、セッション名は特段設定してないので、2つのブラウザで送信したら、片方が完了した時点でセッション変数は全滅するな(笑)。

という事で、セッション名を設定する事で、ブラウザ何個開いて送信しようが大丈夫になった。しかし、cookieファイルが増大していく…

cookieファイルを期限切れで破棄にするには、「アップロードが成功しました」と表示するスクリプトのヘッダ部分で、Set-Cookieを設定してブラウザに食わせてやらねばならない。

しかし、元々のあったものが、cookieの明示的な削除をして無くて、複数セッション利用時の事も全く考慮されておらず、セッション破棄の前に、色々とHTMLを表示してしまっている。

その為、いざ、cookieファイルを消そうとすると、パラメータの渡し方からロジックを洗い直さなければならず、構造からやり直しという事になる(–;

しかし、昔のわしなら、お客様の使用法を想定して、ブラウザを複数開いてファイル送信なんて事は事前に思いついたのだが、問題が起こるまで分からんというのは退化してきたのかのう。

まあ、言い訳をさせて貰うと、すでに運用されているスクリプトで、そういう事態が今まで問題に成らなかった訳が無いという思い込みがあったな。

メールゴミ箱

Exchange+Outlookで、他人がメール送信に失敗した時に、わしのマシンを踏み台にしようとする件だが、メールゴミ箱を作った。

ArGo Softwareのフリーのメールサーバで、こいつのリレーをONにしつつ、ウィルスバスターのパーソナルファイヤウォールで、ポート25の送信を禁止しておく。そうするとOutlookがわしのマシンを踏み台送信に使おうとしても、ローカルのメールサーバに投げて、そこでbounce mailでドロップされて終了。

これでお客様に何通も同じメールを送りつける内の一通は減らす事ができた訳だが、他にも同じ対策をするか微妙だな。何せ、今までLinuxのサーバにメールを投げていた時は全く何の問題も無かった訳だし、Exchange+Outlookだけが「送信したメールが届かない」等の不具合がある。

全て踏み台送信対策をした場合、送信メールが届かないという事例が多発するだろう。 Exchange+Outlookってつくづくどうしようも無いクソだなあ。早く捨てたいのう…。

踏み台送信に使われているであろうと思っていたRemoteProcefureCallについて余りよく調べられていないのだが、踏み台送信にはUDPだけでも無いようだ。OutlookはExchangeアカウントを設定すると、Exchangeの送信トレイを使うように強制されてしまうが、その送信トレイが関係している気がするな。

まあ、こんなMicrosoftのしょうもない製品に時間を取られるのもバカバカしいから、詳しい検証はしていないが、アカウント共有で複数人が同じ送信トレイを使うのは、プログラマの勘で止めておいた方が良い気がするな。

Exchangeで各自にアカウントを作り、public folderを使うというのなら、何通も同じメールを相手に送信するという馬鹿げた現象が無くなる気がするが、どうせ、この一言を言ったところで、誰もやらないだろうし、やるとなると全てわしがやらされるハメになるから言わない(^^: