サーバー

エラーを知らせるメールの嵐

2015年03月18日
使っているレンタルサーバーが、メンテナンスを行ったようです。
今回のメンテナンスは、OSのバージョンアップを行うとのこと、多分何かあるだろうなとは思っていました。

朝起きて、メールのチェックをすると、エラーを知らせるメールの嵐いや洪水かな・・・ 200通以上届いていました。
一体何が起きているんだ。

メールの差出人はどれも【Cron Daemon】です。cron実行時に何かが起こっているようです。
サーバーに負荷をかけていてはいけないので、急いでエラーが起きているスクリプトを確認、実行を止めます。
これで落ち着いて内容を確認できます。

各メールの内容を絞り込むと、

1番目
sendmail: illegal option -- d (dのところは色々な文字)
sendmail: fatal: usage: sendmail [options]



2番目
postdrop: warning: could allocate space for only 100 open files

というエラーが起きているようです。

2つ目は、オープンファイル100個までしかスペースを取っていないよ、と言っています。何のスペース?
調べてみると【postdrop】はメール関連のワーニングのようです。

ワーニングが出ているスクリプトでは、メールボックスを開いて、各メールの内容を確認しているので、そのことか?
それともエラーが多すぎると言っているのか?

今後のためにと思いメールボックスに残しておいたメールを整理しました。いつかはしないといけないと思っていたので、いい機会です。
と思い整理したのですが、メールボックスのメールが原因ではなかったようです。


2番目はwarningなので、エラーほど切羽詰っていません。
問題は1番目です。
【sendmail】で【illegal option】というエラーが起きています。ありえない引数をしていしているということです。

エラーが起こっているスクリプトのどこかを調べていくと、MTAが【qmail】かどうか調べている箇所が原因だとわかりました。ここは、意図的にエラーを起こしている箇所です。スクリプトの変更は難しいです。

いや待て、今まで同じスクリプトでエラーを知らせるメールは送られて来ていなかったぞ。
ということは、スクリプト云々ではなく、cronの設定が今までと変わって、cron実行時に起こったエラーをメールで知らせるようになったのでは?

いずれにしても、cronの設定を変えるのが現実的です。出力先を変更する方法があるんだけど、何だっけ?
第30回 「cron のお勉強」が分かりやすいです。

止まりました。やれやれです。
しかし、crontabの内容を見直してみると、今まで送られてこなかったのが不思議です。

サーバー

永久引越しの謎

2013年10月06日
Webページを永久引越しする時、古いページの様々な情報を引き継ぎたいことがあります。

ブラウザからのアクセスは新しいページへリダイレクト、クローラーにはページ情報を引き継いで貰う方法はいくつかあります。
詳しくは割愛しますが、【.htaccess】を使いリダイレクトする方法が一番良いでしょうか。

今回は引っ越すページは1ページだけ、その上PHPを使っているので、【.htaccess】ではなく、PHPにソースを記述することにしました。

古いページ(http://oldsite.xxx/old.php)へ
Header("HTTP/1.1 301 Moved Permanently");
Header("Location: http://newsite.xxx/new.php");
と書けばOKです。

いざブラウザから古いページへアクセスすると、とんでもないことが!!!
http://newsite.xxx/new.php
ではないページへリダイレクトされてしまっています。

本番サイトの前に、テストサイトで試してみたのですが、その時リダイレクト先に設定していたページへリダイレクトされてしまってます。

今日は他のテストも行い、そのテストでは【.htaccess】のリダイレクトを使いました。その時、操作を誤り【.htaccess】を思いもしないサーバーのディレクトリにアップしてしまったのかと思い、サーバーの中を探し回りました。
ですが見当たりません。

http://oldsite.xxx/old.php のソースを書き変えてエコーを吐かせてみました。なんと!無視です。エコーは吐かず、リダイレクトされてしまいます。
つまり、http://oldsite.xxx/old.php に何と書こうと、
Header("HTTP/1.1 301 Moved Permanently");
Header("Location: http://newsite.xxx/new.php");
が実行されているのです。

なんじゃぁこりゃぁぁぁぁ!!!!!

2時間ほどあずった挙句、思いついたのが、『ブラウザが勝手にリダイレクトしてる?』でした。試しに別のブラウザからアクセスすると、あっさり正しいURLにリダイレクト・・・されました。

テストに使っていたのはIE9です。
履歴を消せばちゃんと動くかと思い、消してみましたが、駄目でした。
色々やってみた結果、【ツール−閲覧履歴の削除】で【お気に入りWebサイトデータを保持する】のチェックを外して削除するとリダイレクトの履歴が削除されるようです。

思い出してみると、テストのとき使用したファイルを、そのまま本番サイトにアップしてしまった記憶があります。
なので、初回アクセス時に、テストサイトのページへリダイレクトされ、それがブラウザの一時ファイルに残っていたようです。
2回目以降のアクセスはブラウザの一時ファイルの方が、優先されるようで、テストサイトのページへリダイレクトされ続けた、というのが真相のようです。

やれやれ、数分もかからず終わるはずの作業が、2時間弱かかってしまいました。

サーバー

sshでサーバーに接続

2012年05月15日
ここ数日またまた片頭痛の発作が起こっていましたが、今日やっと動けるくらいに回復しました。まだ痛いですが。

使っているレンタルサーバーがTelnet接続サービスを終了し、sshに移行したので、時間ができたらできるようにしておかなければと思っていた【sshでサーバーに接続】をやってみることにしました。決して時間ができたわけではないのですが。

まず、sshをサポートしているソフトを入手します。今まで使っていたソフトはサポートしていないのです。
Windowsでは
TeraTerm
Poderosa
などがあるようです。今回は【TeraTerm】で接続することにしました。
インストールそのものは簡単でした。
Tera Termの使い方−Tera Termのダウンロードとインストールを参考にしました。

インストールが済んだら、次はいよいよ接続です。
公開鍵、秘密鍵の作成方法はTera Termの使い方−SSH鍵の作成が参考になります。

ここで困ってしまいました。どうやって使うんだ???
Tera Termの使い方−SSH鍵の作成にあるように、公開鍵をサーバーに登録するのは、本当に管理者に聞かないといけないのかな・・・

検索していると、こんなサイトがありました。
TeraTermProで公開鍵認証を使う−公開鍵をサーバーに登録する
この通りにやってみました。
万歳!!接続!

後は、SSH公開鍵暗号化方式−サーバ側(接続受け側)の設定にあるように、パーミッションを変更しておきます。【600】では動かなかったので、【700】に設定しました。

これで完了。やれやれです。
それにしても、TeraTerm、使いにくい・・・
設定で使いやすくなるのだとは思いますが。
少しずつ慣れながら、設定を変えていくしかないかぁ。

サーバー

これで自動認識?・・・でも不安

2012年05月04日
ぶつぶつ書いてしまったqmailのバグですが、これでMTAを自動認識できるようになるかもしれません。

以前、何のMTAを使っているか判別する方法を探したとき、PHPのiniファイルの設定を読む方法しか見つけられなかったのですが、今回別の視点から検索していたら、見つけました。
ちょびろぐ
system関数を使って調べるようです。
設定ファイルを辿っていけば、どこかにMTAがわかる記述があるはずだとは思っていましたが、system関数で調べられるんだぁ。勉強、勉強。

しかし、どうやら重たいらしいです。まいったなぁ。
私としては、こんな苦労はしなくても、SMTPポートを直接開いて送信してしまったほうが後腐れなくて、すっきりして、爽快なんですが・・・
ポートを開くとなると、IDやPWをどこかに保存しておかなければいけません。(もしかしたら自動取得できるのかもしれませんが、どうせ面倒でしょうし、そうなるとどっちが良い方法かわからなくなってきます。)
ユーザーさんにも設定してもらわなければいけませんし、極力ファイルに保存しておきたくありません。
もちろんステップメールやメールマガジンのように大量配信する場合は、PHPのmail関数は不適切ですから、SMTPポートを開きます。ですが、一度に送信するのが1通や2通の場合は、ユーザーさんの設定を軽くしたいな、と思います。

Qdmailに組み込まれているソースを使いやすいようにアレンジして、試してみました。
動いているっぽいです。確かに、qmailのときはステータス111を返し、sendmailでは1を返してきます。
でもソースにある100はどんなときに返ってくるんだろう?

まぁ今の状態より、より正確な自動判定ができると思うので、導入しようと思います。
でも、今の手動で設定する方法も残しておくつもりです。
世の中思わぬ動きをするサーバーがあるかもしれません。自動判定できない場合に備えて手動も残しておいたほうが安心です。せっかく今機能があるんですから。

重たいらしいし、ツールの管理画面を開いたとき判定して、設定に反映したほうがいいかな?
送信前に一度だけチェックすれば、さほど負荷はかからないかな?

サーバー

こんな便利な機能が!!!

2012年05月03日
使っているレンタルサーバーが、Telnet接続を終了させ、今後はsshによる接続のみ利用できるようになってしまいました。
今まで、DBのテーブル作成、cronの設定はTelnetで接続して行っていたので、今後のためにも、sshの接続ができるようにしておかなければいけません。

もっとも、テーブル作成やcron設定が、サーバーの管理画面からできれば、私の場合なにもsshで接続する必要はないのですが。

接続方法を見ていると、なんだか面倒そうです。管理画面からできればなぁ。大抵のサーバーはできるようになっているのですが。
ということを思いながら、管理画面を見ていると、SQL管理ツールというプルダウンが目に留まりました。もしかして。
選んでみると、DB接続でき、SQLが発行できるではありませんか!!
しかもMySQL、PostgreSQL両方いけるではありませんか。
なんだ、Telnetで面倒な接続をしなくても、テーブル作ったり、中身をちょっと見てみたり、できるんじゃない!
なんで今まで気がつかなかったんだぁぁぁぁぁ。

後はcronの設定か管理画面からできれば、ssh接続は今のところ必要なくなります。

そう言えば、cronを管理画面から設定できるようにするって以前言ってたなぁ。
調べてみると、2008年8月に機能を付けます!とお知らせがきています。
でも管理画面のどこにも見当たりません。隠れているのかな?

やや期待して、問い合わせてみました。すると、準備はしているから待って、できるまでsshから設定して、とのこと。cron設定の機能を付けるのに、4年もかかるのか!? そんなわけないでしょうに。

cronの設定はWebからできるようにならないか、何度もチャレンジしたのですが、どうしてもできませんでした。
ネットに書いてある方法はことごとく当てはまらないのです。
なんとかならないかなぁ。

PHPコーディング

【.forward】から転送されたメールの処理

2011年06月02日
【.forward】から転送されたメールは、
if(($objMail = @fopen("php://stdin", "rb")) == true ){
 while(!feof($objMail)){
  $strLine.= fgets($objMail, 4096);
 }
}
@fclose($objMail);
で読み込むことができます。

上のソースだと、$strLine にはメールヘッダも本文も、全てが取り込まれるので、ここから必要な情報を抜き出していくことになります。

ヘッダと本文は、【¥n¥n】と改行コードが2回続くことで区切られています。
【¥n¥n】より前がヘッダ、後ろが本文です。
ちなみに、ヘッダも本文も、メールの改行コードは【¥n】です。

更にヘッダは
 ・
 ・
To: 送信先メールアドレス
Subject: 件名
From: 差出人名 <差出人メールアドレス>
 ・
 ・
のようになっています。1行ずつチェックして、上の形式から必要な情報を取り出します。

メールの差出人を会員などに登録する場合、【差出人メールアドレス】を抜き出し、登録処理を行えばOKです。

【To: 】と【From: 】以降は、
 名前 <メールアドレス>
の場合もあれば、
 <メールアドレス>
の場合も、
 メールアドレス
の場合もあります。

名前、件名などに、日本語が含まれる場合、エンコードされてますから、【mb_decode_mimeheader】でデコードしてください。

メール受信と同時にCGIを実行と合わせれば、【ビジネス羅針盤 ステップメール】を空メール登録に対応させることができます。

サーバー

メール受信と同時にCGIを実行

2011年06月01日
以前からあったほうがいいのかなと思っていた、【ビジネス羅針盤 ステップメール】への空メール登録へ対応してみることにしました。
空メールだけでなく、本文に姓名が書いてあれば、名前も登録されるようにしたいと思います。

これを実現するためには、メールを受信したらCGIを実行する、という設定がサーバーに必要になります。
この設定ができるものに、【aliases】、【procmail】、【.forward】ファイルがあるようです。
レンタルサーバーで一番使われているのが、【.forward】ファイルのようなので、ここでは【.forward】ファイルで試してみることにします。
しかしサーバーによっては、セキュリティ上設定を許可していないものもあるようです。

設定は簡単で、
【"| phpのパス -q 実行したいCGIのパス"】
となります。

【"| /usr/local/bin/php -q /usr/home/xxx/yyy/run.php"】
のようになります。
ご自分のサーバーの環境に合わせてパスは変更してください。
これでメール受信と同時に【run.php】が実行されます。

【.forward】ファイルはメールの転送を設定するファイルですが、転送先にCGIファイルを指定すると、プログラムを実行できるようになります。

【.forward】で転送を設定する場合は、無限転送にならないように十分注意してください。永遠にメールが転送され続け、サーバーに無駄で過大な負荷がかかることになります。

サーバー

パラメータ(クエリ)の付いたURLをRewriteRuleを使ってアクセス制御

2009年09月30日
再度、RewriteRuleを使ってアクセス制御の必要に迫られました。

今度は、URLにパラメータ(クエリ)が付いています。

色々やってみたのですが、うまくいきません。
やっとたどり着いたのが、サーバー変数です。

例えば、
http://sample.ooo/sample.html?id=ABCD

http://sample.ooo/sample/sample.php?id=ABCD
へ飛ばしたいときは

--------------------------------------------------------------------
RewriteEngine on
RewriteRule ^sampel\.html$ /sample/sample.php?query=%{QUERY_STRING} [L]
--------------------------------------------------------------------

です。

ただ、
http://sample.ooo/sample.html?id=ABCD&code=EFGH

http://sample.ooo/sample/sample.php?id=ABCD
となります。


このほかにも便利なサーバー変数が色々あります。

こねくり回して、やっと思う動きを実現できました。

サーバー

RewriteRuleを使ってアクセス制御

2008年11月25日
以前から自分のブログを見て気がついていたのですが、例えば、
http://sample.xxx/sub_dir/
へアクセスすると、sub_dirは存在しないのに、きちんとページが表示されています。

これは一体どういう仕組みなのでしょう。

始めは、
http://sample.xxx/index.php
など、トップディレクトリのインデックスファイルでアクセスを制御しているのかと考えました。が、これでは制御できない気がします。


となると、http://sample.xxx/ へアクセスを制御するファイルをおき、特定のディレクトリやファイルへのアクセスを、別のファイルへ飛ばしているのでしょう。

そしてそれは多分【.htaccess】ファイルです。


自分のブログを調べると、ありました。【.htaccess】。
中身を見ると、なにやら書いてあります。わからないので、ネットで調べてみました。

やはり、思ったとおりです。【RewriteRule】を使えばよいそうです。サーバーがApacheなら使えます。

--------------------------------------------------------------------
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?file=$1 [L,QSA]
--------------------------------------------------------------------

これを【.htaccess】に書き込み、http://sample.xxx/ へおきます。
http://sample.xxx/sub_dir
にアクセスかあると、http://sample.xxx/index.php?file=sub_dir へとばすことができます。

あとは、index.phpで$fileの値を調べ、表示するページを作ればOKです。


RewriteRule
が参考になります。


また1つ勉強になりました。
2017年08月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
先月
来月
カテゴリ
検索
関連サイト
プロフィール
【ネットネーム】
みゅー

キャラクター by ツカエルサイト


【趣味】
・プログラミング
・写真
・楽器演奏
・手芸
・日曜大工
・家の中の不便を便利に
・考える
・自然科学
・猫と戯れる
・ジグソーパズル

【仕事】
・派遣社員でSE・PGやっていました。次の良い仕事がみつからないので、ビジネスへ注力しようと思っています。
・経験言語:VB6、VB.NET、PHP、Perl、JAVA、Oracle、SQLServer、PostgreSQL



【名前】
アン(足)

2014年4月22日生まれ 女の子
あだ名は くノ一
普段は普通にしゃべりますが、興奮すると『ニャ』を連発します

【趣味】
・狩
・ご飯を食べる
・ママのお手伝い

【仕事】
ママのビジネスの看板招き猫
ママの代わりにPC入力
仕事中のママの右腕を温める
ママに心配をかける
いろんな事をしでかしてママを退屈させない

RSSフィード