ゲーム攻略からプログラミングまで、その時に思いついたことをだらだらと書き連ねていきます。

【Apache・DB】夏だから不思議なエラーのお話

2014.08.12 15:15 | コメント(0) | 技術

program.jpg

この記事は最終更新日から1年以上が経過しています。

暑い。

そして少し溶けてる。

さっちんだよー。

今日はApache周りとMySQLのお話。

一週間ほど前に謎のエラーで苦しんだので、経緯でも。

事の経緯はこんな感じ。

自宅でお遊び用に建ててるサーバにとあるプログラムを追加。
そのプログラムはキューに入ったジョブを定期的にチェックして、処理を行うシンプルなプログラム。
要は定期的に更新する必要のあるデータやらなんやらを自動的に取り込んでゴソッとDBに記述していく。
で、この子が動かない。

困ったねー。

はい、細かい説明のスタートです。

問題の切り分け

とりあえずテストで動かしたときから不調。
期待した通りの振る舞いがされてない。

この時点で考えられるのは、
  • プログラムの中身の問題。
  • プログラム起動時の問題
  • ネットワークの問題
  • DBとの連携の問題
  • その他考えの及ばない部分でのエラー

一番最後はそっとしておきましょうね。
んでまあとりあえずログを確認。

んむ、動いてる。
ただ1行だけブリッとエラー。
failed: push message into queue: connection closed.

ほう。

何の接続なんだ

なにがしかとの接続がうまく行ってないということなので、原因を探っていきます。


プロセスの確認と、ポートの確認

とりあえずプログラムを再起動。
ちなみにこのプログラムはデーモンで走らせます。

プロセスの確認
ps aux

はい、ちゃんと生き返ったのを確認。

うし、では再度確認!
今度はtailでログを垂れ流しながらリトライ。
failed: push message into queue: connection refused by peer.

なんか変わった!

うん、でもやっぱりエラーなんだね。

このプログラムではジョブをキューに入れる時に特定のポート(今回なら7727番)使用します。

ポートの確認
netstat -l

うーん・・・ここで接続が切れててくれればポートの解放忘れ・・・アホだなー。
で終わったのですが、バリバリLISTEN状態。

さー困った!

プロセスが途中で死んでるわけでもないし、起動に失敗しているわけでもない。
使用予定のポートもしっかり空いてる。

じゃあなんじゃらほい。


DBの確認

エラーの内容が「キューに詰め込めなかったよ!」なので、
可能性は薄いですが、DBとの連携が取れてないのかなと。

ちなみにDBはMySQLです。
まずは先ほど同様mysqlのポートが空いてるか確認。
netstat -l

まあ当たり前のように空いてる。

実際叩いてみましょうね。
mysql -u satsuki -p some_database

入れますなー。
ひょっとしたらDBの文字コードが違うとか?
SHOW CREATE DATABASE some_database;

これも違う・・・。

あと何見ようか

プロセス生きてる、ポート空いてる、DBも生きてる。
でも動かそうとするとエラー。

もういいか
いや、よくない(反語)。

順番に手動でアクセスしてみてそれでだめならもう諦めよう。
telnet 127.0.0.1 7727

出た!Connection refused!
なんだよー。全然接続できてないじゃないのー。
結局今回の原因はプログラム側で使用するポートが空いてないことが原因でした。
でもnetstatコマンド使ったときは問題なくLISTENで上がってきたんだよねー。

何度かプログラム自体の起動・停止も試してみたけど、改善のきざしはなかったし。

ただ、telnet叩いた後に再度再起動をかけるとなぜかすんなり起動。
今まで一度も同様のエラーは吐いてません。

何が原因だったんだろう?

久々にハマったエラーだったのと、結局原因がはっきりしてなくてモヤモヤしたので書いてみました。
「これじゃね?」って思い当たる節がある方は教えてください。

まあ今回のプログラムの場合は、データの鮮度なんて気にしないからシェルスクリプト組んでcronで動かす方法もあったんだけどねー。
ただなんとなく動くようにしないと負けなような気がしてw

ちなみにそこまで深刻ではないけど、まったく関係のないMySQLの変な仕様を見つけたので少し。

MySQLを見に行く時に、「127.0.0.1」でアクセスしに行くとTCP経由で見に行くけど、
「localhost」で見に行く場合はSocketを使うみたい。
DBサーバを別建てしてない場合はlocalhost指定の方が処理が速くなるかもねー。
技術の記事

コメント

まだコメントがありません...(´・ω・`)